【Unity】StateMachineBehaviourを使ったステートマシン(チュートリアル)

UnityのStateMachineBehaviourを使用することで、ステートマシンを実装することができます。StateMachineBehaviourはUnityのAnimatorコンポーネントと連携し、アニメーションステートのイベントや状態の変化を制御するためのカスタムスクリプトを作成するための基本クラスです

事前に確認しておきましょう

実装

下のキャプチャをもとにシーンを構成しましょう

ここでは、アニメーターを使ったアニメーションの経験があることを前提にしています

Idleステート(状態)

Add Behaviourボタンをクリックすると、スクリプトの雛形が自動作成されます
必要なイベントにコードを追加します

作成される雛形

using UnityEngine;

public class Idle : StateMachineBehaviour
{
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    // OnStateEnterは、遷移が始まり、ステートマシンがこの状態の評価を開始するときに呼び出される
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    // OnStateUpdateは、OnStateEnterコールバックとOnStateExitコールバックの間の各Updateフレームで呼ばれます
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }

    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
    // OnStateExitは、遷移が終了し、ステートマシンがこの状態の評価を終了したときに呼び出される
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }

    // OnStateMove is called right after Animator.OnAnimatorMove()
    // OnStateMoveはAnimator.OnAnimatorMove()の直後に呼ばれます
    override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        // Implement code that processes and affects root motion
        // ルートモーションを処理し、影響を与えるコードを実装する
    }

    // OnStateIK is called right after Animator.OnAnimatorIK()
    // OnStateIKはAnimator.OnAnimatorIK()の直後に呼ばれます。
    override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        // Implement code that sets up animation IK (inverse kinematics)
        // アニメーションIK(インバース・キネマティクス)を設定するコードを実装する
    }
}

必要なコードだけ追加

using UnityEngine;

public class Idle : StateMachineBehaviour
{
    // OnStateEnterは、遷移が始まり、ステートマシンがこの状態の評価を開始するときに呼び出される
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("Idleステートに入った");
    }

    // OnStateUpdateは、OnStateEnterコールバックとOnStateExitコールバックの間の各Updateフレームで呼ばれます
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("IdleステートでUpdateループ処理中");
    }

    // OnStateExitは、遷移が終了し、ステートマシンがこの状態の評価を終了したときに呼び出される
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("Idleステートから抜けた");
    }
}

Walkステート

using UnityEngine;

public class Idle : StateMachineBehaviour
{
    // OnStateEnterは、遷移が始まり、ステートマシンがこの状態の評価を開始するときに呼び出される
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("Walkステートに入った");
    }

    // OnStateUpdateは、OnStateEnterコールバックとOnStateExitコールバックの間の各Updateフレームで呼ばれます
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("WalkステートでUpdateループ処理中");
    }

    // OnStateExitは、遷移が終了し、ステートマシンがこの状態の評価を終了したときに呼び出される
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("Walkステートから抜けた");
    }
}

IdleからWalkへの遷移

実行結果

実行後にコンソール画面に表示されるメッセージを確認しましょう
IdleからWalkへの状態の遷移は、テストなので、AnimatorウィンドウのParametersのWalkTriggerをクリックします

参考

OnStateEnterイベントの詳細

OnStateEnterイベントは、Animatorステートマシン内のステート(状態)が最初に遷移したときに呼び出されるイベントです。Animatorコンポーネントを使用してアニメーションを制御する際に使用されます。

ステートマシンは、Animatorコンポーネント内のアニメーション遷移を管理するグラフ構造です。ステートマシン内の各ステートは、アニメーションの特定の状態を表します。ステート間の遷移は、条件やトリガーに基づいて行われます。

OnStateEnterイベントは、ステートが遷移して指定のステートに入った瞬間に発生します。このイベントを使用することで、ステートが開始された時点で実行したいアクションや処理を追加することができます。たとえば、特定のステートに入ったときにサウンドを再生したり、パーティクルエフェクトを開始したりすることができます。

OnStateEnterメソッドを使用して、ステートが開始されたときに実行されるコードを追加します。このメソッドはスクリプト内に記述し、Animatorコンポーネントと関連付けられたステートマシン内の各ステートに適用されます

AnimatorStateInfo型

AnimatorStateInfoは、UnityゲームエンジンのAnimatorコンポーネントに関連する情報を提供するクラスです。AnimatorStateInfoは、アニメーターコンポーネントが現在再生中のアニメーションステートに関する情報を提供します。

AnimatorStateInfoオブジェクトは、AnimatorコンポーネントのGetCurrentAnimatorStateInfoメソッドやGetNextAnimatorStateInfoメソッドを使用して取得できます。AnimatorStateInfoには、以下のような情報が含まれています。

  1. normalizedTime: アニメーションの正規化された再生時間(0から1の範囲)。この値を使用すると、アニメーションが再生されている特定の位置を把握できます。
  2. length: アニメーションの再生時間(秒単位)。この値は、アニメーションクリップの長さを示します。
  3. speed: アニメーションの再生速度。この値を変更することで、アニメーションの再生速度を調整できます。
  4. loop: アニメーションがループするかどうかを示すブール値。trueの場合、アニメーションはループ再生されます。

AnimatorStateInfoを使用することで、現在のアニメーションステートの情報を取得し、それに基づいてゲームオブジェクトの振る舞いを制御することができます。たとえば、特定のアニメーションステートが再生中かどうかを確認したり、アニメーションが特定の位置に達したかどうかを確認したりすることができます。

Animation,Unity

Posted by hidepon