TIL_2025_03_11 StateMachineBehaviour

김효중·2025년 3월 11일

개요. StateMachineBehaviour

StateMachineBehaviour는 애니메이션의 State에서 특정 이벤트가 발생할 때 자동으로 호출 되는 함수를 사용할 수 있는 특별한 클래스이다.
이 클래스는 MonoBehaviour를 상속 받지 않으며 오브젝트에 추가하지 않고 애니메이션의 State에 추가한다.

구성 - State

StateMachineBehaviour는 애니메이션의 State와 StateMachine에 대해 특정한 시점에서 호출되는 함수들로 이루어져있다.
이를 사용하기 위해서는 다른 클래스에 StateMachineBehaviour를 상속시켜야한다.
다음의 함수에서 각각의 매개변수는 다음의 의미를 갖는다

  • animator : 현재 애니메이션을 실행하는 animator
  • stateInfo : 현재 state의 애니메이션의 정보(해시값, 길이, 진행 비율등)
  • layerIndex : 현재 애니메이션의 레이어 인덱스

OnStateEnter

public virtual void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }

애니메이션의 State에 진입한 순간에 호출 된다.
초기화 혹은 시작시 실행할 코드에 사용한다.

OnStateUpdate

public virtual void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }

해당 State가 실행되는 매 프레임마다 호출된다.
Update와 비슷하지만 애니메이션 실행 상태에서만 호출 된다.

OnStateExit

public virtual void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }

해당 애니메이션 State의 종료 직전에 호출된다
종료시 초기화나 정리코드를 실행할 때 사용한다.

OnStateMove

public virtual void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }

애니메이션이 Root Motion을 적용하고 있고 Animator의 Apply Root Motion이 켜져 있어야 동작한다.

OnStateIK

public virtual void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }

애니메이션에서 Inverse Kinematics (IK)를 사용할 때 호출된다.
특정 상태에서 손,발의 위치를 조정할 때 사용한다.

구성 - StateMachine

OnStateMachineEnter

public virtual void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
    {
    }

StateMachine에 진입한 순간에 호출된다.
StateMachine의 다른 State별로 진입한 순간이 아닌 StateMachine에 처음 진입한 순간에만 호출된다.
OnStateEnter처럼 초기화시 사용할 수 있다.

OnStateMachineExit

public virtual void OnStateMachineExit(Animator animator, int stateMachinePathHash)
    {
    }

StateMachine에서 탈출하였을 때 호출된다.
StateMachine 내부는 상관없이 벗어난 순간에 호출된다.

AnimatorControllerPlayable controller

위 함수의 뒤에 controller 매개변수를 추가하여 호출하는 방식도 있다.
이는 controller를 사용해 애니메이션의 상태를 직접 변경할 수 있다.
Playables API를 활용할 때 필요하다.

사용법


public class StateView : StateMachineBehaviour
{
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        if (updateOnState)
        {
            Debug.Log("OnStateEnter");
        }
    }
    public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("애니메이션 진행 중: " + stateInfo.normalizedTime);
    }
    // OnStateExit는 해당 상태에서 빠져나갈 때 호출됩니다.
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        if (updateOnState)
        {
            Debug.Log("OnStateExit");
        }
    }
}

위와 같이 StateMachineBehaviour를 상속 받은 클래스를 만들고 사용할 함수를 override를 사용하여 구현한다.

이후 애니메이션 State 혹은 StateMachine에 새로 만든 클래스를 추가한다.

성공시 호출 시점에 따라 코드가 실행된다.

profile
도전하는 개발자

0개의 댓글