애니메이션 재생 중인지 확인하기
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;
'🌍 Unity > 애니메이션, 연출' 카테고리의 다른 글
유니티 타임라인 루트모션 제거하기 Unity Timeline remove Rootmotion (0) | 2025.01.08 |
---|---|
유니티 VideoPlayer 실행 오류 (2) | 2020.05.25 |
유니티 타임라인 Unity Timeline (0) | 2019.06.07 |
유니티 메카님 Has Exit time 트렌지션 ( Unity Animation Exit time Transition interrupt ) (0) | 2019.01.04 |
유니티 애니메이션 루트모션 (0) | 2018.12.24 |