1. 오늘 주제
애니메이터에서 AnimatorStateInfo를 통해 현재 재생중인 애니메이션 클립이 얼만큼 재생중인지 확인하는 방법에 대해 남겨본다.
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
if (stateInfo.fullPathHash == AttackStateHash &&
stateInfo.normalizedTime >= 1.0f &&
!animator.IsInTransition(0))
{
Debug.Log("Attack 애니메이션 재생이 완료되었습니다!");
}
핵심 포인트
- stateInfo.fullPathHash 또는 IsName("StateName")
- 현재 재생 중인 애니메이션 스테이트가 어떤 것인지 식별하기 위해 사용한다.
- IsName("Base Layer.Attack") 형태로도 쓸 수 있고, 해시를 미리 캐싱(StringToHash)해두면 성능상 이점이 있다.
- stateInfo.normalizedTime >= 1.0f
- normalizedTime이 1 이상이 되면 이 애니메이션이 한 번 재생 완료되었다는 뜻이다.
- 루프 애니메이션이 아니라면 이 값을 체크해서 재생 종료 시점을 잡을 수 있다.
- !animator.IsInTransition(0)
- 애니메이션이 다른 상태로 전환 중이면, normalizedTime 값이 1 이상이어도 완전히 끝난 것은 아닐 수 있다.
- 전환(Transition) 없이 확실히 종료되었는지 확인하기 위해 추가로 체크하는 편이 좋다.
루프 애니메이션 클립인 경우
루프로 재생되는 클립인경우에는 normalizedTime 값이 1 이상으로 계속 증가하게 된다. 즉 >= 1.0f 비교로는 끝났다고 볼 수는 없다.
- 루프 애니메이션 클립은 완료가 없으므로 정확한 타이밍의 이벤트를 잡아서 사용하려면 Animation Event나 StateMachineBehaviour.OnStateExit를 활용 해야 한다.