UnityのAnimatorControllerのアニメーションのブレンドと割り込み

今回はUnityのAnimatorControllerでのアニメーションのブレンドの設定を見ていこうと思います。

AnimatorControllerの使い方については

Unityのアニメーターコントローラーの基本的な使い方を学習していきます。

等でも記述しているので参照してみてください。

スポンサーリンク

Animatorの遷移のインスペクタ

Animatorで通常の状態(Idle)、歩く状態(Walk)を作成し相互の遷移を作成します。

Idle→Walkのインスペクタを見てみると、

Animatorのブレンドの設定

↑のような設定項目が表示されます。

それぞれの項目を見てみましょう。

Transitions

Transitionsは遷移の状態を制限する機能です。

状態のTransitionsと連動していてどちらかのTransitionsを変更すると変更されます。

Unityのマニュアルでは状態のTransitionsで変更する事が奨励されています(その状態からのTransition全てが表示されるからかも?)。

Soloにチェックを入れるとその状態からのそれ以外への遷移が行われなくなります。

Muteをチェックするとその遷移は無視されます。

両方のチェックを入れるとMuteが反映されるようです。

Has Exit Time

Has Exit Timeはその後のSettingsの項目のExit Timeの時間経過で発生する条件を有効にするかどうかです。

通常の遷移では条件、例えばアニメーションパラメータのAttackが有効になったらAttack状態へと遷移させるという条件を指定します。

AttackからIdleへと遷移させる時は攻撃のアニメーションが終わったらそのままIdleへと遷移させるだけなので特別な条件は設けないで、

Has Exit Timeにチェックを入れ、アニメーションの再生が終わったら自然にIdleへと流れるようにしておきます。

Has Exit TimeはExit Timeで指定した時間経過したら発生する条件ということですね。

Settings

Settingsはアニメーションブレンドの詳細な設定をする為の項目です。

Exit Time

Exit Timeはさきほど紹介したHas Exit Timeにチェックを入れると有効になる項目で、Exit Timeの時間が経過したら条件が成立するようになります。

アニメーションの再生は最初が0、最後が1になり、Exit Timeを0.9に設定すると90%の再生が来た時点で条件が成立します。

1より上の数値を指定した場合は2回目のアニメーションが再生されてからの数値になるので、1.2を指定すれば2回目の20%のアニメーション再生が来た時になります。

Fixed Duration

Fixed Durationにチェックを入れると遷移時間が秒単位で表示され、チェックを外すとアニメーションの正規時間で表示されます。

この後のTransition Durationも参照してください。

Transition Duration

Transition Durationは遷移時間を指定します。

Fixed Durationにチェックを入れていると秒数で値を指定し、チェックを入れていなければアニメーションの正規時間で指定します。

Transition Duration

↑のようにTransition Durationは青い矢印の間で表示され矢印を動かす事でも値を変更する事が出来ます(こちらの方が直感的に操作できる)。

Fixed Durationのチェックを外しTransition Durationを1にすると

Fixed Durationのチェックを外した時

↑のようにTransition Durationが%表示になり遷移する為に必要な時間がIdleの再生が終わる部分まで伸びているのがわかります。

Transition Offset

Transition Offsetは遷移先の状態のアニメーションブレンドを始める位置です。

例えばTransition Offsetに0.5を設定すると

Transition Offset

↑のように遷移先のアニメーションが左に50%ズレWalk状態に設定しているアニメーションの50%から始まります。

Interruption Source

Interruption Sourceは遷移を中断出来る条件を指定します。

None

Noneの場合は遷移を中断しません。

Current State

Current Stateは現在の状態にいる時に他の遷移によって遷移を中断出来ます。

Next State

次の状態の遷移によって遷移を中断する事が出来ます。

Current State Then Next State

現在と次の状態の遷移によって遷移を中断が出来るが同時に遷移条件がTrueになった時は現在の状態を優先する。

Next State Then Current State

現在と次の状態の遷移によって遷移を中断が出来るが同時に遷移条件がTrueになった時は次の状態を優先する。

Ordered Interruption

Ordered Interruptionは現在の遷移を遷移の順番にかかわらずその他の遷移で中断する事が出来ます。

Interruption Sourceの条件を解り辛いですね・・・(^_^;)

これらについては後でサンプルを使って確認してみます。

アニメーションブレンドの確認

Animatorの遷移(Transition)の項目について見たのでそれらを使ってアニメーションブレンドを確認してみます。

サンプルの作成

アニメーションブレンドの確認をする為のサンプルを作成していきます。

キャラクターの設置と移動スクリプト

まずはStandardAssets→Characters→ThirdPersonCharacter→Ethanをヒエラルキー上にドラッグ&ドロップします。

AnimatorのApply Root Motionのチェックは外しておきます。

EthanにはCharacterControllerの設定とコライダサイズの調整、移動スクリプトを取り付けます。

詳しくは

Unityで3Dキャラクターモデルを配置し、キャラクターをCharacterControllerの機能を使って移動させるようなプログラミングをしてみます。
Unityのゲームでキャラクターがジャンプ出来るようにする機能を作成します。

を参照してください。

移動スクリプトのインスペクタでWalk Speedに1.5、JumpPowerに5を設定します。

大まかに言うとキーボードの矢印キーで移動させ歩いたらAnimatorのアニメーションパラメータのSpeedを操作し、

Spaceキーを押したらアニメーションパラメータのJumpのトリガーをOnにします。

Animator Controllerの作成

Assetsフォルダ内で右クリック→Create→Animator Controllerを選択し名前をAnimationStateとしEthanのAnimatorに設定します。

アニメーションブレンド用AnimatorController

↑のように状態と遷移を作成します。

状態と遷移の作成については

Unityのアニメーションを切り替える為のアニメーターの設定とアニメーションの遷移をさせるスクリプトの作成を行います

等を参考にしてください。

Idleには立っているアニメーション、Walkには歩いているアニメーション、WalkToOtherにはダメージを負っているアニメーション、Jumpにはジャンプしているアニメーション、JumpToOtherには着地した時のアニメーションを設定します。

遷移の条件の設定は

Idle→WalkはSpeedがGreaterで0.1
Walk→IdleはSpeedがLessで0.1
Walk→WalkToJumpはOther
Walk→JumpはJump
Jump→JumpToOtherはOther

それぞれHas Exit Timeのチェックを外しておきます。

Jump→Idleは条件なしでHas Exit Timeにチェックを入れ、アニメーションの再生が終わったらIdleに戻るようにしておきます。

アニメーションブレンドの確認

今回はIdle→Jump、Jump→Idleの遷移のブレンドを見ていきたいと思います。

今回使用するジャンプのアニメーションは

アニメーションブレンドで使用するジャンプアニメーション

のようにジャンプまでの助走があり、ジャンプ後に着地した後少し飛び上がるまでのアニメーションになっています。

そこでIdle→Jumpの遷移を選択し、インスペクタのアニメーションのブレンド設定をしてジャンプまでの助走を切り取ります。

ジャンプの助走の切り取り

ジャンプアニメーションは20%ぐらいまでジャンプの助走になるので

ジャンプの助走を切り取りブレンド

↑のようにジャンプのアニメーションを左にドラッグし21%あたり左に位置させます。

Transition DurationをほぼなくしIdleからJumpへの遷移時間をほとんどなくします。

これでIdleからJumpへと遷移する時は助走なしですぐにジャンプアニメーションへと遷移します。

ジャンプの助走を切り取ったアニメーション

ジャンプ後の飛びはねの切り取り

次はJump→Idleのブレンドでジャンプ後の飛びはねを切り取りIdle状態へとうまくブレンドするようにしていきます。

ジャンプ後の飛びはねは65%あたりから始まるので

ジャンプ後の飛びはねを切り取る

↑のようにJumpの65%辺り(Exit Timeを参照してください)からブレンドを始めIdleへと遷移させるように調整します。

ジャンプ後の飛び跳ねを切り取ったアニメーション

↑のようにジャンプ後の飛び跳ねが始まる辺りからIdleアニメーションとのブレンドを始めるので飛び跳ね部分がなくなっているように見えます。

このようにアニメーションの遷移でブレンドの設定を変更すると、いらない部分を切り取ったりなめらかにアニメーションを変更する事が出来ます。

Transition Duration(遷移時間)を短くすれば遷移が早くなり、長くすれば遷移がゆっくりと行われるのでそこの調整でもだいぶ変わります。

それではここまでの設定を動画で確認してみます。

↑のようになりました。

ジャンプの助走、ジャンプ後の飛び跳ねはなくなりました。

Interruption Sourceの確認

先ほどのアニメーションブレンドの確認でキャラクターを左右に移動させ反転させる時にSpeedの値が変わるのでIdle→Walk、Walk→Idleという遷移が起こり、

左右反転させる時に毎回Idleアニメーションが入りいったん止まったようになってしまいます。

またジャンプ後に着地したらすぐキャラクターを移動出来るようにしていますが、ジャンプ中に移動キーを押しているとJump→Idle→Walkという遷移の流れになりますが、

必ずIdleを介するので一旦Idleアニメーションが再生されIdleアニメーション中にキャラクターが動いています。

これを解消するのがInterruption Sourceの設定です。

Interruption Sourceの設定をしておくと現在の状態や次の状態での遷移によって遷移を中断させる事が出来るのでIdle状態を中断し次の状態へと移行させる事が出来ます。

今回の場合はWalk→Idleの遷移とIdle→Jumpの遷移にInterruption Sourceの設定をしIdle状態の再生を中断し次の状態に遷移するようにします。

Walk→IdleとJump→Idleの遷移を選択し、Interruption SourceをNext Stateにします。

Interruption SourceにNext Stateを設定

↑はJump→Idleの遷移で設定した画像です。

Next Stateは次の状態(Idle)の遷移条件をクリアしている時に遷移を中断するのでジャンプ中に移動キーを押しているとIdle→Walkの遷移条件を満たす為、Idleを中断し、次のWalk状態へと遷移します。

Walk→Idleも同じようになります。

それでは確認してみます。

↑のようになりました。

左右に反転して移動させた時、ジャンプ後に移動キーを押した時にIdleを中断し次の遷移を行っているのが確認出来ました。

その他の遷移中断の設定

先ほどInterruption SourceにNext Stateを設定し遷移の中断を確認する事が出来ましたが、他の設定とどう違うのかがわかり辛いと思います。

そこでUnityを一時停止しコマ送りにし、アニメーションパラメータの値を操作してどの設定の時にどうなるかを確認してみたいと思います。

まずはEthanに取り付けている移動スクリプトを無効化しておきます(AnimatorControllerで直接パラメータを操作する為)。

Interruption Sourceを操作するのはWalk→Jumpの遷移です。

Interruption Sourceを設定する遷移

↑の遷移の部分ですね。

Unityを実行したらアニメーションパラメータのSpeedの値を0.1より上の値を設定しWalkに遷移させ、一時停止ボタンを押してから、それぞれのアニメーションパラメータの値を変更しコマ送りボタンを押して確認していきます。

またWalk→Jump、Walk→WalkToOtherの遷移条件であるJumpとOtherを同時にトリガーしますが、

同じタイミングで条件が成立した時の遷移先

Walk状態を見るとWalk→JumpがWalk→WalkToOtherの上にある為、Walk→Jumpへの条件が最初に成立します。

今回はサンプルなので条件が二つ成立していますが、通常は混乱を避ける為に条件が一緒に成立しないようにした方がいいと思います。

あと、Ordered Interruptionのチェックは外しておきます。

Current State

まずはWalk→Jumpの遷移のInterruptionにCurrent Stateを設定して確認します。

↑のようになりました。

アニメーションパラメータのJumpとOtherをトリガーしていて一瞬Jumpに遷移をしようとしますがInterruption SourceにCurrent Stateが設定されている為、現在の状態の遷移を優先させます。

その為Walk→WalkToOtherの条件であるOtherもトリガーされている為にWalk→Jumpへの遷移途中に中断し、Walk→WalkToOtherへと遷移しているのがわかります。

Next State

次はNext Stateを設定してみます。

↑のようになりました。

Interruption SourceにNext Stateが設定されている為、Walk→Jumpへと遷移している途中にJump→JumpToOtherへの遷移条件がOtherがトリガーされているので、

Walk→Jumpへの遷移を中断し、JumpToOtherへと遷移しています。

Next Stateなので次の状態であるJump→JumpToOtherの遷移条件であるOtherが成立しているのでこうなります。

Current State Then Next State

Current State Then Next Stateは遷移を中断し、現在の状態の遷移条件、次の状態の遷移条件の成立を優先させます。

↑のようになりました。

現在の状態WalkからWalkToOtherの条件はOtherがトリガーされる事、次の状態JumpからJumpToOtherへの条件もOtherがトリガーされる事なのでこうなります。

Next State Then Current State

Next State Then Current Stateの場合は遷移を中断し、次の状態の遷移条件、現在の状態の遷移条件の成立を優先させます。

↑のようになりました。

これでInterruption Sourceの挙動はなんとなくわかりましたが、Ordered Interruptionのチェックを入れるとまたよくわからなくなりますね・・・(^_^;)

Ordered Interruptionは現在の遷移を遷移の順番にかかわらずその他の遷移で中断出来ると書いてますが、チェックを入れると遷移の順番によって中断するようになるのかもしれません。

つまりWalkの状態を選択してインスペクタのTransitionsでWalk→JumpをWalk→WalkToOtherの上の順番にしておくとOrdered Interruptionにチェックが入っていればWalk→Jumpの遷移を優先する。

Ordered Interruptionのチェックが入っていなければ順位を考慮せずInterruption Sourceの設定によってWalk→Jump、Walk→WalkToOtherへの遷移を行う。

のかなと。

書いてて自分が混乱してきました・・・・・\(-o-)/

Interruption Sourceの設定に関しては

I recently investigated a tricky bug reported by a user involving the combination of empty states, override layers, and transition interruptions. As I was ...

で細かく説明されていますが英語なので詳しい所まではなんとも・・・・。

その文章の中でも遷移の中断は便利だけど混乱しやすいのでエディターで確認しましょうと書かれているのでやっぱりInterruption Sourceの設定は混乱するものなんですね・・・・(T_T)

参考サイト

Unityマニュアルーアニメーション遷移ー

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます