読者です 読者をやめる 読者になる 読者になる

いんでぃーづ

個人でゲーム開発してる上で吸収したモノたち紹介。UnityからGIMPまでなんでも。デザインとかゲーム論まで語っちゃうよ的なアレ。

MENU
{スポンサーリンク}

Unity : アニメーションとGameObjectの位置を同期させたい時に気をつけること

Unity Tips

Mecanim(AnimatorController)はNavMeshAgentやCharacterControllerと一緒に使うケースがほとんどではないでしょうか。

その場合についてまわるのが
アニメーションに合わせてGameObjectのTransformを移動するか
という問題です。
思ったとおりの動作をさせるにはそれぞれに合った設定が必要になり、ハマることがあります。

参考素材はおなじみのアセットを使っています。
いつもお世話になっております。

https://www.assetstore.unity3d.com/jp/#!/content/7673
https://www.assetstore.unity3d.com/en/#!/content/5330

ApplyRootMotionのチェック

3Dモデルが前方に歩いていくアニメーションを例にとります。

AnimatorControllerを見るとチェックボックスがあります。

f:id:sugar_affordance:20160514095131p:plain

チェックが入っていると、アニメーションによってモデル自体が前方に移動していきます。

f:id:sugar_affordance:20160514095140g:plain

このチェックを外すと、アニメーションによってGameObjectの位置は変わらなくなります。

f:id:sugar_affordance:20160514095134g:plain

チェックを入れてもモデルの位置が移動しない場合、そもそも使っているAnimationClip自体が位置を変更しない類のものだと思われます。パントマイマーのアニメーしょんとかがそうですね。違うよね。

アニメーションとTransformの位置が同期してくれない場合

単にApply Root MotionをONにしただけでは、位置の同期がうまくいかない場合があります。

インスペクタービューでアニメーションを表示し、Animationsタブを選択することでパラメータを見てみましょう。

f:id:sugar_affordance:20160514095146p:plain

何もチェックが入っていないですね。
この状態でアニメーションとTransformの値がどうなっているか見てみます。

f:id:sugar_affordance:20160514095151g:plain

ちゃんとアニメーションに合わせてTransformの位置も変わっていますね。
では次に、Root Transform Position (Y)Bake Into Pose にチェックを入れて実行してみましょう。

f:id:sugar_affordance:20160514095210g:plain

インスペクタの値を眺めていると、Y座標が0のままであることがわかります。

これの何がまずいかって、何らかのコライダーを付けている場合、コライダーのY座標が変わらないんですよ。
つまり、ジャンプしているように見えるのに、足元の障害物に引っ掛かってしまうという状況が発生してしまいます。

BakeIntoPoseのチェックを外すことで、アニメーションとGameObjectの位置の同期がとれます。
もちろんApplyRootMotionのチェックも入れます。

もしアニメーションとTransformの動きが一致しないというときは、AnimationClipの設定も確認しましょう。

Amazon.co.jpアソシエイト