전체 글 (623)

2025
02.13

 

애니메이션 재생 중인지 확인하기

Animator에서 GetCurrentAnimatorStateInfo(레이어번호)를 사용하여 AnimatorStateInfo를 가져온 뒤, 

이를 활용해 원하는 애니메이션이 맞는지 확인할 수 있다.

 

  • Hash 값을 사용할 경우 → shortNameHash를 비교
  • 문자열로 확인할 경우 → AnimatorStateInfo의 IsName(애니메이션 이름) 함수 사용

 

트랜지션 중이라면 

  • 현재 애니메이션: GetCurrentAnimatorStateInfo(0)
  • 전환 중인 애니메이션: GetNextAnimatorStateInfo(0)

이 둘 중 하나에서 원하는 애니메이션을 확인할 수 있다.

나는 특정 애니메이션이 아닌 현재 어떤 애니메이션이든 재생 중인지 확인하고 싶어 아래와 같이 구현했다.

public bool IsAnimationPlaying(int hash)
{
    AnimatorStateInfo currentInfo = _animator.GetCurrentAnimatorStateInfo(0);
    if (currentInfo.shortNameHash == hash)
        return true;

    AnimatorStateInfo nextInfo = _animator.GetNextAnimatorStateInfo(0);
    if (nextInfo.shortNameHash == hash)
        return true;

    return false;
}

 

주의할 점

애니메이션은 재생을 요청한 다음 프레임에서 갱신되므로, 반드시 한 프레임 이상 대기한 후 체크해야 한다.

 

Play, CrossFade(0f), CrossFade(0.1f) 전부 다 같은 프레임에서는 검출이 보장되지 않는다. 

 

내 경우, BT 노드가 시작될 때 애니메이션을 재생하고,
Update에서 해당 애니메이션이 재생 중이 아니면 실패를 반환하도록 설계했다.

이를 위해 한 프레임을 대기할 수 있도록 별도의 플래그를 추가했다.

// 해당 애니메이션이 재생중이거나 트랜지션 중이지 않음 
// 재생한 같은 프레임에서는 검출 안되니 주의
if (_didFirstFrame && !AnimatorController.IsAnimationPlaying(_animationHash))
    return TaskStatus.Failure;

_didFirstFrame = true;