アクションゲームを作っている際に、攻撃で踏み込んだり、ジャンプしたりしますが、アニメで設定した移動をオブジェクトに反映する方法がイマイチうまくいかず、ココ最近詰まっていたところが一旦のやり方が分かりましたので記載。
「AnimationType」が「Humanoid」では方向などがおかしくなっていませんでしたが、敵キャラなどHumanoidで設定できないキャラを「Generic」にした場合に方向や移動量などがおかしくなっていたので、その解決策です。
やりたいこと
四足や鳥など「AnimationType」が「Generic」のもので、
・アニメで設定した移動をオブジェクトに反映したい
・CharacterControllerごと移動して壁などに貫通させない
やり方
今回のテストでは一旦3dsmaxユーザーお馴染みのティーポットを使用しました。
・3dsmaxの準備
リグの構成としては基本的に以前に紹介したリグの構成と変更ありません。
細かい構成の説明は以下のリンクを参照ください。
【Unity+3dsmax】UnityのHumanoid用リグ – ツクロウヤ
今回の構成では簡単にこんな感じになっています。
以前と違う点としては、「SKL_Root」に対してUnityに反映させたいアニメを焼き込むようにしています。直接このオブジェクトを動かすのはよろしくないので、CTR_MoveAllに対して位置コンストレイント、方向コンストレイントを掛けて、CTR_MoveAllにアニメのキーを打ち、出力時の設定でアニメを焼き込んでいます。
出力方法に関しても以前の記事を参照お願いします。
【Unity+3dsmax】Unityへのモデル+アニメの出力方法 – ツクロウヤ
・Unityの準備
【Root node の設定】
出力したFBXをUnity側で設定が必要です。
ImportSettingで「Root node」で反映させたいアニメを付けたオブジェクトを設定します。今回の場合では「SKL_Root」が該当します。
※3dsmaxで書き出したものはUnityと軸が違いますのでプレビューでおかしな方向を向いているかと思いますが問題ありません。
(この辺をそもそも3dsmaxの出力時に解決できればごちゃごちゃやらなくてもいいかも…?)
方向を合わせるには以前のリグ説明と同じく、「ALL_Root」のオブジェクトを回転させてます。
【アニメーションクリップの設定】
この状態でアニメを確認すると以下の画像のようになります。
ここで問題があり、「Animator.RootT」と「SKL_Root」の両方があるため、倍動く状態になっています。また親のPosition,Rotation,Scaleのキーは不要ですし、ALL_Rootも方向制御用のものですので、キーは不要です。
モデルの中にあるアニメのキーは直接編集することが出来ませんので、アニメを「Ctrl+D」で複製することで編集可能にします。そして、不要なキーを削除してあげましょう。
削除した後は以下のような感じになります。
【Animatorの設定】
これまでの設定でRootに対してアニメが付いている状態となりますので、AnimatorのComponentの設定で「Apply Root Motion」にチェックを付けてあげます。
この項目にチェックが付いているとRootのアニメがオブジェクトのTransformに反映されます。
他アニメなどの制御でチェックが付いているとおかしくなる場合もあるため、アニメ時にRootの移動がある場合のみスクリプトでチェックをOnにしてあげます。
まとめ
【やり方まとめ】
1. 3dsmaxのリグでアニメを反映させたいオブジェクトを作成
2. [1.]のオブジェクトにアニメを焼き込み
3. 「Root node」に[1.]のオブジェクトを設定
4. アニメを編集可能なように複製(Ctrl+D)
5. 不要なキーを削除(重複、親、方向制御用オブジェクト)
6. 移動を反映させたいアニメでスクリプトからAnimatorの「Apply Root Motion」をOnに
ちゃんと動いているところをGIFとかにしたいですが今日はめんど(ry
近いうちに結果をGIFとかで貼っつけて更新します。
それでは今回はこの辺で
(´・ω・`*)ノシ
コメント