UnityのAnimationClipのルートモーションの設定

Unityでは外部アプリケーションで作成したアニメーションを取り込み使用する事が出来ます。

今回は取りこんだアニメーションクリップのプロパティについてみていきます。

スポンサーリンク

サンプル作り

アニメーションクリップのプロパティを操作する前に確認する為のサンプルを作成します。

人型3Dモデルをヒエラルキー上に配置したら、AnimatorにAnimatorControllerを設定します。

比較の為、人型モデルを二人並べてAnimatorControllerを別々に作成しそれぞれ別のアニメーションを設定します。

プロパティ変更用と通常のキャラクターを作成

↑のように二人のキャラクターをヒエラルキー上に設置します。

名前を変更しAnimationClipのプロパティを変更しないキャラと変更するキャラを作ります。

キャラクターを横に並べて比較する

確認の為に↑のように横に並べて比較しやすいようにしておきます。

サンプルではジャンプのアニメーションを使用しますが、これはAssetStoreでRaw Mocap Data for Mecanimで検索して出てくるアニメーションのJumpを使用します。

NormalCharacterに設定するAnimatorControllerの遷移はJump状態を作成しJumpアニメーションを設定しておきます。

Jumpを繰り返す

EntryからJumpに流れますが、JumpからExitにHasExitTimeの条件だけで遷移をさせます。

HasExitTimeにチェックを入れるだけ

こうすることでずっとJumpアニメーションが再生されます。

ルートモーションのプロパティを変更するCharacterに設定するAnimatorControllerのJumpにはJumpアニメーションを複製したものを設定します。

Jumpファイルを選択した状態でCtrl+Dキーを押して複製し名前をAnimationClipTestと変更します。

またAnimationClipTestのインスペクタのアニメーションの名前をJumpからAnimationClipTestと変更します。

名前は自由に変更してください。

AnimatorControllerについては

Unityのアニメーションの切り替えシステムであるAnimatorControllerの設定とスクリプトからアニメーションを制御していきます。

辺りを参照して頂くと状態や遷移の作り方がわかります。

ルートモーションの個別設定

Unityにアニメーション付きのモデルを取りこんでファイルを取りこむと以下のようになっています。

アニメーションクリップファイル

ファイルを選択するとインスペクタに

アニメーションクリップのルートモーション

↑のようにアニメーションクリップに関するプロパティが表示されます。

それではルートモーションに関する部分を確認してみます。

Loop Time

Loop Timeにチェックを入れるとアニメーションの再生が終わったら繰り返し再生します。

歩くアニメーション等ずっと再生させたい時はチェックを入れておきます。

Loop Timeにチェックを入れるとLoop PoseとCycle Offsetの設定が出来るようになります。

Loop Poseにチェックを入れるとアニメーションの最初と最後がシームレス(滑らかに?)で再生されます。

Cycle Offsetはアニメーションのオフセットの位置(アニメーション開始位置)を設定します。

アニメーションは0~1の間でアニメーションの再生パーセンテージを指定するので0.5を設定すればアニメーションが50%の位置から再生します。

アニメーションの再生が2回目以降になると1以上の値が入って来るので1以上の値も設定可能だと思いますが設定する意味はあるかな?

Loop TimeとLoop Poseにチェックを入れ確認してみます。

Loop Poseにチェックを入れた場合

左側が通常で右側がLoop Poseにチェックを入れたアニメーションクリップです。

右側がアニメーションの初めに向かってシームレスで再生されるように腕の位置等が通常と違っています。

Cycle Offsetを0.5に設定して再生すると

0.5の位置から再生された

↑のように0.5の位置から再生されました。

Animatorの遷移はブレンドして再生されるので0.5では空中に浮いた状態ですが他の状態から遷移してきた時はブレンドされたアニメーションが再生されるので、

空中に飛んだ状態からは始まりません。

Root Transform Rotation

Root Transform RotationのBake Into Poseにチェックを入れるとアニメーションの値がルートオブジェクトの回転に反映されなくなります。

チェックを入れない場合はアニメーションの回転がゲームオブジェクトの回転に影響を与えるのでスクリプトで回転を制御したい場合はチェックを入れておきます。

Based Uponは回転のルート位置の設定でOriginalはアニメーションのデータ通り、Body OrientationはBodyの前方ベクトルに合わせます。

Bake Into Poseのチェックを外すと

TransformがRotationに影響を与える

↑のように右側のキャラは不必要に回転してしまってます。

Bake Into Poseにチェックを入れBased UponにBody Orientationを設定し、Offsetに30を入れて確認してみます。

RootTransformRotationのOffsetを変える

↑のように右側のキャラクターは30度ほど回転した状態から始まります。

Root Transform Position(Y)

Root Transform Position(Y)のBake Into Poseにチェックを入れるとアニメーションの値がルートオブジェクトのY座標に反映されなくなります。

スクリプトで制御する場合はチェックを入れます。

Based UponはY座標の基準値の設定でOriginalはアニメーションの基点、Center Of Massは重心、Feetは足元に設定します。

Offsetは足元からの調整値を設定します。

Bake Into Poseのチェックを外して確認すると

RootTransformPosition(Y)のチェックを外す

↑のように右側のキャラが地面スレスレで回転しているだけになります。

これだと少し解り辛いのでアニメーションクリップの下に表示されるサンプルで確認してみましょう。

RootTransformPosition(Y)のBakeIntoPoseのチェックの違い

左がBake Into Poseにチェックを入れた場合、右側がチェックを入れない場合です。

ベースとなる位置が左側だとずっと同じ位置、右側はジャンプに合わせて上に移動しています。

Root Transform Position(XZ)

Root Transform Position(XZ)のBake Into Poseにチェックを入れるとアニメーションの値をルートオブジェクトのX、Z軸に反映させません。

Based Uponは基準値の設定でOriginalはアニメーションのデータ、Center Of Massは重心を基準にします。

これはちょっとわかり辛いですがルートオブジェクト(基点となる位置)を焼きこむのでチェックを入れるとアニメーションの動きでキャラクターが移動しているように見えます。

例えばBake Into Poseにチェックを入れBased UponをOriginalとすると

RootTransformPosition(XZ)のBakeIntoPoseにチェックを入れる

↑のように基点となる位置が焼きこまれアニメーションはそこを基点にして作成してある為、実際のアニメーションでキャラが動きます。

Bake Into Poseのチェックを外すと

RootTransformPosition(XZ)のBakeIntoPoseにチェックを入れない

↑のように基点となる位置も一緒に移動する為、実際のアニメーションでキャラが動きません。

シーンビューで確認してみると

RootTransformPosition(XZ)のBakeIntoPoseのチェックの有無の確認

↑のようにBake Into Poseにチェックを入れるとアニメーションの動きでキャラが動いています。

Mirror

MirrorはRigのAnimation TypeをHumanoidにしている時だけ有効になる項目で、アニメーションを左右反転させる事が出来ます。

AnimationClipのMirrorにチェックを入れる

左側が通常、右側がMirrorにチェックを入れたキャラクターです。

Additive Reference Pose

Additive Reference Poseはリファレンスポーズを設定する事が出来ます。

タイムライン上の青い矢印をドラッグするか、

AnimationClipタイムラインの矢印を移動

Additive Reference Poseの下のPose Frameに直接フレーム番号を指定します。

Pose Frameに直接フレーム番号を入力

リファレンスポーズの設定がどう影響するのかがちょっとわかりません・・・・(^_^;)

Curves

Curves

Curvesはアニメーションのパラメータ変数を指定し、アニメーションの再生位置に応じてパラメータを設定する事が出来ます。

AnimationビューのCurvesと使い方はほとんど同じですが、

アニメーションクリップ では、アニメーション可能なプロパティーならばすべて、アニメーションカーブ を利用することができます。すなわち、アニメーションクリップでそのプロパティーの変化を時系列に制御できます。Animation ビュー (左側) のプロパティーリストには、現在アニメーションしているプロパティーが表示されます...

AnimationClipのCurvesではパラメータ変数を指定しその変数の値をスクリプトから参照する事が出来るのでキャラクターの見た目に応じてコライダのサイズを調整するといった事が出来るようになります。

Unityで使う当たり判定(コライダ)のサイズをアニメーションに応じて変更し、ジャンプ中のキャラクターのコライダのサイズを変更し狭い空間を通過出来るようにしてみます。

Events

Events

Eventsはアニメーションの再生位置に応じてアニメーションイベントを設定する項目です。

AnimationビューのAnimation Eventsと同じように使用出来ます。

You can increase the usefulness of Animation clips by using Animation Events, which allow you to call functions in the object’s script at specified points...

足を地面に着いた時に足音を鳴らしたり、剣を上から振りおろす時に音を鳴らしたいといった時にアニメーションイベントを設定するとアニメーションの再生位置のタイミングでアニメーションイベントを発生させ、スクリプトで処理を行う事が出来ます。

Unityのアニメーションイベントを使い、歩くアニメーションで地面に足を着いた時に足音を鳴らしたり剣を振っている途中で剣を振った時の音を鳴らしたりしたいと思います。

Mask

Mask

Maskでアニメーションを体の部位によって再生するかしないかを設定する事が出来ます。

この項目はAssetsフォルダで右クリック→Create→Avatar Maskでアバターマスクを作成しインスペクタで表示したものとほとんど同じです。

マスキングを行えばクリップ中のアニメーションデータの一部を破棄できるので、オブジェクトやキャラクターを部分的に動かすことができます。例えば、腕と脚両方のモーションを含む標準の歩行をするアニメーションがあるとします。しかし、そのキャラクターが大きな荷物を両手で持っている場合は、歩きながら腕を振って欲しくないでしょう。この...

Definitionの項目でCopy From Other Maskを選択し、自身で作成したアバターマスクを指定すればその設定を使用する事が出来ます。

DefinitionをCreate From This Modelにすればその下のHumanoid、Transformでマスクを指定する事が出来ます。

アバターマスクに関しては

体の一部分だけのアニメーションを変更したい場合はAnimatorControllerのレイヤーとアバターマスクを使う事で実現出来ます。

を参照してください。

Motion

Motionはカスタムのルートモーションノードを指定します。

Root Motion NodeをNone以外に設定すると記事の最初の方に記したルートモーションの項目は選択出来なくなります。

↓がRoot Motion NodeをNoneにした場合です。

ルートモーションは足元

次にRoot Motion NodeにボーンのNeckを設定した場合です。

ルートモーションをNeckに設定

首の部分がルートモーションノードになっています。

実際に動かしてみると、

ルートモーションをNeckにしたサンプル

↑のように首を中心にアニメーションが再生されます。

ルートモーションノードに関しては

インポートしたアニメーションクリップにルートモーションが含まれている場合、そのアニメーションを再生するとゲームオブジェクト自体が移動/回転されます。しかし場合によっては、アニメーションファイルの階層構造から、別のノードをアニメーションのルートとして、手動で指定しなければいけないことがあります。

Unityマニュアルを参照してください。

終わりに

アニメーションクリップのルートモーションの設定は今までいいかげんにやってきましたので今回でなんとかものにしようと試みました。

が・・・少し混乱しました。

単純にそれぞれの項目でのBake Into Poseのチェックをしたらこうなる、外したらこうなる、とそれぞれの項目で同じ感じでチェックが出来ない事がわかりました。

Bake Into Poseにチェックを入れれば単純にスクリプトで制御出来ると思っていたんですが、Bake Into Poseでチェックを入れた場合それぞれのアニメーションの基点となる位置の焼きこみを行うかどうかの設定なので、

Root Transform Position(Y)とRoot Transform Position(XZ)ではちょっと変わってきますね。

単純にいけばRoot Transform Position(Y)のBake Into Poseのチェックを入れ、Root Transform(XZ)のBake Into Poseのチェックを外すという感じでしょうか。

まぁ・・・アニメーションの作り、スクリプトだけでキャラクターを制御する等によって変わってくるとは思います。

記事内で紹介している以外の参考サイト

Unityマニュアルールートモーションの仕組みー

Unityマニュアルーアニメーションクリップー

スポンサーリンク

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

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