Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【UE4】上半身と下半身のアニメーションを別々にしてコンボ攻撃のアニメーションをブレンドする

最初に

どうも、ろっさむです。

今回はUE4でAnimMontageを使用してアニメーションを再生している際に、どのようにして上半身と下半身、異なるモーションを用いてブレンドするのかをまとめようと思います。

この記事ではAnimMontageの詳しい使用方法や実際の使い方に関しては紹介しません、ご了承ください。

目標

今回の目標はコンボ攻撃をしながら走った場合、足は走るために動き、上半身はコンボ攻撃の動きをする、というものです。ついでに止まってる時はコンボ攻撃アニメーションを優先して再生させます。

ComboAttack_fix.gif

作り方

まずは普通に再生してみる

シンプルにAnimMontageが再生された場合、アニメーションの上書きを行うなら以下のようになります。

image-20201109223222989.png

ただし、この状態ですと

  • 基本はLocomotion側でOutputされたアニメーションを再生
  • スロットアニメーションに再生命令が入った時にはスロットアニメーションの再生が優先され、Locomotion側でのアニメーションは再生されません。

つまりこの状態で走りながらコンボ攻撃アニメーションを再生すると、以下のようになります。

ComboAttack00.gif

見事に足が滑っていますね。

ブレンドを行ってみる

走りアニメーションとコンボ攻撃アニメーションをそれぞれ、下半身と上半身に分けてアニメーションのブレンドを行う際には、Layerd blend per boneというノードを使用します。

image-20201109224352352.png

このノードのBasePoseLocomotion側でのOutputアニメーション、つまり走りアニメーションを繋ぎ、BlendPoses0にスロットアニメーションを繋ぎます。Blend Weight 0はデフォルトの数値のままとしておきます。

image-20201109224540855.png

次に、Layered blend per boneのDetailsからLayer Setupを確認します。ここでBranch Filtersの+マークを押してmemberを追加し、Bone Nameを入力します。このBone NameはどのボーンからBlendPoses0を適用するか、という設定なので、使用しているモデルの腰あたりのボーン名を確認して入力しましょう。設定したボーン以下の子ボーンがブレンドされます。今回のモデルではbody以降をアニメーションブレンドさせたいと思います。

image-20201109231433802.png

次にBlend Depthですが、これは公式リファレンスでは単に「1」に設定してくださいとしか書いてありませんでしたが、この値はどうやら 1.f / (float) BlendDepth という式に使用され、設定したボーンから子ボーンにかけてBlendDepthの数だけ徐々に段階的にアニメーションの適用率を大きくするようです。

例えば、各数値を設定した場合は以下のようになります。

  • 0または1と設定するとbody以降の子ボーンは全て100%ブレンド
  • 3と設定するとbody33%headL_arm01R_arm01bustは66%、それ以降の子ボーンは100%ブレンド
  • -1と設定するとbody以降の子ボーンは全て0%のブレンドとなり、アニメーションが再生されない

これを踏まえて今回は3と設定しておきます。走っている最中で腰部分が激しく動いているとグニャグニャ動いてるように見えて不自然なので、bodyのブレンド率は低めとします。

Mesh Space Rotation Blendに関しては、デフォルトだとブレンドするアニメーションのRotationがそのまま反映されます。ただ、その場合は攻撃アニメーションが誤った方向に回転したり、頭などが不自然に動いたりします。

なのでチェックをつけておきましょう。

Mesh Space Scale Blendに関しては、今回Scaleをいじるアニメーションを特に使用していないため、デフォルトのままにしておきます。以降のパラメータもデフォルトとします。

今回のモデルでは以下のような設定となりました。

image-20201109235326430.png

これで走りながらコンボ攻撃アニメーションが再生されるようになりました。

が、この状態だとスロットアニメーションが設定されてない場合、つまりコンボ攻撃アニメーションをしていない時は上半身がTポーズのそれになってしまいます。

image-20201110001333040.png

なので、スロットアニメーションからアニメーション再生命令がでるまでは、Locomotion側でOutputしてるアニメーションを再生するようにします。

Cached poseを使用する

最初の、Locomotionの次にスロットアニメーションを繋ぐことで、普段はLocomotionでの結果が出力され、スロットアニメーションに再生命令が来た際はそちらを優先して出力するという仕組みを利用します。ただし、ABPの中でLocomotionを2つ以上繋ぐノードが存在する場合はPoseをキャッシュして、そのPoseを参照する形でノードを繋ぐ必要があります。

PoseのキャッシュにはNew Save cached pose...を選択します。

image-20201109170520884.png

このキャッシュ用のノードに名前を設定しておきます。

image-20201110002638617.png

作成したキャッシュ用のノードは検索にも名前で引っ掛かるようになります。

image-20201110002757021.png

このキャッシュノードを使用して改めて組んだものがこちらです。

image-20201110002735335.png

これで以下のように、走りながらコンボ攻撃アニメーションを再生できますし、立ち止まってもTポーズになることはありません。

ComboAttack01.gif

この状態でも充分であればそれはそれで良いのですが、今回使用している攻撃アニメーションには足の動きもついているため、立ち止まっている時は足の動きは反映させるようにしておきたいと思います。

Blend Poses by boolを使用してIdle時とRun時で分岐させる

このIdle時とRun時で処理を分岐させるために使用するのはLocomotion側でも使用しているアクターの移動速度用変数と、その値によってブレンド時間を入れつつアニメーションを切り替えるBlend Poses by boolノードです。

image-20201110003256409.png

これはActive Valueに繋いだ値がtrueならTrue Poseを出力する見たままのノードです。

移動速度に関しては今回Speedという名前で定義し、EventGraphで取得しています。

image-20201110003434996.png

このSpeedの値が0より大きい場合は移動していることになるので、これまで作ってきたノード群を繋ぎ、Speed0なら前進でスロットアニメーションを優先で再生する状態に組みます。

image-20201110003726005.png

これでIdle時は攻撃アニメーションがそのまま再生されるようになりました!

ComboAttack03.gif

参考

https://docs.unrealengine.com/ja/Engine/Animation/AnimHowTo/AdditiveAnimations/04_BlendSettings/index.html

https://answers.unrealengine.com/questions/336798/how-to-use-blend-depth-in-layered-blend-per-bone-n.html

https://answers.unrealengine.com/questions/387906/what-does-the-blend-depth-parameter-in-layered-ble.html?sort=oldest

https://unrealengine.hatenablog.com/entry/2015/02/20/220000

https://dawnarc.com/2018/04/ue4animation-blending-notes/

4_mio_11
スローペースで生きてます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away