
StateMachineBehaviour는 애니메이션의 State에서 특정 이벤트가 발생할 때 자동으로 호출 되는 함수를 사용할 수 있는 특별한 클래스이다.
이 클래스는 MonoBehaviour를 상속 받지 않으며 오브젝트에 추가하지 않고 애니메이션의 State에 추가한다.
StateMachineBehaviour는 애니메이션의 State와 StateMachine에 대해 특정한 시점에서 호출되는 함수들로 이루어져있다.
이를 사용하기 위해서는 다른 클래스에 StateMachineBehaviour를 상속시켜야한다.
다음의 함수에서 각각의 매개변수는 다음의 의미를 갖는다
public virtual void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
}
애니메이션의 State에 진입한 순간에 호출 된다.
초기화 혹은 시작시 실행할 코드에 사용한다.
public virtual void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
}
해당 State가 실행되는 매 프레임마다 호출된다.
Update와 비슷하지만 애니메이션 실행 상태에서만 호출 된다.
public virtual void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
}
해당 애니메이션 State의 종료 직전에 호출된다
종료시 초기화나 정리코드를 실행할 때 사용한다.
public virtual void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
}
애니메이션이 Root Motion을 적용하고 있고 Animator의 Apply Root Motion이 켜져 있어야 동작한다.
public virtual void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
}
애니메이션에서 Inverse Kinematics (IK)를 사용할 때 호출된다.
특정 상태에서 손,발의 위치를 조정할 때 사용한다.
public virtual void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
{
}
StateMachine에 진입한 순간에 호출된다.
StateMachine의 다른 State별로 진입한 순간이 아닌 StateMachine에 처음 진입한 순간에만 호출된다.
OnStateEnter처럼 초기화시 사용할 수 있다.
public virtual void OnStateMachineExit(Animator animator, int stateMachinePathHash)
{
}
StateMachine에서 탈출하였을 때 호출된다.
StateMachine 내부는 상관없이 벗어난 순간에 호출된다.
위 함수의 뒤에 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에 새로 만든 클래스를 추가한다.

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