PublishOnState
class
名前空間:SilCilSystem.StateMachines
継承:UnityEngine.StateMachineBehaviour
Assembly:SilCilSystem.Packages
アニメーションステート遷移時にイベントを発行するクラスです。 Unityのアニメーション機能とイベントアセットを連携させることが可能です。
PublishOnStateを使用することでアニメーションとロジックを紐づけることが可能です。
例えば、キャラクターの攻撃モーションに合わせて音を鳴らしたり、エフェクト用のゲームオブジェクトを生成することができます。
設定項目
ステートの開始時と終了時のタイミングで処理を呼ぶことができます。
引数なしのイベントを呼ぶ場合は、GameEvent, UnityEngine.Events.UnityEventが利用できます。
引数ありのイベントを呼ぶ場合には、以下の2通りが可能です。
- 引数を固定値でイベントを呼ぶ ->
UnityEventでイベントアセットをPublish - 引数に
Animatorのパラメータを使用する ->GameEventInfoInt,GameEventInfoFloat,GameEventInfoBoolを使用
※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以上獲得したらゲームクリアになるロジックをコーディング無しで組んでみます。

| State | 説明 |
|---|---|
| Start | 初期化処理を行う |
| Playing | ゲームをプレイ中 |
| GameClear | ゲームをクリアした |
| GameOver | ゲームオーバーになった |
トリガーが呼ばれるとPlayingに遷移してゲームが開始され、
Timeが0になればGameOver、Scoreが10になればGameClearに遷移するように設定します。

※遷移条件は>, <, =の3つで≧などが選べないため、「0.0001より小さい」や「9より大きい」としています。
Time, Score, IsPlayingのパラメータに対応する変数を作成します。
Startで変数の値をPublishOnStateを用いて初期化します。

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

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

時間の測定は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);
}
}