(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

Animatorのステート(状態)の変更を検知する StateMachineBehaviour【Unity】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2020.3.25f1


はじめに

今回はStateMachineBehaviourというAnimatorで使うタイプのクラスについての紹介です!

StateMachineBehaviour はステートマシンのステートに追加できるコンポーネントです。ステートのすべてのスクリプトが継承する基底クラスでもあります。


これを使えば以下のような感じでアニメーションのステートの変化を簡単に検知出来ます。

f:id:kan_kikuchi:20220323143334g:plain


なお、記事中では以下のアセットを使っています。

Rin | Characters | Unity Asset Store



StateMachineBehaviour

StateMachineBehaviourを使うにはMonoBehaviourのように継承したクラスを作るだけでOK。

//StateMachineBehaviourを継承
public class StateMachineBehaviourSample : StateMachineBehaviour {
  

}


あとはこれを任意のステートにAddし、

f:id:kan_kikuchi:20220323143259p:plain


専用のコールバック関数を実装すれば状態検知する事が出来ます。

//状態が変わった時に実行
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再生中");
}
f:id:kan_kikuchi:20220323143334g:plain


なお、レイヤーにスクリプト貼れば、どのステートの時でもコールバック関数が実行されます。

f:id:kan_kikuchi:20220322074804p:plain


また、どのステートにいるかの判定は以下のような感じで行います。

if (stateInfo.IsName ("Idle_B")){
  //Idle_Bのステートの時だけ実行
}


他にもステートマシン用のコールバック関数や、

///ステートマシンに移った時
public override void OnStateMachineEnter(Animator animator, int stateMachinePathHash){
    
}
  
//ステートマシンから出て行く時
public override void OnStateMachineExit(Animator animator, int stateMachinePathHash){
    
}
f:id:kan_kikuchi:20220323143723p:plain


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>();