오늘 한 일
이렇게 전체적인 구조를 완료했습니다.
오늘의 트러블 슈팅
오늘의 트러블 슈팅은 캐릭터 애니메이션을 추가하고 작동하는 과정에서 문제가 생겼습니다.
처음 상황:
Move 스프라이트는 기본이 “왼쪽”을 보고 있음
Idle 상태 + 무기 회전 = 마우스 방향대로 잘 동작 ✅
그런데 이동(달리기) 모션에서 캐릭터가 “키보드 입력 반대 방향”을 보면서 뛰는 문제
나중에는 또 이동 방향은 맞는데 Idle에서 마우스 반대 방향을 보고, 무기가 마우스를 안 따라가는 문제까지 발생
1단계. Rotate가 무조건 lookDirection만 쓰고 있던 문제
“캐릭터가 이동할 때도 무조건 lookDirection(마우스)을 기준으로 회전해서,
달리는 방향( movementDirection )과 flip 기준이 안 맞는다”
했던 수정
원래 Update():
protected virtual void Update()
{
HandleAction();
Rotate(lookDirection); // ← 항상 lookDirection만 사용
HandleAttackDelay();
}
이거를
protected virtual void Update()
{
HandleAction();
if (movementDirection.sqrMagnitude > 0.01f)
Rotate(movementDirection); // 이동 중이면 이동 방향 기준
else
Rotate(lookDirection); // 멈추면 마우스 방향 기준
HandleAttackDelay();
}
이렇게 바꿨습니다.
🎯 의도
이동 중: movementDirection 기준으로 flip
Idle: lookDirection 기준으로 flip
무기는 계속 lookDirection 기준으로 회전
🔎 결과
이동 쪽이 여전히 이상함 →
“값이 잘못 들어오나?” 싶어서 다음 단계로.
2단계. movementDirection 값 디버그
가설 2
“혹시 movementDirection 값이 반대로 들어오나?”
했던 수정
Movement() 안에 로그 추가:
protected virtual void Movement(Vector2 direction)
{
Debug.Log("movementDirection.x = " + direction.x);
direction = direction * statHandler.Speed;
...
}
결과
왼쪽 키 → movementDirection.x = -1
오른쪽 키 → movementDirection.x = 1
✅ 값은 정상.
즉, “입력 값이 반대”는 아님 → flip 로직/다른 쪽을 의심해야 함.
3단계. Animator / AnimationClip이 flip을 덮어쓰는지 의심
가설 3
“Animator나 Animation Clip에서 Scale.x 또는 SpriteRenderer.flipX를 keyframe으로 잡고 있어서,
코드에서 flip을 바꿔도 다음 프레임에 애니메이션이 덮어쓰는 거 아닐까?”
확인
Animator 창, Animation 창 스샷 확인
Move / Idle 애니메이션 Dopesheet에서 Scale, Rotation, Position 키프레임 여부 확인
결과
Sprite 키프레임만 있고 Scale/Rotation 키프레임 없음
→ 애니메이션이 flip을 강제로 덮어쓰는 건 아님 ❌
Animator/AnimationClip 쪽 가설은 기각.
4단계. Transform Scale / SpriteRenderer Flip X/Y 의심
가설 4
“혹시 Hierarchy에서 오브젝트 자체를 Scale.x = -1, 혹은 Flip Y 같은 걸로 미리 뒤집어 놓고 시작한 거 아닐까?”
확인한 것
MainSprite의 Transform:
Scale = (1, 1, 1) → 정상
SpriteRenderer:
Flip X = false
Flip Y = false
결과
오브젝트 자체가 위/아래/좌우로 미리 뒤집혀있는 상태는 아님
→ 이것도 아님 ❌
5단계. “기본 스프라이트 방향” 문제 발견 → 이동 flip 해결
여기서 중요한 진실이 나옴:
현재 스프라이트의 “기본 그림” 자체가 전부 왼쪽을 보고 있다.
우리가 처음에 flip 로직을 짤 때는
기본이 오른쪽이라고 생각하고
isLeft = direction.x < 0f;
characterRenderer.flipX = isLeft;
같은 구조를 썼음.
하지만 실제로는:
flipX = false → “왼쪽 바라보는 기본 그림”
flipX = true → “그 그림을 뒤집어서 오른쪽 보기”
인데,
로직이 “오른쪽 기본” 기준으로 되어 있었으니 이동할 때 반대로 보이는 것.
if (movementDirection.sqrMagnitude > 0.01f)
{
flipX = movementDirection.x > 0f; // 오른쪽이면 flipX = true, 왼쪽이면 false
}
이걸로:
왼쪽 이동(x<0) → flipX = false → 기본 그림(왼쪽)
오른쪽 이동(x>0) → flipX = true → 오른쪽으로 뒤집힘
🔎 결과
✅ 이동(달리기) 방향은 완전히 정상으로 해결됨.
하지만작용: Idle에서 마우스 보는 방향/무기 회전이 꼬이기 시작.
6단계. 무기 회전 / Idle에서 마우스 방향 문제 → lookDirection 미갱신 발견
이 시점에서 증상:
이동 방향은 정상
Idle 상태일 때
캐릭터가 마우스 반대 방향을 봄
무기가 마우스를 제대로 안 따라감
가설
“무기와 Idle 방향은 lookDirection 기준인데,
혹시 lookDirection 값이 (0,0) 이거나, 제대로 계산이 안 되고 있는 거 아닐까?”
protected Vector2 lookDirection = Vector2.zero;
public Vector2 LookDirection { get { return lookDirection; } }
lookDirection을 어디에서도 갱신하지 않고 있었음
즉, 계속 (0,0) 상태.
해결: HandleAction()에서 lookDirection 업데이트 추가
protected virtual void HandleAction()
{
Vector3 mouseWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition);
mouseWorld.z = 0f;
lookDirection = (mouseWorld - transform.position).normalized;
}
이걸로:
lookDirection = 플레이어 → 마우스 방향 벡터
결과
무기 회전( rotZ )이 마우스 방향을 제대로 따라가기 시작 ✅
Idle에서 flip은 아직 반대로 보이는 상태 ❌
7단계. Idle flip 조건 미세 조정 → 최종 해결
이제 Rotate에서 flip 로직은 이렇게 되어 있었음:
protected virtual void Rotate(Vector2 direction)
{
float rotZ = Mathf.Atan2(lookDirection.y, lookDirection.x) * Mathf.Rad2Deg;
bool flipX;
if (movementDirection.sqrMagnitude > 0.01f)
{
flipX = movementDirection.x > 0f; // ← 이동 중은 해결됨
}
else
{
Vector2 mouseWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition);
float deltaX = mouseWorld.x - transform.position.x;
flipX = deltaX > 0f; // ← 여기 때문에 Idle에서 반대로 보였음
}
characterRenderer.flipX = flipX;
...
}
여기서 핵심은:
기본 스프라이트는 “왼쪽”을 보고 있음
우리가 world 기준으로
마우스가 캐릭터 오른쪽에 있으면 → deltaX > 0
마우스가 캐릭터 왼쪽에 있으면 → deltaX < 0
근데, 기본 방향이 왼쪽이기 때문에:
마우스가 왼쪽(기본 방향) → flipX = false
마우스가 오른쪽 → flipX = true
여야 자연스럽게 맞는데,
우리는 flipX = deltaX > 0f 로 해서
부호/기준이 꼬여 Idle에서 반대로 보이는 상황이었음.
else
{
Vector2 mouseWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition);
float deltaX = mouseWorld.x - transform.position.x;
// 🔥 Idle일 때 flip 조건 반대로!
flipX = deltaX < 0f;
}
🔎 결과
Idle 상태에서:
마우스가 캐릭터 왼쪽 → deltaX < 0 → flipX = true/false? (기본 방향에 맞게 동작)
마우스가 오른쪽 → deltaX > 0 → flipX 반대 값 → “마우스가 있는 쪽”을 정확히 바라봄
이동 / Idle / 무기 회전 모두 정상 작동 ✅
결론
문제 정의
Idle + 무기는 정상 → 이동 시 방향 반대
Rotate가 무조건 lookDirection만 쓰던 것 발견 → 이동/Idle 기준 분리
movementDirection 디버그로 입력 값 정상 확인
Animator/Animation Clip/Scale/Flip X/Y 의심 → 하나씩 기각
스프라이트 기본 방향(왼쪽) vs flip 조건(오른쪽 기준) 불일치 발견 → 이동 flip 해결
lookDirection이 업데이트조차 안 되고 있던 것 발견 → HandleAction에서 갱신
Idle flip이 여전히 반대 → deltaX 기준 flip 조건을 < 0로 반대로 수정
✅ 최종적으로 이동, Idle, 무기 회전까지 모두 정상