【Unity】Animator Controllerをマスターして自由で自然なモーション再生!複雑な各設定項目を全て解説

UnityのAnimator Controllerはなんとなく使ってしまいがちですが、高機能できちんと理解すればいろんなことができます。
この記事ではAnimator Controllerの基本的な使い方についてまとめました。

Unity2018.3.1

State

まずStateについて見ていきます。

f:id:halya_11:20190128235800p:plain

StateのInspectorは地味に項目が多いけどあまり使う機会がありません。

f:id:halya_11:20190129000637p:plain

なので改めて見てみます。

項目名 説明
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を見ていきます。

f:id:halya_11:20190129004015p:plain

TransitionのInspectorは結構重要な設定項目が多いです。

f:id:halya_11:20190129004116p:plain

下記で簡単な説明を書いて、遷移条件と割り込みに関しては次節以降に詳しく書きます。

項目名 説明
上図で「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 TimeConditionsにより制御します。

まずHas Exit Timeをtrueにして、Conditionsに何も設定していない場合を考えます。

f:id:halya_11:20190129005512p:plain

この場合は単純にアニメーションがExit Timeに到達した時点で遷移が開始します。

次にExit Timeを無効にしてConditionsを設定した場合を考えます。

f:id:halya_11:20190129005802p:plain

この場合は単純に条件を満たしたときにのみ遷移が開始します。
複数の条件を指定している場合には全て満たしたときにのみ遷移が開始します。

ここで先ほどのExit Timeの考え方についてですが、Exit Timeとは実際には
「ある時間を超えたフレームで一度だけtrueになるbool型のConditions」です。

これを踏まえてExit Timeを有効にしてConditionsも設定した場合を考えます。

f:id:halya_11:20190129010121p:plain

この場合は、Exit Timeに到達したフレームではじめてConditionsの判定が行われます。
言い換えるとConditionsによる判定タイミングをExit Time遅らせることができます。

さらにアニメーションがループだった場合には、Exit Timeに到達するごとにConditionsの判定が行われます。
つまり毎ループで一度だけExit TimeのタイミングでConditionsの判定が行われるということになります。

また、ループアニメーションでExit Timeに1より大きな値、例えば3を入力すると、
3回ループしてから遷移もしくは遷移判定に入る挙動になります。

遷移の割り込み

次に遷移の割り込みについて説明します。
まず、次のような遷移を作ります。

f:id:halya_11:20190129201001p:plain

この状態でtrigger_aをtrueにすると当然State 1 -> State 2に遷移します。
この遷移中にtrigger_bをtrueにしてみます。
しかしデフォルトの設定ではやはり遷移しません。

遷移するようにするにはInterruption SourceCurrent Stateにします。

f:id:halya_11:20190129201346p:plain

すると割り込みが有効化され、上記のケースでState 1 -> State 2の遷移中にState1 -> State 3の遷移が割りこめるようになります。

次にState 1 -> State 2の遷移中にtrigger_cをtrueにしてみます。
この場合はInterruption SourceNext Stateにすれば割り込みが可能となります。

f:id:halya_11:20190129202513p:plain

このようにInterruption Sourceは指定したStateからの遷移が割り込んだ時に許容するかどうか、を表します。

さらにOrdered Interruptをtrueにすると、同時に割り込みが発生したときの優先順位を細かく制御できます。

f:id:halya_11:20190129202653p:plain

この場合、優先順位はStateで設定したTransitionsの順になります。

f:id:halya_11:20190129202606p:plain

パラメータをスクリプトで制御する

遷移などに使うためのパラメータにはint, float, bool, triggerの4つの型が使えます。

f:id:halya_11:20190129203127p:plain

スクリプトGetComponent<Animator>().SetTrigger("trigger_a");のようにすることで簡単にパラメータを制御できますが、
Triggerだけは「一度有効化するとそのTriggerを使って遷移が行われたタイミングで無効になる」という性質を持っているので使い方に注意が必要です。

あと、アニメーションの処理はUpdateLateUpdateの間で行われるため、
LateUpdateで変更したパラメータは次のFrameで判定されることになる点も覚えておくべきです。

docs.unity3d.com

サブステートマシン

AnimatorのStateMachineは入れ子にできます。
右クリックからCreate Sub-State Machineを選択することで子のStateMachineが作られます。

f:id:halya_11:20190129203819p:plain

サブステートマシン内では(Up) Base Layerというノードに遷移を繋げば親のStateMachineに遷移できます。

f:id:halya_11:20190129204609p:plain

参考

docs.unity3d.com

docs.unity3d.com

blogs.unity3d.com