본문 바로가기

[Unity] 애니메이션 진행 중인지 확인하기

Kwonriver 2023. 1. 11.
728x90

 

애니메이션이 진행 중인지 확인하는 기능은 여러 상황에서 사용하게 된다. 공격 애니메이션이 끝났는지, 죽는 모션이 끝났는지 등등 특정 애니메이션이 종료된 이후 처리해야할 기능들이 여럿 있기 때문이다. 간단하게 animator.isPlaying 같은 함수가 있으면 좋겠으나 기본적으로는 없기 때문에 유니티에서 애니메이션이 현재 플레이 중인지 확인하는 코드를 추가해보자.

 

{
    Animator anim;
    
    void Awake()
    {
        anim = GetComponent<Animator>();
    }
    
    void Update()
    {
        ...
        
        // 현재 애니메이션이 체크하고자 하는 애니메이션인지 확인
        if(anim.GetCurrentAnimatorStateInfo(0).IsName("애니메이션 이름") == true)
        {
            // 원하는 애니메이션이라면 플레이 중인지 체크
            float animTime = anim.GetCurrentAnimatorStateInfo(0).normalizedTime;
            if(animTime == 0)
            {
                // 플레이 중이 아님
            }
            if(animTime > 0 && animTime < 1.0f)
            {
                // 애니메이션 플레이 중
            }
            else if(animTime >= 1.0f)
            {
                // 애니메이션 종료
            }
        }
        
        ...
    }
}

 

애니메이션이 플레이 중인지 확인하기 위해서 먼저 애니메이션 상태 정보를 가져와야 한다. GetCurrentAnimatorStateInfo 함수는 Animator 클래스에 존재하는 함수로 매개변수로 넘어온 레이어인덱스의 애니메이션 상태 정보를 넘겨준다. 함수의 원문은 아래와 같고 AnimatorStateInfo에는 아래와 같은 변수들이 포함되어 있다.

public AnimatorStateInfo GetCurrentAnimatorStateInfo(int layerIndex);

출처 : 유니티

 

AnimatorStateInfo의 normalizedTime은 정규화된 시간으로 0부터 1사이의 값을 가진다. 따라서 이 값을 이용하여 현재 플레이 정보를 판단할 수 있다. 다만 위의 방법은 루프가 아닌 애니메이션에서만 체크가 가능하다. 루프 애니메이션의 경우 최초 1회에는 0에서 시작해 점차 커지지만 2번째 루프 애니메이션에서는 normalizedTime이 0으로 초기화되지 않고 계속 더해진다. 즉, 1보다 큰 값이 있을 수 있다.

728x90