코딩의 신 45

김동관·2025년 12월 4일

오늘 한 일

맵/사운드/통합 담당

  • 장애물끼리 겹침 체크
  • 플레이어 프리팹에 캐릭터(세실리) 스프라이트 적용
  • 씬 통합 완료 및 정상 연동&작동 확인
  • 사운드 싱크 조절
  • 빌드 세팅 (해상도, 전체화면)
  • 전체 통합 빌드 테스트

이렇게 전체적인 구조를 완료했습니다.

  • 플레이어 전투 OK
  • 적 스폰 OK
  • 경험치 → 레벨업 → 강화 OK
  • 보스 등장 및 처치 가능 OK
  • 보스 처치 시 게임결과 창 이동
  • 결과창 OK
  • 메인-캐릭터-게임-게임오버 씬 전환 OK
  • 사운드 이상 없음
  • 에러 콘솔 비어 있음
  • 5분짜리 MVP 플레이 가능 & 코어 루프 정상 확인

오늘의 트러블 슈팅

오늘의 트러블 슈팅은 캐릭터 애니메이션을 추가하고 작동하는 과정에서 문제가 생겼습니다.

  1. 초기 증상 정리

처음 상황:

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, 무기 회전까지 모두 정상

profile
아이디어 뱅크

0개의 댓글