ぼっちプログラマのメモ

UE4とかUE5とかについて書いたり書かなかったり。

【UE5】移動入力・落下により再生中のAnimMontageをキャンセルするAnimNotifyStateについて

はじめに

攻撃モーションなどの単発モーションをRootMotion付きのAnimMontageで実装することは多いですが、「BlendOutが始まるまでキャラクターが移動入力で動かせない」ことでアクションの手触りが悪くなることがしばしばあります。 とはいえ、BlendOutの始まりを早くしたり、BlendOutの時間を長くすると…移動入力をしないときの動き・見栄えが悪くなります。例えば、武器を振ったあとのフォロースルーや残心的な動きを表現できなくなります。

という悩みを Unreal Engine でアクションゲームを作っている人の8割は感じた事があるかと思いますが、先日公開されたEpic公式サンプル「GameAnimation サンプル」ではその対策として「Early Blend out」が入っていたりします!

下の動画はフォロースルーが長めのアクションに対して「Early Blend out」を入れてみたというものです。右側のコントローラの表示を見ての通り、移動入力がないときはモーションを最後まで再生しますが、移動入力があるときはアッパー後にすぐ移動再開してます!

www.youtube.com

設定はかんたんで、移動入力によるキャンセルを入れたり区間で専用の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の設定値に応じて表示を変えてるのが丁寧ですね!

さいごに

今回の内容はちょっとしたことですが、こういうことの積み重ねでゲームの手触りの良さが出てきます!色々と試してみましょう~!