Unity Engine/Unity Common

애니메이션 스테이트 체크 타이밍

Muru 2023. 10. 20. 11:21
WaitUntil은 코루틴과 함께 매우 유용한 도구

특정 조건이 참이 될 때까지 실행을 일시 중단한다. 위에 경우는 특정 애니메이션이 끝나거나
상태 변화를 체크하며 기다리는 상황에서 유용하게 사용 될것 같다.

But

WaitUntil은 매 프레임마다 검사되어 성능문제가 일어날 수 있고, 무한 루프의 위험이 있으니 조심해서 사용하자.

참고로 normalized >= 1.0f의 뜻은

진행 상태 0.0 (시작)에서 (완료)1.0 사이의 값으로 반환된다.

 

=========================

 

ScritableObject로 애니메이션 호출하는 방식인데

첫번째 애니메이션"Player_Skill05_1"이 끝나면 "Player_Skill05_2" 애니메이션이
작동할수있도록 하고있었으나 작동이 되지않았다. 

"Player_Skill05_2" 에서 "Player_Skill05_3"으로는 WaitUntil을 통해
잘 대기하다 작동이 되었는데...

왜 안될까?

 

문제는

 

애니메이션 스테이트 체크의 타이밍 문제였다.

 

GetCurrentAnimatorStateInfo(0)는 때때로 애니메이션의 상태를 체크하는 것이 예상보다 빠르기 때문에, 원하는 애니메이션 상태로 전환되기전에 체크가 이루어질 가능성이 있는 것이다.

 

    public void ActivateSkill()
    {
        animator.Play("Player_Skill05_1");	// 이곳에 추가
        StartCoroutine(ExeCuteJump());
    }
    
     private IEnumerator ExeCuteJump()
    {
        ActivateMeshes();
        animator.Play("Player_Skill05_1");	// 이곳도 추가
}

그래서 "Player_Skill05_1"에 어떤 애니메이션을 넣든, 어느 위치에 animator.Play를 집어넣어도

"Player_Skill05_2" 로의 전환이 안 된 것이다.

 

해결을 하는 방법은 Animation의 StateCheck Timing 이름에 있다. 살짝의 딜레이를 준다.

 

yield return new WaitForSeconds(0.1f) 살짝의 딜레이를 주면 해결완료