C#, Unity

C#, Unity) 애니메이션 GetCurrentAnimatorStateInfo

나무늘보섬 2024. 11. 10. 22:28

 애니메이션을 한번만 재생해야 되는데 애를 먹을 때 찾다가 발견한 애니메이션 관련 함수! 

아래는 관련 기능 설명

 

// 애니메이션 레이어를 사용하지 않는 경우, StateInfo()에 0을 넣어주면 됨.

Animator stateInfo = animator. GetCurrentAnimatorStateInfo(0); 

 

stateInfo.normalizedTime >= 1f;

-> 애니메이션이 1번 재상됐으면 normalizeTime이 1f다. 만약 계속해서 반복되는 경우는 1f를 초과함.

애니메이션이 1번 재생되게 하려면 bool 변수를 추가해서  if문으로 제어

 

stateInfo.length 

-> 애니메이션의 길이를 반환해준다. (단위: 초, float)

 

stateInfo.speed

-> 애니메이션의 재생속도를 반환. (단위: float)

 

stateInfo.speedMultiplier

-> 애니메이션의 속도 조정 비율 (이건 안써봐서 잘 모르겠음...)

 

stateInfo.isLoop

-> 애니메이션이 반복적으로 재생되는지 

-> 결과값이 true면 반복(loop)재생, false면 1번 재생

 

stateInfo.shortNameHash == Animator.StringToHash("애니메이션 이름")

-> 애니메이션의 전체 경로 해시를 가져오는데  사용, 애니메이션이 트리 구조일때 사용

(경로 관련인 것 같은데 안써봐서 잘 모르겠음...)

 

stateInfo.tagHash == Animator.StringToHash("애니메이션 이름")

-> 조건에 해당 애니메이션의 태그를 확인

 

아래는 예시 코드

더보기

// 코드 출처: chatGPT
using UnityEngine;

public class AnimatorStateInfoExample : MonoBehaviour
{
    private Animator animator;

    void Start()
    {
        animator = GetComponent<Animator>();
    }

    void Update()
    {
        // 현재 애니메이션 상태 정보를 가져옴
        AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);

        // normalizedTime: 애니메이션이 끝까지 재생되었는지 확인
        if (stateInfo.normalizedTime >= 1f)
        {
            Debug.Log("애니메이션이 한 번 완료되었습니다.");
        }

        // length: 애니메이션의 길이(초)
        Debug.Log("애니메이션 길이 (초): " + stateInfo.length);

        // speed: 애니메이션 재생 속도 확인
        Debug.Log("애니메이션 재생 속도: " + stateInfo.speed);

        // speedMultiplier: 속도 조정 비율
        Debug.Log("속도 조정 비율: " + stateInfo.speedMultiplier);

        // isLoop: 애니메이션이 루프인지 확인
        if (stateInfo.isLoop)
        {
            Debug.Log("이 애니메이션은 루프 재생됩니다.");
        }
        else
        {
            Debug.Log("이 애니메이션은 한 번 재생됩니다.");
        }

        // shortNameHash: 애니메이션 상태를 확인 (예시: 특정 애니메이션 상태를 실행 중인지)
        if (stateInfo.shortNameHash == Animator.StringToHash("Run"))
        {
            Debug.Log("Run 애니메이션이 재생 중입니다.");
        }

        // fullPathHash: 애니메이션의 전체 경로 해시값
        Debug.Log("애니메이션 전체 경로 해시: " + stateInfo.fullPathHash);

        // tagHash: 애니메이션의 태그 확인
        if (stateInfo.tagHash == Animator.StringToHash("Jump"))
        {
            Debug.Log("Jump 태그가 있는 애니메이션이 재생 중입니다.");
        }
    }
}