UnityのAnimator Controllerはなんとなく使ってしまいがちですが、高機能できちんと理解すればいろんなことができます。
この記事ではAnimator Controllerの基本的な使い方についてまとめました。
Unity2018.3.1
State
まずStateについて見ていきます。
StateのInspectorは地味に項目が多いけどあまり使う機会がありません。
なので改めて見てみます。
項目名 | 説明 |
---|---|
Motion | 再生するAnimation Clip |
Speed | アニメーションの再生速度 |
Speed > Multiplier | アニメーションの再生速度に乗算するパラメータを設定 |
Normalized Time | パラメータでアニメーション時間(0~1)を指定してアニメーションできる |
Mirror | 左右反転(ヒューマノイドのみ) |
Cycle Offset | アニメーション開始時間にオフセットを加算(正規化された時間) |
Foot IK | Foot IKを有効化(長くなるのでこの記事では割愛) |
Write Default | アニメーションにキーが打たれていないプロパティについてデフォルト値を使う (普通、キャラクターアニメーションでは付けても付けなくても変わらない) |
TransitionsのSolo | デバッグ時などに強制的にその遷移をさせたいときにチェック |
TransitionsのMute | デバッグ時などにその遷移を無効にしたいときにチェック |
結局、ほとんどの場合Motion
をセットするくらいになりそうです。
Transition
次にTransitionを見ていきます。
TransitionのInspectorは結構重要な設定項目が多いです。
下記で簡単な説明を書いて、遷移条件と割り込みに関しては次節以降に詳しく書きます。
項目名 | 説明 |
---|---|
上図で「Name」と入力している部分 | 遷移の名前を設定できる StateのInspectorの表示に影響する |
Has Exit Time | 有効の場合、一定時間経ったら遷移を始める(後述) |
Exit Time | Has Exit Timeが有効な場合の遷移開始時間(後述) |
Fixed Duration | 有効な場合は遷移時間を秒で指定 無効な場合は遷移時間をAnimation Clipの長さに対する%で指定 |
Transition Duration | 遷移時間を指定 |
Transition Offset | 遷移先のアニメーション開始時間のオフセット |
Interruption Source Ordered Interruption |
割り込みの設定(後述) |
Conditions | 遷移条件(後述) |
遷移条件の設定について
遷移条件はExit Time
とConditions
により制御します。
まずHas Exit Time
をtrueにして、Conditions
に何も設定していない場合を考えます。
この場合は単純にアニメーションがExit Time
に到達した時点で遷移が開始します。
次にExit Time
を無効にしてConditions
を設定した場合を考えます。
この場合は単純に条件を満たしたときにのみ遷移が開始します。
複数の条件を指定している場合には全て満たしたときにのみ遷移が開始します。
ここで先ほどのExit Time
の考え方についてですが、Exit Time
とは実際には
「ある時間を超えたフレームで一度だけtrueになるbool型のConditions
」です。
これを踏まえてExit Time
を有効にしてConditions
も設定した場合を考えます。
この場合は、Exit Time
に到達したフレームではじめてConditions
の判定が行われます。
言い換えるとConditions
による判定タイミングをExit Time
遅らせることができます。
さらにアニメーションがループだった場合には、Exit Time
に到達するごとにConditions
の判定が行われます。
つまり毎ループで一度だけExit Time
のタイミングでConditions
の判定が行われるということになります。
また、ループアニメーションでExit Time
に1より大きな値、例えば3を入力すると、
3回ループしてから遷移もしくは遷移判定に入る挙動になります。
遷移の割り込み
次に遷移の割り込みについて説明します。
まず、次のような遷移を作ります。
この状態でtrigger_a
をtrueにすると当然State 1
-> State 2
に遷移します。
この遷移中にtrigger_b
をtrueにしてみます。
しかしデフォルトの設定ではやはり遷移しません。
遷移するようにするにはInterruption Source
をCurrent State
にします。
すると割り込みが有効化され、上記のケースでState 1
-> State 2
の遷移中にState1
-> State 3
の遷移が割りこめるようになります。
次にState 1
-> State 2
の遷移中にtrigger_c
をtrueにしてみます。
この場合はInterruption Source
をNext State
にすれば割り込みが可能となります。
このようにInterruption Source
は指定したStateからの遷移が割り込んだ時に許容するかどうか、を表します。
さらにOrdered Interrupt
をtrueにすると、同時に割り込みが発生したときの優先順位を細かく制御できます。
この場合、優先順位はStateで設定したTransitions
の順になります。
パラメータをスクリプトで制御する
遷移などに使うためのパラメータにはint, float, bool, triggerの4つの型が使えます。
スクリプトでGetComponent<Animator>().SetTrigger("trigger_a");
のようにすることで簡単にパラメータを制御できますが、
Triggerだけは「一度有効化するとそのTriggerを使って遷移が行われたタイミングで無効になる」という性質を持っているので使い方に注意が必要です。
あと、アニメーションの処理はUpdate
とLateUpdate
の間で行われるため、
LateUpdate
で変更したパラメータは次のFrameで判定されることになる点も覚えておくべきです。
サブステートマシン
AnimatorのStateMachineは入れ子にできます。
右クリックからCreate Sub-State Machine
を選択することで子のStateMachineが作られます。
サブステートマシン内では(Up) Base Layer
というノードに遷移を繋げば親のStateMachineに遷移できます。