この記事でのバージョン
Unity 2020.3.25f1
はじめに
今回はStateMachineBehaviourというAnimatorで使うタイプのクラスについての紹介です!
StateMachineBehaviour はステートマシンのステートに追加できるコンポーネントです。ステートのすべてのスクリプトが継承する基底クラスでもあります。
これを使えば以下のような感じでアニメーションのステートの変化を簡単に検知出来ます。
なお、記事中では以下のアセットを使っています。
Rin | Characters | Unity Asset Store |
StateMachineBehaviour
StateMachineBehaviourを使うにはMonoBehaviourのように継承したクラスを作るだけでOK。
//StateMachineBehaviourを継承 public class StateMachineBehaviourSample : StateMachineBehaviour { }
あとはこれを任意のステートにAddし、
専用のコールバック関数を実装すれば状態検知する事が出来ます。
//状態が変わった時に実行 public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){ Debug.Log($"Idle_Bに変更"); } //状態が終わる時(変わる直前)に実行 public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){ Debug.Log($"Idle_B終了"); } //毎フレーム実行(※最初と最後のフレームを除く) public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){ Debug.Log($"Idle_B再生中"); }
なお、レイヤーにスクリプト貼れば、どのステートの時でもコールバック関数が実行されます。
また、どのステートにいるかの判定は以下のような感じで行います。
if (stateInfo.IsName ("Idle_B")){ //Idle_Bのステートの時だけ実行 }
他にもステートマシン用のコールバック関数や、
///ステートマシンに移った時 public override void OnStateMachineEnter(Animator animator, int stateMachinePathHash){ } //ステートマシンから出て行く時 public override void OnStateMachineExit(Animator animator, int stateMachinePathHash){ }
MonoBehaviourに連動したコールバック関数もあります。
//MonoBehaviour.OnAnimatorMoveの直後に実行 public override void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){ } //MonoBehaviour.OnAnimatorIKの直後に実行 public override void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){ }
ちなみにスクリプトはAnimatorからGetComponentではなくGetBehaviourで取得出来ます。
var stateMachineExample = animator.GetBehaviour<StateMachineExample>();