SceneLinkedSMB

確認済のバージョン: 2017.3

-

難易度: 初級

SceneLinkedSMB は、StateMachineBehaviour の機能を拡張するクラスです。これにより、アニメーターステートマシン内のステートの Behaviour が MonoBehaviour への参照を維持できるようになります。SceneLinkedSMB は、特定の MonoBehaviour を参照する必要がある場合にどこでも使用可能ですが、ロジックと機能を区別する目的をもって設計されたものです。

アニメーターコントローラーにはステートマシンが含まれています。これは実行フローの制御に非常に適しています。SceneLinkedSMB を使用すると、MonoBehaviour にパブリック関数への呼び出しを行うことで MonoBehaviour に関数を制御させることが可能となり、より簡単にシーンの参照が取得できるようになります。

このような仕組みで、SceneLinkedSMB がステートマシンの一部としてロジックを制御し、それらの関連付けられた MonoBehaviour が機能を制御するということが可能になっています。

SceneLinkedSMB の使用方法

SceneLinkedSMB を使って新しい Behaviour を記述する手順は以下の通りです。

  • 新しいクラスに SceneLinkedSMB を継承させてください。このクラスはジェネリックであるため、どのタイプの MonoBehaviour を持たせるか指定する必要があります。

(例)public class EnemyAttackState: SceneLinkedSMB<Enemy>

  • そのステートを使用しているアニメーターを持つすべてのゲームオブジェクトで初期化を行ってください。 上記の例の場合、Enemy クラスの Start() 関数に SceneLinkedSMB<Enemy>.Initialise(animator, this); を追加することもできます。

この例で用いている「animator」は、SceneLinkedSMB<Enemy> のあるステートマシンを持つアニメーターへの参照です。複数のステートに 10 種類の異なるスクリプトがあったとしても、必要な呼び出し回数は 1 回のみとなります。それらがすべて SceneLinkedSMB<Enemy> から継承されてさえいれば、すべて初期化されます。

  • 必要なステート関数をすべてオーバーライドしてください。SceneLinkedSMB に更なる関数が追加され、機能が実行されるタイミングをより具体的に制御できるようになります。クラス内で、そのクラスのジェネリックタイプ・パラメーターと同じタイプを持つ「m_MonoBehaviour」というprotected メンバーにアクセスできます。上記の例の場合、m_MonoBehaviour のタイプは Enemy になります。

Enemy.cs


public class Enemy: MonoBehaviour {
  Animator animator;

  void Start() {
    animator = GetComponent<Animator>();
    SceneLinkedSMB<Enemy>.Initialise(animator, this);
  }

  public void TrickerAttack() {
    // ...
  }
}

EnemyAttackState.cs


public class EnemyAttackState: SceneLinkedSMB<Enemy> {
  public override void OnSLStateEnter (Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {
    // m_MonoBehaviour のタイプは Enemy です。
    m_MonoBehaviour.TrickerAttack ();
  }
}