[TIL] 유니티 AnimatorStateInfo.normalizedTime

Dreamer·2024년 12월 23일

1. 오늘 주제

애니메이터에서 AnimatorStateInfo를 통해 현재 재생중인 애니메이션 클립이 얼만큼 재생중인지 확인하는 방법에 대해 남겨본다.

// 1) 현재 재생 중인 스테이트 정보 가져오기
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);

// 2) 특정 스테이트(Attack)가 맞는지, 그리고 재생이 끝났는지 확인
if (stateInfo.fullPathHash == AttackStateHash && 
	stateInfo.normalizedTime >= 1.0f && 
    !animator.IsInTransition(0))
    {
    	Debug.Log("Attack 애니메이션 재생이 완료되었습니다!");
    }

핵심 포인트

  1. stateInfo.fullPathHash 또는 IsName("StateName")
  • 현재 재생 중인 애니메이션 스테이트가 어떤 것인지 식별하기 위해 사용한다.
  • IsName("Base Layer.Attack") 형태로도 쓸 수 있고, 해시를 미리 캐싱(StringToHash)해두면 성능상 이점이 있다.
  1. stateInfo.normalizedTime >= 1.0f
  • normalizedTime이 1 이상이 되면 이 애니메이션이 한 번 재생 완료되었다는 뜻이다.
  • 루프 애니메이션이 아니라면 이 값을 체크해서 재생 종료 시점을 잡을 수 있다.
  1. !animator.IsInTransition(0)
  • 애니메이션이 다른 상태로 전환 중이면, normalizedTime 값이 1 이상이어도 완전히 끝난 것은 아닐 수 있다.
  • 전환(Transition) 없이 확실히 종료되었는지 확인하기 위해 추가로 체크하는 편이 좋다.

루프 애니메이션 클립인 경우

루프로 재생되는 클립인경우에는 normalizedTime 값이 1 이상으로 계속 증가하게 된다. 즉 >= 1.0f 비교로는 끝났다고 볼 수는 없다.

  • 루프 애니메이션 클립은 완료가 없으므로 정확한 타이밍의 이벤트를 잡아서 사용하려면 Animation Event나 StateMachineBehaviour.OnStateExit를 활용 해야 한다.
profile
새로운 시작

0개의 댓글