C++を使わず、Blueprint機能だけでOvershootするAnimation Blendを作ってみる。
C++を使った場合の例はこちらの記事参照。
・Blendノードそのものを作るわけではない
・この実装だとあまり実用的ではない
・概念を理解することが目的
空のProjectから順に作っていく。
自前で用意する場合は不要。
本記事では、Marketplaceから”Animation Starter Pack”(以下ASP)を取得し
その中のAnimationとMannequinモデルを使って解説する。
※Epic Launcherの言語設定が日本語だと、カタカナで「アニメーションスターターパック」になっているので注意
コンテンツブラウザから、Animation Blueprint(以下ABP)を作成。
名前は何でもよいが、本記事では”ABP_PoseActor”とする。
空のActor Blueprintを作成する。
名前は何でもよいが、本記事では”PoseActor”とする。
PoseActorにSkeletalMesh Componentを追加する。
SkeletalMeshにMannequinと上記のABP_PoseActorを割り当てる。
ABPのAnim Graphで下記の様に組んでみる。
実装結果のわかりやすさのため、PlayノードのDetailsから、Play Rateを0.0にして、動きを止めておく。
この状態で、Anim Preview Editorから”Is Aiming”をオンオフすると、一瞬で待機と構えが切り替わるはず。
コンテンツブラウザ上で”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”をスライダーでいじってみると、今からやることが何となく察せられると思う。
PoseActor側から切り替え指示を出すためにBlueprint Interfaceアセットを作り、
“SwitchAim”インタフェースを作っておく。
適当にXキーから指示出し。
Overshoot部分がどのような挙動になるかを決定するCurve Assetを作る。
“Current Overshoot Alpha”の制御用であるから、Float Curveでよい。
適当に名前を付ける。
中身を開き、以下のkeyを追加。
適当に山形にしておく。
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で得られる
以上