最初に
どうも、ろっさむです。
今回はUE4でAnimMontageを使用してアニメーションを再生している際に、どのようにして上半身と下半身、異なるモーションを用いてブレンドするのかをまとめようと思います。
この記事ではAnimMontageの詳しい使用方法や実際の使い方に関しては紹介しません、ご了承ください。
目標
今回の目標はコンボ攻撃をしながら走った場合、足は走るために動き、上半身はコンボ攻撃の動きをする、というものです。ついでに止まってる時はコンボ攻撃アニメーションを優先して再生させます。
作り方
まずは普通に再生してみる
シンプルにAnimMontageが再生された場合、アニメーションの上書きを行うなら以下のようになります。
ただし、この状態ですと
- 基本は
Locomotion側でOutputされたアニメーションを再生 - スロットアニメーションに再生命令が入った時にはスロットアニメーションの再生が優先され、
Locomotion側でのアニメーションは再生されません。
つまりこの状態で走りながらコンボ攻撃アニメーションを再生すると、以下のようになります。
見事に足が滑っていますね。
ブレンドを行ってみる
走りアニメーションとコンボ攻撃アニメーションをそれぞれ、下半身と上半身に分けてアニメーションのブレンドを行う際には、Layerd blend per boneというノードを使用します。
このノードのBasePoseにLocomotion側でのOutputアニメーション、つまり走りアニメーションを繋ぎ、BlendPoses0にスロットアニメーションを繋ぎます。Blend Weight 0はデフォルトの数値のままとしておきます。
次に、Layered blend per boneのDetailsからLayer Setupを確認します。ここでBranch Filtersの+マークを押してmemberを追加し、Bone Nameを入力します。このBone NameはどのボーンからBlendPoses0を適用するか、という設定なので、使用しているモデルの腰あたりのボーン名を確認して入力しましょう。設定したボーン以下の子ボーンがブレンドされます。今回のモデルではbody以降をアニメーションブレンドさせたいと思います。
次にBlend Depthですが、これは公式リファレンスでは単に「1」に設定してくださいとしか書いてありませんでしたが、この値はどうやら 1.f / (float) BlendDepth という式に使用され、設定したボーンから子ボーンにかけてBlendDepthの数だけ徐々に段階的にアニメーションの適用率を大きくするようです。
例えば、各数値を設定した場合は以下のようになります。
-
0または1と設定するとbody以降の子ボーンは全て100%ブレンド -
3と設定するとbodyは33%、headとL_arm01、R_arm01、bustは66%、それ以降の子ボーンは100%ブレンド -
-1と設定するとbody以降の子ボーンは全て0%のブレンドとなり、アニメーションが再生されない
これを踏まえて今回は3と設定しておきます。走っている最中で腰部分が激しく動いているとグニャグニャ動いてるように見えて不自然なので、bodyのブレンド率は低めとします。
Mesh Space Rotation Blendに関しては、デフォルトだとブレンドするアニメーションのRotationがそのまま反映されます。ただ、その場合は攻撃アニメーションが誤った方向に回転したり、頭などが不自然に動いたりします。
なのでチェックをつけておきましょう。
Mesh Space Scale Blendに関しては、今回Scaleをいじるアニメーションを特に使用していないため、デフォルトのままにしておきます。以降のパラメータもデフォルトとします。
今回のモデルでは以下のような設定となりました。
これで走りながらコンボ攻撃アニメーションが再生されるようになりました。
が、この状態だとスロットアニメーションが設定されてない場合、つまりコンボ攻撃アニメーションをしていない時は上半身がTポーズのそれになってしまいます。
なので、スロットアニメーションからアニメーション再生命令がでるまでは、Locomotion側でOutputしてるアニメーションを再生するようにします。
Cached poseを使用する
最初の、Locomotionの次にスロットアニメーションを繋ぐことで、普段はLocomotionでの結果が出力され、スロットアニメーションに再生命令が来た際はそちらを優先して出力するという仕組みを利用します。ただし、ABPの中でLocomotionを2つ以上繋ぐノードが存在する場合はPoseをキャッシュして、そのPoseを参照する形でノードを繋ぐ必要があります。
PoseのキャッシュにはNew Save cached pose...を選択します。
このキャッシュ用のノードに名前を設定しておきます。
作成したキャッシュ用のノードは検索にも名前で引っ掛かるようになります。
このキャッシュノードを使用して改めて組んだものがこちらです。
これで以下のように、走りながらコンボ攻撃アニメーションを再生できますし、立ち止まってもTポーズになることはありません。
この状態でも充分であればそれはそれで良いのですが、今回使用している攻撃アニメーションには足の動きもついているため、立ち止まっている時は足の動きは反映させるようにしておきたいと思います。
Blend Poses by boolを使用してIdle時とRun時で分岐させる
このIdle時とRun時で処理を分岐させるために使用するのはLocomotion側でも使用しているアクターの移動速度用変数と、その値によってブレンド時間を入れつつアニメーションを切り替えるBlend Poses by boolノードです。
これはActive Valueに繋いだ値がtrueならTrue Poseを出力する見たままのノードです。
移動速度に関しては今回Speedという名前で定義し、EventGraphで取得しています。
このSpeedの値が0より大きい場合は移動していることになるので、これまで作ってきたノード群を繋ぎ、Speedが0なら前進でスロットアニメーションを優先で再生する状態に組みます。
これでIdle時は攻撃アニメーションがそのまま再生されるようになりました!
参考
















