最初に
どうも、ろっさむです。
今回は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
時は攻撃アニメーションがそのまま再生されるようになりました!
参考