Unityアニメーション制御手法の比較
目次
〜StateMachineBehaviourとアニメーションイベントの違い〜
1. はじめに
Unityでは、アニメーションの実行タイミングにあわせてコードを実行する方法として、主に以下の2つが使用されます:
- StateMachineBehaviour(以下 SMB)→ Animator Controller のステート遷移単位で処理を行うクラス
- アニメーションイベント→ アニメーションクリップの任意のフレーム単位で処理を発火
2. 比較表:StateMachineBehaviour vs アニメーションイベント
項目 | StateMachineBehaviour | アニメーションイベント |
---|---|---|
定義対象 | Animator Controller のステート | Animation Clip のフレーム |
呼び出しタイミング | ステートの開始・更新・終了時 | 指定フレームに到達時 |
粒度 | ステート単位(粗い) | フレーム単位(細かい) |
設定方法 | Animator 上でスクリプト追加 | Animationウィンドウでイベント挿入 |
必要なクラス | StateMachineBehaviour | MonoBehaviourの任意メソッド |
引数サポート | 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 |
フレーム単位で正確にイベント発火 | アニメーションイベント |
両者は競合関係ではなく補完関係です。アニメーションの設計目的に応じて、適材適所で使い分けることが、堅牢なキャラクター挙動の鍵となります。
ディスカッション
コメント一覧
まだ、コメントがありません