アニメーターコントローラー内で複雑な
ステートを含むロジックシステムを作成するとき
ステートマシンを階層化すると
とてもきれいに整理できます
ステートマシンを作成するには Animator ウィンドウで
何もない箇所を右クリックして
Create Sub-State Machine（サブステートマシンを作成）をクリックします
これで現在のレイヤーまたはステートマシンレベルに
新しいステートマシンが作成されます
標準の四角っぽい形とは異なり
サブステートマシンは六角形っぽい形を
していますね
それでは 便利な使い方を見ていきましょう
ここにちょっと ごちゃごちゃしてきた
アニメーターコントローラーがあります
ここにさらにステートを追加していく前に
整理しておきたいところです
それには一部のステートを
ステートマシンに入れてしまう方法があります
この例だとAirborne（空中）にいる時の
ステートのグループはすべて
サブステートマシンにまとめられそうです
さっそくステートマシンを作るため
Animator ウィンドウを右クリックして
Create Sub-State Machine を選択します
ステートマシンの名前はインスペクターで
クリックすればいつでも変更できます
ステートと同じですね
次に作ったステートマシンにステートを追加していきますが
これは追加するステートを選択して
ステートマシンにドラッグするだけで
OK です
この例でステートマシンに含めたいのは Leap Takeoff
Leap Airborne・Falling・Landing ステートです
ドラッグ中には追加できる場合に + アイコンが
表示されるので注意してください
こうしてステートをステートマシンに追加すると
現在のステートマシン / レイヤーからは消えてしまいます
もう一度これらステートを表示したり
プロパティを編集したりするには
サブステートマシンをダブルクリックします
格納レイヤーやステートマシンに
戻る場合は「Up」ノードをダブルクリックします
現在どの階層にいるのかはウィンドウの上部に
パンくず式で表示されるので
そこで確認してください
さてステートマシンは階層構造で使うことができます
これはつまりアニメーターコントローラーの各レイヤーには
複数のステートマシンが存在しうるということです
そしてそのステートマシーンにもさらに
サブステートマシンを持たせることなどができます
そして遷移（Transition）はステートマシンの
外部から内部へと移動できます
この例でもサブステートマシンに格納した
ステートへの遷移がそのまま維持されている
のが見えますね
ステートマシンに新しい遷移を追加するには
遷移元とするステートまたはステートマシンを
右クリックし 続けて
Make Transition（遷移を作成）を選択します
続けて遷移先のステートマシンを
左クリックします
するとポップアップメニューが表示され
ステートマシン内のどのステートに遷移させるか
あるいはステートマシン自体に遷移させるかを
指定するよう求められます
ステートマシンから出る遷移を作る方法としては
「Up」ノードを使う方法があります
これは現在のステートマシンに含まれない
全ステート/ステートマシンへの
リンクのように機能します
Up ノードにはまず「Up」ラベルが
続いて親ステートマシンの名前が表示されています
親ステートマシンが存在しない場合は
帰属するレイヤーの名前が表示されます
この例では親ステートマシンがないので
Up ノードのラベルは次のようになっています
(Up) Base Layer
ステートマシンから出る遷移を作るには
遷移元とするステート / ステートマシンを
右クリックしてから
Make Transition（遷移を作成）を選択し
続けて Up ノードを左クリックします
するとステートマシンに遷移する時と似た
オプションが表示されます
ただしこの場合選択肢としては
現在よりも上の階層のステートマシンや
ステートが表示されます
レイヤー / ステートマシンには必ず
緑色の Entry と赤色の Exit ノードが存在します
これらは他のステートやステートマシンへの
依存性を抑える目的でカプセル化する
ために用いられ
Up ノードの代替物のように扱うことができます
ステートマシンを遷移先とする場合も遷移元とする場合も
ユーザーは Up ノード /
Entry ノード / Exit ノードを使えます
Up ノードを使った場合
遷移はステート間または
ステートとステートマシンの間で起こります
Entry および Exit ノードを使った場合
遷移元も遷移先も
ステートマシン自体となります
ステートマシンへの遷移は
Entry ノードから来て
Exit ノードから出て行くわけです
そうなると遷移の設計も色々と
考慮しなくてはいけない点が出てきます
Up ノードのように単一の遷移が入っているだけでなく
多数の遷移が存在しうるからです
例を見てみましょう
これは先ほど見ていたコントローラーと同じものです
ただし Locomotion と Airborne はそれぞれ
個別のステートマシン化されています
そして先ほどのように各ステートを
遷移でつなぐのではなく
Entry ノードと Exit ノードが使われています
先ほどの例では Standing Locomotion から
Leap Take Off と Falling への遷移があり
また Landing から
Standing Locomotion への遷移もありました
Standing Locomotion から Leap Take Off への
遷移条件は Jump トリガーでした
しかし Locomotion ステートを
ステートマシンにカプセル化したので
遷移先のステートは無関係になって
しまっています
この場合ただこのステートマシンから
出たいという状態になります
なので Exit ノードへの遷移で
条件に Jump トリガーを指定します
さて先ほどの複雑なアニメーターコントローラーでは
Standing Locomotion から Falling へ
遷移する条件はパラメーター
"Grounded" が false の時でした
そして Entry / Exit ノードの例でも
2 個目の遷移で Locomotion ステートマシンを
出るときに同じ条件が必要になります
ステートマシンは 2 個しかないので
一方のステートマシンを出るときは
他方に入るようにしたいですよね
このため両者間の遷移には条件をつけません
さて Airborne ステートマシンには Entry ノードから
2 個の遷移が出ています
1 個目は Entry ノードからの
デフォルトの遷移です
デフォルトであるのは矢印が通常の白ではなく
オレンジ色であるところから分かります
この遷移は他に Entry ノードから
移行できる遷移がない時または
この遷移のみが利用可能なときに使われます
もう一方の遷移はグレーになっていますね
このようにグレーで表示される遷移は
遷移元のステートがわからないことを
示します
この例で言えば
Entry ノードからステートマシンへの
遷移であるため 遷移元のステートは
何でもあり得ます
この他にも Locomotion と Airborne の
両ステートマシン間の遷移もグレーで表示されています
これらも同様に 遷移元のステートが
不明であるためグレーなのです
グレーになっている遷移では
条件のみが編集可能です
遷移元のステートが分からない状態では
その他の詳細設定は
意味がありませんから
持続時間やその他の情報を制御する際は
遷移元のステートからの遷移を使います
Falling への遷移の条件には
"Grounded" が false と設定されています
この 2 つの遷移は組み合わせて考えると
このステートマシンに入った時 "grounded" が false であれば
Falling が再生されるという結果が得られます
そしてそれ以外の場合はデフォルトの遷移が使用され
"Leap Take Off" が再生されます
Entry / Exit ノードを使用してステートマシンを
カプセル化することの最大の利点は
その再利用性にあります
特定のアニメーターコントローラーに
他の場所でも使えるステートマシンがあった時
ステートマシンをそのまま別の
アニメーターコントローラーにコピーできるからです
ステートマシンは自己完結型であり
外部への依存性を持たないので
コピー先の別のアニメーター
で他のステートやステートマシンが
どうなっていても関係ないわけです
アニメーターとアニメーターコントローラーの
詳細については下記リンク先の情報をご覧ください