PublishOnState

class

名前空間:SilCilSystem.StateMachines

継承:UnityEngine.StateMachineBehaviour

Assembly:SilCilSystem.Packages


アニメーションステート遷移時にイベントを発行するクラスです。 Unityのアニメーション機能とイベントアセットを連携させることが可能です。

PublishOnStateを使用することでアニメーションとロジックを紐づけることが可能です。 例えば、キャラクターの攻撃モーションに合わせて音を鳴らしたり、エフェクト用のゲームオブジェクトを生成することができます。

設定項目

ステートの開始時と終了時のタイミングで処理を呼ぶことができます。 引数なしのイベントを呼ぶ場合は、GameEvent, UnityEngine.Events.UnityEventが利用できます。 引数ありのイベントを呼ぶ場合には、以下の2通りが可能です。

GameEventInfo~系はインスペクタ上での設定を可能にするためのサブクラスです。

ステート開始時にイベントを呼ぶ

type name description note
GameEvent OnStateEnter 引数なしのイベントアセット  
GameEventInfoInt[] OnStateEnterInt int型を引数にとるイベントアセット 引数にAnimatorのint型パラメータを使用
GameEventInfoFloat[] OnStateEnterFloat int型を引数にとるイベントアセット 引数にAnimatorのfloat型パラメータを使用
GameEventInfoBool[] OnStateEnterBool int型を引数にとるイベントアセット 引数にAnimatorのbool型パラメータを使用
UnityEvent OnStateEnterEvent メソッドを指定 引数を固定してイベントを呼びたい場合などに使用可能

ステート終了時にイベントを呼ぶ

type name description note
GameEvent OnStateExit 引数なしのイベントアセット  
GameEventInfoInt[] OnStateExitInt int型を引数にとるイベントアセット 引数にAnimatorのint型パラメータを使用
GameEventInfoFloat[] OnStateExitFloat int型を引数にとるイベントアセット 引数にAnimatorのfloat型パラメータを使用
GameEventInfoBool[] OnStateExitBool int型を引数にとるイベントアセット 引数にAnimatorのbool型パラメータを使用
UnityEvent OnStateExitEvent メソッドを指定 引数を固定してイベントを呼びたい場合などに使用可能

使用例

ステートマシンとして利用する

UnityのAnimatorはその名の通り、アニメーションのための機能です。 通常は上記のように音を鳴らしたりといったエフェクト用の処理を呼ぶことが多いと思いますが、 (使い勝手が良いかは置いておいて)有限ステートマシンとして利用することも可能です。 Animatorのパラメータに変数アセットをバインドさせることでゲームロジックを実装することも可能です。 (正直お勧めはしませんが。)

ここでは、制限時間10秒以内にスコアを10以上獲得したらゲームクリアになるロジックをコーディング無しで組んでみます。

AnimatorControllerの要素

State 説明
Start 初期化処理を行う
Playing ゲームをプレイ中
GameClear ゲームをクリアした
GameOver ゲームオーバーになった

トリガーが呼ばれるとPlayingに遷移してゲームが開始され、 Timeが0になればGameOverScoreが10になればGameClearに遷移するように設定します。

StartからPlayへの遷移条件 PlayからGameOverへの遷移条件 PlayからGameClearへの遷移条件

※遷移条件は>, <, =の3つで≧などが選べないため、「0.0001より小さい」や「9より大きい」としています。

Time, Score, IsPlayingのパラメータに対応する変数を作成します。 Startで変数の値をPublishOnStateを用いて初期化します。

Startの変数設定

プレイ中はIsPlayingの値がtrueになるようにPlayingにもPublishOnStateを設定します。

Playの変数設定

続いて、コンポーネントを設定します。 Animatorコンポーネントと変数アセットをバインドします。

Animatorと変数のバインド

時間の測定はTimerコンポーネントを使用します。

Timerコンポーネントの設定

実装

UnityEngine.StateMachineBehaviourを継承して、イベントを実行しています。 例えば、ステート開始時のイベントは以下のようになります。

public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    m_onStateEnter?.Publish();
    foreach (var info in m_onStateEnterInt) info?.Publish(animator);
    foreach (var info in m_onStateEnterFloat) info?.Publish(animator);
    foreach (var info in m_onStateEnterBool) info?.Publish(animator);
    m_onStateEnterEvent?.Invoke();
}

GameEventInfo~系ではAnimatorから値を取得してイベントを呼ぶようになっています。 例えば、intのパラメータを使用する場合はGetIntegerを使用します。

private class GameEventInfoIntの例
{
    [SerializeField] private string m_parameterName = default;
    [SerializeField] private GameEventInt m_event = default;

    public void Publish(Animator animator)
    {
        var value = animator.GetInteger(m_parameterName);
        m_event?.Publish(value);
    }
}

ドキュメントトップへ

ダウンロードページへ