
1단계 첫 항목인 캐릭터 컨트롤러부터 시작. 이동은 뱀서 프로젝트 때 익힌 Input System 방식을 재사용했고, 중간에 Sprint 버튼이 뗄 때 반응 안 하는 버그를 실측으로 잡음. 마우스 조준 방향을 어떻게 캐릭터에 반영할지 설계를 두 번 갈아엎었고, 최종적으로는 사진 기반 캐릭터라는 제약에 맞춰 좌우 반전 + 조준 방향값 분리 구조로 정리함.
뱀서 프로젝트 노트에 이미 Rigidbody2D 기반 이동 패턴이 정리돼 있어서 그대로 재사용. 다만 뱀서는 생존 게임이라 관성 있는 이동(AddForce/MovePosition)이었고, 우리는 PvP 대전이라 반응성이 더 중요하다고 판단해서 velocity 직접 대입 방식으로 바꿈.
private void FixedUpdate()
{
float currentSpeed = isRunning ? runSpeed : walkSpeed;
rigid.linearVelocity = inputVec * currentSpeed; // 관성 없이 즉시 반응
}
Shift를 누르면 달리기 상태로 바뀌는데, 떼도 계속 달리기 속도가 유지되는 버그 발생. 처음 세운 가설은 "바인딩에 Press Only 인터랙션이 걸려서 release 이벤트가 안 온다"였는데, 확인해보니 Interactions 필드는 비어있었음.
Input Debugger로 keyboard leftShift raw 입력 자체를 찍어보니 눌림/뗌 둘 다 정상 반응 — 즉 OS/디바이스 레벨은 문제없고, Action Type(Button 확인됨), Player Input Behavior(Send Messages 확인됨), 코드(isRunning = value.isPressed 확인됨)까지 전부 정상으로 보였는데도 버그가 남아있었음.
실측으로 뒤집힌 부분: 예상과 반대로, 인터랙션이 아예 없는 상태가 문제였음. Press 인터랙션을 명시적으로 추가하고 Trigger Behavior를 Press And Release로 지정하니 바로 해결됨. Button 타입 액션이라고 해서 인터랙션 없이도 press/release를 항상 안전하게 보장하진 않는다는 걸 확인함 — 처음 가설과 정반대 결론이라 기록해둠.
Sprint 액션 → Left Shift 바인딩 → Interactions에 Press 추가
→ Trigger Behavior: Press And Release
처음엔 마우스 방향을 4방향(상/하/좌/우)으로 스냅해서 Animator의 Direction(Int) 파라미터로 방향별 스프라이트를 전환하는 구조로 짬 (RPG류에서 흔한 방식). 그런데 캐릭터가 실사 고양이 사진 기반이라는 걸 다시 짚고 나서 이 방식을 폐기함 — 사진은 방향별로 새로 찍을 수 없으니, 4방향 스프라이트 자체를 준비할 방법이 없었음.
대신 몸은 좌우 반전만 하고, 정밀한 조준 각도는 투척 아이템(감자/맛동산)이 캐릭터 주변에서 마우스 방향으로 떠 있는 것으로 표현하기로 설계 변경. 이동 방향과 조준 방향을 완전히 분리해서, 조준 벡터는 AimDirection이라는 public 프로퍼티로 노출해두고 나중에 만들 투척 인디케이터 스크립트가 그대로 가져다 쓰도록 함.
public Vector2 AimDirection { get; private set; } = Vector2.right;
private void UpdateAimDirectionFromMouse()
{
Vector3 mouseWorldPos = mainCamera.ScreenToWorldPoint(mouseScreenPos);
mouseWorldPos.z = transform.position.z;
Vector2 rawDir = (Vector2)mouseWorldPos - (Vector2)transform.position;
if (rawDir.sqrMagnitude < 0.0001f) return; // 마우스가 겹치면 이전 방향 유지
AimDirection = rawDir.normalized;
}
로직 자체는 맞는데 실제로 테스트해보니 고양이가 반대 방향을 보고 있었음. 원인은 원본 고양이 사진이 기본적으로 왼쪽을 보고 있는 상태였는데, 코드는 "기본이 오른쪽"이라고 가정하고 짜여있었던 것. 새 이미지를 뒤집어서 다시 넣는 대신, 조건문 부호만 반대로 바꿔서 해결.
// 원본 사진이 기본적으로 왼쪽을 보고 있어서 조건을 반대로 잡음
spriteRenderer.flipX = AimDirection.x > 0f;
앞으로 스킨(고양이 사진)을 추가할 때마다 전부 같은 기본 방향(왼쪽)으로 통일해서 넣어야 한다는 규칙이 생김. 스킨 수가 늘어나면 캐릭터별 isBaseFacingRight 플래그로 관리하는 방식도 고려 중.