Unityアニメーション制御手法の比較

〜StateMachineBehaviourとアニメーションイベントの違い〜


1. はじめに

Unityでは、アニメーションの実行タイミングにあわせてコードを実行する方法として、主に以下の2つが使用されます:

  • StateMachineBehaviour(以下 SMB)→ Animator Controller のステート遷移単位で処理を行うクラス
  • アニメーションイベント→ アニメーションクリップの任意のフレーム単位で処理を発火

2. 比較表:StateMachineBehaviour vs アニメーションイベント

項目StateMachineBehaviourアニメーションイベント
定義対象Animator Controller のステートAnimation Clip のフレーム
呼び出しタイミングステートの開始・更新・終了時指定フレームに到達時
粒度ステート単位(粗い)フレーム単位(細かい)
設定方法Animator 上でスクリプト追加Animationウィンドウでイベント挿入
必要なクラスStateMachineBehaviourMonoBehaviourの任意メソッド
引数サポートAnimator情報など(型制限あり)int, float, string, Objectのみ
再利用性高い(複数ステートで共有可)低め(Clipに埋め込み)
使用例攻撃ステートの開始通知、効果音開始など攻撃判定ON/OFF、足音タイミングなど

3. 使い分けの指針

使用シーン適した方法
ステートの開始や終了での処理StateMachineBehaviour
フレーム単位でのイベント処理アニメーションイベント
共通化されたアニメーション制御StateMachineBehaviour
特定のアニメーションクリップに限定した処理アニメーションイベント

4. 使用例

4-1. アニメーションイベントの使用例

public class PlayerAttack : MonoBehaviour
{
    public void EnableHitBox()
    {
        hitBox.SetActive(true);
    }

    public void DisableHitBox()
    {
        hitBox.SetActive(false);
    }
}

Animationウィンドウで該当フレームに EnableHitBox / DisableHitBox を挿入


4-2. StateMachineBehaviourの使用例

using UnityEngine;

public class AttackState : StateMachineBehaviour
{
    public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("攻撃ステートに入りました");
    }

    public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("攻撃ステートを抜けました");
    }
}

Animator Controller の「Attack」ステートにスクリプトをアタッチ


5. まとめ

適した用途手法
ステート単位のロジック制御StateMachineBehaviour
フレーム単位で正確にイベント発火アニメーションイベント

両者は競合関係ではなく補完関係です。アニメーションの設計目的に応じて、適材適所で使い分けることが、堅牢なキャラクター挙動の鍵となります。

Animation,Unity

Posted by hidepon