📄

【UE5】アニメーションモンタージュのカーブを使ったモーション流用と位置補正

に公開

はじめに

ゲームで複数のボタンそれぞれに対して押す動きが必要な時など、1つのモーションを流用できると工数的にも容量的にも嬉しい場面は多いかと思います。今回はそんなケースに使えるかもしれない方法を考えてみましたので、エレベーターのボタンを押すシチュエーションを例にご紹介します。

https://youtu.be/YTYNeKAeneM

用意したデータ

mixamoの「ButtonPushing」を改良して、壁のスイッチを押す感じのモーションを作成しました。
このモーションのボタンを押す場所を補正してしていきます。

モデルはfabのこちらのデータを使用させていただきました。
https://www.fab.com/ja/listings/d7b15487-b7c7-4d68-86b6-3c8e3f4950c4

ボタンを押す場所にコンポーネントを作成

レベルに配置したモデルのブループリントからボタンの位置を取得できるようにするため、ブループリント自体にシーンコンポーネントを追加してボタンの位置に設定しました。

コントロールリグの設定

IKの作成

ボタンを押す方の腕にIKを作成し、動かすためのコントローラーを用意します。
最終的にこのコントローラーの位置をボタンの位置に合わせていきます。
一応PV用のコントローラーも用意しましたが常にひじのジョイントの位置に合わせました。

IKのブレンド構造を作成

ブレンド用の変数(BlendWeight)と押すボタンの位置を入れておく変数(ButtonLocation)を用意します。どちらもアニメーションBPで設定するのでパブリックな状態にしておきます。

BlendWeight変数の値でIKコントローラーの位置を制御できるようにします。
0の時は再生中のアニメーション通り、1の時はButtonLocation変数の位置になるようにノードを組みました。

アニメーションモンタージュの設定

アニメーションシーケンスからモンタージュを作成したら、次はブレンド値を操作するためのカーブを作成します。カーブの▼マークをクリックして、カーブを追加 > カーブを作成 で作ることができます。

作ったカーブの▼マークのメニューからカーブを編集を選択するとカーブエディタが開きますので、キーを打って調整していきます。基本的に動き始めに0でキーを打ち、ボタンの位置に腕を上げ切ったところから押し終わるまでが1、腕を下に戻しきるところで0という感じに、動きの転換タイミングにキーを打つとスムーズにブレンドできます。

レベルとプレイヤーのBPの設定

基本的な動作ロジックを構築します。

  • レベルブループリントでボタンのブループリントをプレイヤーの変数に設定
  • キーボードの1、2、3を押すとそれぞれの数字のボタンの位置を変数に設定
  • キーボードのQでボタンを押すアニメーションを再生


ボタンBPのオブジェクト参照を設定

ボタンの位置を変数に記録

アニメーションモンタージュの再生

アニメーションBPの設定

アニメーションBP側にもコントロールリグと同様にBlendWeightとButtonLocationという変数を作っておきます。
アニメーションが初期化されたときに実行されるEventBlueprintInitializeAnimationでプレイヤーのブループリントのオブジェクト参照を変数に設定しておき、アニメーションが更新されたときに実行されるEventBlueprintUpdateAnimationでプレイヤーのButtonLocationの値をアニメーションブループリントの変数に移します。BlendWeight変数にもGetCurveValueでカーブから値を取得して設定しています(PushBlendはモンタージュで作成したカーブ名です)

AnimGraphではモンタージュを有効にするためSlot'DefaultSlot'を使用したあと、コントロールリグにアニメーションブループリントの変数の値を設定しています。

アニメーションの調整

ここまでで機能としては完成していますが、動かしてみてアニメーションに違和感があったため、
コントロールリグのAimノードを使ってspine4, spine5, headを若干ボタンの方に向ける調整を行いました。またプレイヤーの位置も各ボタンを押したときに腕が伸びきらない丁度いい場所に置かないといけないため調整を行っています。

Discussion