はじめに
攻撃モーションなどの単発モーションをRootMotion付きのAnimMontageで実装することは多いですが、「BlendOutが始まるまでキャラクターが移動入力で動かせない」ことでアクションの手触りが悪くなることがしばしばあります。 とはいえ、BlendOutの始まりを早くしたり、BlendOutの時間を長くすると…移動入力をしないときの動き・見栄えが悪くなります。例えば、武器を振ったあとのフォロースルーや残心的な動きを表現できなくなります。
という悩みを Unreal Engine でアクションゲームを作っている人の8割は感じた事があるかと思いますが、先日公開されたEpic公式サンプル「GameAnimation サンプル」ではその対策として「Early Blend out」が入っていたりします!
下の動画はフォロースルーが長めのアクションに対して「Early Blend out」を入れてみたというものです。右側のコントローラの表示を見ての通り、移動入力がないときはモーションを最後まで再生しますが、移動入力があるときはアッパー後にすぐ移動再開してます!
設定はかんたんで、移動入力によるキャンセルを入れたり区間で専用のAnimNotifyStateを設定するだけです。
色々便利だったり応用も効く実装かなと思うので、かんたんに紹介・解説します!
Early Blend out
このAnimNotifyStateは GameplayAnimationサンプルの下記BPにて実装されています。
/Game/Blueprints/AnimNotifies/BP_NotifyState_MontageBlendOut
スニペット https://dev.epicgames.com/community/snippets/p8ea/unreal-engine-animnotifystate-early-blend-out-bp_notifystate_montageblendout-in-gameanimationsample
実装はシンプルで、「移動入力のベクトルが ほぼ 0 ではない」 場合は 再生中の Montage を停止する( = BlendOutを開始する)というものです。
また、BP_NotifyState_MontageBlendOut
では 落下状態(Falling)になるとBlend Outする処理も含まれています。
この処理がないときとある時の比較はこの通り
ただサンプルの通りだと、移動入力と落下によるBlendOut処理が併用できないので注意です。ただEnumで分岐してるだけなので、このあたりをサクッと改造するのがオススメです。
あとは、AnimNotifyStateのNotifyTickはその名の通り頻繁に呼ばれる処理なので、サクッとC++で組むのも良いかと思います!
余談
少し話が外れますが、AnimNotifyStateのGetNotifyName
関数を使うことで、Enumの設定値に応じて表示を変えてるのが丁寧ですね!
さいごに
今回の内容はちょっとしたことですが、こういうことの積み重ねでゲームの手触りの良さが出てきます!色々と試してみましょう~!