# ステートマシンとは？

ステートマシンは、挙動を１つの状態として、条件によって状態を切り替えていく仕組みを言います。

Arborでは、ArborFSMコンポーネントをGameObjectに追加することでステートマシンが使えるようになります。

## 例：スイッチとライト

スイッチと電灯を考えてみます。

- スイッチOFFならライトは消える。
- スイッチONならライトが点く。
- スイッチを条件として、ライトの状態が切り替わります。

ArborFSMで仮組すると以下のようになります。

Destroyメッセージが送られてきた場合に爆発エフェクトを出し削除する挙動も仮組されています。

詳しい解説は後程行います。

## ノードの構成要素

ステートマシンで使用するノードは以下のページにまとまっています。

ノードの構成要素

各部位の解説の前に、一度参照してください。

## 例の解説

では、先ほどの例をもう一度見てみましょう。

- Light Offステート
  - まず、開始ステートのLight Offステートから始まる。
  - ActivateGameObectにより、Spotlightオブジェクトが非アクティブに変更される。
    Arborリファレンス : ActivateGameObject
  - OnTriggerEnterTransitionにより、Playerタグのオブジェクトが入ったらLight Onステートに遷移する。
    Arborリファレンス : OnTriggerEnterTransition
    (OnTriggerEnterTransitionを使用するには、ArborFSMのあるGameObjectにColliderなどの設定が必要です)
- Light Onステート
  - ActivateGameObectにより、Spotlightオブジェクトがアクティブに変更される。
  - OnTriggerExitTransitionにより、Playerタグのオブジェクトが出たらLight Offステートに遷移する。
    Arborリファレンス : OnTriggerExitTransition
    (OnTriggerExitTransitionを使用するには、ArborFSMのあるGameObjectにColliderなどの設定が必要です)
- Wait Triggerステート
  - 常駐ステートなので、どのステートが実行されているかにかかわらず常時実行される。
  - TriggerTransitionにより、Destroyメッセージが来たらExplosion & Destroyステートに遷移する。
    Arborリファレンス : TriggerTransition
    - なお、Triggerメッセージを送るにはSendTriggerを使用します。
      Arborリファレンス : SendTrigger
      他のFSMからSendTriggerを使用して、間接的に遷移命令を出す形式です。
- Explosion & Destroyステート
  - InstantiateGameObjectにより、プレハブをインスタンス化。
    Arborリファレンス : InstantiateGameObject
    (ここでは仮組のため空のままになっていますが、パーティクルなどを設定する想定です)
  - DestroyGameObjectにより、LightFSMオブジェクト(自分自身のGameObject)を破棄。
    Arborリファレンス : DestroyGameObject

状態に挙動を組み合わせ、遷移条件に合致したら遷移していく流れがわかったかと思います。

今回のような簡単な例であれば直接MonoBehaviourを書いたほうが楽という方もいるかと思いますが、

状態が複数入り乱れるようになった際、グラフ形式で視覚化できるのは大きな利点となるでしょう。