10
10

StateMachineBehaviour 클래스

애니메이터 컨트롤러 내에 있는 애니메이션 상태에 연결하여
사용자 정의 동작을 생성할 수 있도록 도와주는 Unity의 기본 클래스이다.

언제 사용하나?

특정 애니메이션 상태에서 내가 원하는 동작이 이루어지도록
스크립트를 작성하여 조정할 때, 부모(base) 클래스로 사용한다.

작성한 스크립트는 오브젝트에 컴포넌트로 부착하는 것이 아니라,
내가 스크립트로 조정하길 원하는 특정 애니메이션 상태에 붙인다.

클래스 내 Callback 함수

  • OnStateEnter: 해당 상태가 시작될 때 호출
  • OnStateUpdate: 첫 프레임과 마지막 프레임을 제외한 각 프레임 단위로 호출
  • OnStateExit: 해당 상태가 종료될 때 호출
  • OnStateMove: MonoBehaviour.OnAnimatorMove 직후에 호출
  • OnStateIK: MonoBehaviour.OnAnimatirIK 직후에 호출

OnAnimatorMove?
애니메이터에서 루트 모션의 적용 방식을 변경하는 이벤트 메서드,
원하는대로 루트 모션을 적용하여 이동과 회전을 개별적으로 적용할 수 있다.

OnAnimatorIK?
IK정보가 갱신될 때마다 유니티는 OnAnimatorIK 메세지를 부린다.
애니메이터 컴포넌트가 붙어있는 오브젝트에서 이 이벤트 메서드를 동작시킬 수 있다.

IK?
어떤 위치를 중심으로 관절의 위치를 역계산하는 것으로
물체의 위치가 어디든지 설정한 중심 위치에 맞춰서
시선이나 팔의 위치를 결정해야할 때 사용한다.

예제 코드

예를 들어 특정 애니메이션 상태에서 캐릭터의 체력을 채우는 스크립트를 만든다고 하면, 아래처럼 할 수 있다.
using UnityEngine;

public class HealthRechargeBehavior : StateMachineBehaviour
{
    // Reference to the character's health script or health component
    public HealthScript healthScript;

    // The amount of health to recharge per second
    public float rechargeRate = 10f;

    // Called when the animation state is entered
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        // Start recharging health
        healthScript.StartRecharge(rechargeRate);
    }

    // Called when the animation state is exited
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        // Stop recharging health
        healthScript.StopRecharge();
    }
}
위에서 OnStateEnter가 호출될 때(=해당 애니메이션 상태에 들어가면) 체력이 충전될 것이다.

OnStateExit가 호출될 때(=해당 애니메이션 상태가 종료되면) 체력 중전이 멈출 것이다.
COMMENT