-
アニメーターコントローラー内で複雑な
-
ステートを含むロジックシステムを作成するとき
-
ステートマシンを階層化すると
-
とてもきれいに整理できます
-
ステートマシンを作成するには 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 ノードを使用してステートマシンを
-
カプセル化することの最大の利点は
-
その再利用性にあります
-
特定のアニメーターコントローラーに
-
他の場所でも使えるステートマシンがあった時
-
ステートマシンをそのまま別の
-
アニメーターコントローラーにコピーできるからです
-
ステートマシンは自己完結型であり
-
外部への依存性を持たないので
-
コピー先の別のアニメーター
-
で他のステートやステートマシンが
-
どうなっていても関係ないわけです
-
アニメーターとアニメーターコントローラーの
-
詳細については下記リンク先の情報をご覧ください