[내일배움캠프] Animator.GetCurrentAnimatorStateInfo(0)의 불편한 점

이준영·2025년 7월 2일
post-thumbnail

오늘은 공격 애니메이션을 수정하던 중 내가 작성한 콤보 어텍 상태에 문제가 있던 점을 찾게 되어서 그에 대해서 정리해 보기로 하였다.

문제 발생

개선하기 전에 애니메이션의 시간을 가져오는 코드이다.

이전 코드
  • 코드를 간단하게 설명하자면,
  1. comboIndex를 이용하여 현재 진행할 공격의 데이터를 가져오기

  2. 무기에 공격력에 해당 공격의 배수를 곱해서 전달

  3. 해당 공격 애니메이션을 실행

  4. 애니메이션이 실행이 끝나면 다음 상태로 넘겨야 하기 때문에 _animationTime에 현재 진행 중인 애니메이션 길이를 전달

  • 이렇게 작성 되어 있었는데, 이번에 마지막 공격의 시간이 1.35초로 굉장히 길게 만들어졌는데, 중간에 너무 빠르게 끈어지게 되었다.

문제 원인

Animator
  • Attack3가 다 끝나지 않았는데, 먼저 나가는 모습.

  • 시간 측정 부분에는 문제가 없어서 _animationTime을 Debug.Log로 찍어 보았다.

_animtionTime Debug
  • 예상대로면
    attack Index : 1, animTime : 0.85
    attack Index : 2, animTime : 0.85
    attack Index : 3, animTime : 1.35
    이렇게 찍혀야 하지만 시간이 다르게 출력 되었다.

  • 찍힌 애니메이션의 시간은 내가 원하는 현재 애니메이션이 아니라 이전 애니메이션 시간이라는 것을 알게 되었다.

문제 해결

문제를 해결하면서 3개의 해결 방법을 찾았는데, 조금 마음에 들지 않은 방식들을 몇개 찾았다.

  1. Coroutine으로 텀을 줘서 현재 애니메이션의 시간을 가져오기
예시
  • 0.5초의 텀을 두어 애니메이션의 시간을 뒤늦게 가져오는 방법이다.

  • 꼼수에 가까운 방법이고 만약 애니메이션 길이가 0.3초 밖에 안된다면 당연히 오류가 발생하기 때문에 이 방법은 사용하지 않기로 하였다.

  1. 모든 애니메이션 클립의 정보를 가져와 이름으로 조회해서 길이를 가져오기
예시
  • 애니메이션 이름이 Attack1, Attack2, Attack3 이런식으로 작성되어 있다면 가능한 방식이다.

  • 나는 우연히 그렇게 이름이 되어 있어서 가능했지만, 사실 하드코딩에 가까운 방식이라 좀 지양하게 되었다.

  1. _attackInfo에 애니메이션 길이를 저장해서 가져오기
예시
  • 애니메이션 클립을 직렬화 방식으로 ScriptableObject에 넣어주고 해당 애니메이션의 길이를 리턴하는 방식으로 작성하였다.

  • 가장 하드코딩에 벚어난 방법이고 코드 가독성이 좋아 보여서 채택하였다.

소감

이런 버그 투성이

profile
게임 개발자가 되기 위해서 공부하는 중입니다.

0개의 댓글