[UE4]BPだけでOvershootするBlendを作ってみる

概要

C++を使わず、Blueprint機能だけでOvershootするAnimation Blendを作ってみる。

C++を使った場合の例はこちらの記事参照。

・Blendノードそのものを作るわけではない

・この実装だとあまり実用的ではない

・概念を理解することが目的

手順

空のProjectから順に作っていく。

AnimationとSkeletal Mesh準備

自前で用意する場合は不要。

本記事では、Marketplaceから”Animation Starter Pack”(以下ASP)を取得し

その中のAnimationとMannequinモデルを使って解説する。

※Epic Launcherの言語設定が日本語だと、カタカナで「アニメーションスターターパック」になっているので注意

Animation Blueprint準備

コンテンツブラウザから、Animation Blueprint(以下ABP)を作成。

名前は何でもよいが、本記事では”ABP_PoseActor”とする。

Actor準備

空のActor Blueprintを作成する。

名前は何でもよいが、本記事では”PoseActor”とする。

PoseActorにSkeletalMesh Componentを追加する。

SkeletalMeshにMannequinと上記のABP_PoseActorを割り当てる。

Animation準備

ABPのAnim Graphで下記の様に組んでみる。

実装結果のわかりやすさのため、PlayノードのDetailsから、Play Rateを0.0にして、動きを止めておく。

この状態で、Anim Preview Editorから”Is Aiming”をオンオフすると、一瞬で待機と構えが切り替わるはず。

Additive Animationを作る

コンテンツブラウザ上で”Idle_Rifle_Ironsights”アセットをコピーし、別名をつける。

ここでは”Idle_Rifle_Ironsights_Additive”とした。

コピーしたAnimationを開き、Asset DetailsのAdditive Settingsで以下のように設定する。

これで、”Idle_Rifle_Hip” から “Idle_Rifle_Ironsights” に遷移する際のAdditive Animationができた。

Additive Animationについては以下の記事で「差分モーション」として詳しく解説されている。

西川善司の3Dゲームファンのための「ガンスリンガー ストラトス」グラフィックス講座(後編) - GAME Watch

作ったAnimationをAnim Graphで接続する。

上記の状態だと、”Is Aiming”がfalseでも構えたままになるし、trueだと変な姿勢になるはずだ。

さらに、制御すべき値を変数化する。

“To Aim Sec”は0.1

“Current Overshoot Alpha”は0.0にしておく。

“Current Overshoot Alpha”をスライダーでいじってみると、今からやることが何となく察せられると思う。

Blueprint Interface準備

PoseActor側から切り替え指示を出すためにBlueprint Interfaceアセットを作り、

“SwitchAim”インタフェースを作っておく。

Actor側からの指示を実装

適当にXキーから指示出し。

Curve Asset準備

Overshoot部分がどのような挙動になるかを決定するCurve Assetを作る。

“Current Overshoot Alpha”の制御用であるから、Float Curveでよい。

適当に名前を付ける。

中身を開き、以下のkeyを追加。

適当に山形にしておく。

ABPでの変数制御

ABP_PoseActorのEvent Graphを表示し、メニューバーのClass Defaultsを押して

作成したInterfaceをAddしておく。

“SwitchAim”を以下のように実装する。

↑の要件

・SwitchAimが呼ばれるたびに構えと待機が切り替わる

・構え姿勢に移行する際はOvershootなブレンドをする

・戻りは一瞬でよい

・切り替えてから”To Aim Sec”秒の間は、Anim GraphのBlendノードが指定した方法で補間処理を行う

・その時間経過後、”Current Overshoot Alpha”を調整する処理が始まる

・”Blend Start Sec”にブレンド開始時間を記録しておくことで、”ToAimSec”秒でBlendし終わったFrameでOvershootがどこまで進行しているのかを算出する

↑の要件

・”Overshoot Sec”でイキスギる時間を設定。ここでは0.1にした

・Overshootが終わるまで再帰的に自分を呼び出す

・Tickノードにつなぐのめんどいから、必殺ダブルDelayで毎Frame終了判定

・”Max Overshoot Alpha”は最大イキスギ量を決める。ここでは0.1にした

・”Overshoot Blend Curve”は上記のCurve Assetを制定

実行

それっぽいBlendがされているように見えるはず。

Cruveの形状を以下のようにしてみたり、各種変数の値を変えたり調整してみよう。

Anim GrpahのBlendノードのDetailsから、Linear以外のBlendを選ぶのも楽しい。

課題

・いちいちAdditive Animation作る必要があるやんけ!

・実行時に等価なものを計算すればよい。(要C++)

・すなわち、Blend時に「遷移元の姿勢」と「遷移先の姿勢」の「差分ポーズ」を計算する

・Pose Cacheとか使えばBlueprintだけでもひょっとしたらできるかも

・CurveAssetの上昇部分と”Overshoot Sec”を調和させないとカクつくやんけ!

・ほんまや

・「演人戦隊グレイマン」での実装はCurve Asset使わずに放物線を計算で出してた

・イキスギた後、ちょっとモドリスギるとかはできないんか?

・この実装だとできないが、この記事中で述べた手法を再構成すればできるだろう

・構えへの移行を完全にAdditiveで行うようにして、その割合を制御すれば…

・これゲームの起動時間長くなってくると”Current Sec”の精度悪くなるよね?

・なる

・C++化する際は、FPlatformTime使えばdoubleで得られる

以上