2人のアニメーションを同期させて投げ技を完成させる

2人のアニメーションモンタージュを同期させて再生する方法。格闘ゲームの投げ技などに使えます。

環境と必要素材とプラグイン

  • エンジン: Unreal Engine 5.6.0
    今回のチュートリアルではサードパーソンテンプレートを使用しました。バリアントは必要ありません。
  • 必要素材: 同期させる2つのアニメーション
    私はFabで購入したWrestler Finishers Volume 1のDDTを使用しました。
    攻撃側(Attacker)と守備側(Defender)のアニメーションが入っています。
  • プラグイン: Contextual Animation
    UE5に最初から入っていますが、手動で有効化する必要があります。
  • プラグイン: Motion Warping
    UE5に最初から入っていますが、手動で有効化する必要があります。

プラグインの有効化

上メニューの 編集 > プラグイン からContextual AnimationとMotion Warpingを有効化して再起動してください。

アニメーションモンタージュの作成

同期させる2つのアニメーションシーケンスのEneble Root MotionとForce Root Lockにチェックを入れてください。

ぞれぞれアニメーションモンタージュを作成してください。

攻撃側のアニメーションモンタージュにはモーションワープが必要です。
攻撃発動時に攻撃側のキャラクターがモーションワープで指定した位置に移動してから、2つのアニメーションを再生させるためです。

通知トラックで右クリックして 通知ステートを追加 > モーションワープ を選択。
モーションワープは通知ステートであり、開始と終了の範囲を指定します。この範囲内でキャラクターが移動するわけです。
今回、DDTのアニメーションには技が発動する前の移動モーションがありませんから、タイムラインの先頭に狭い範囲でモーションワープを配置しています。

詳細のワープターゲット名は、Attackerにしておきます。

データアセットの作成

BP: データアセット ※円グラフアイコン
クラス: 状況に応じたアニメーション役割アセット
名前: DA_CAS_Roles
・新規作成。
・このデータアセットは、役割(ロール)を管理するためのものです。今回の場合、攻撃側(Attacker)と防御側(Defender)の設定をします。

コンテンツブラウザで右クリックして その他 > データアセット を選択。
データアセットは2種類ありますが、パックマンみたいな円グラフのアイコンの方です。

クラスの選択が求められます。
クラスは「状況に応じたアニメーション役割アセット」です。「シーンアセット」ではありません。役割とは英語でロールです。

名前はDA_CAS_Rolesにしました。
このデータアセット(DA)はContextual Animシーン(CAS)のロールという意味です。

DA_CAS_Rolesを開く。
役割の配列エレメントを追加して、2つにします。

インデックス[0]の名前をAttackerにする。
「キャラクターである」にチェックを入れる。
回転と拡大・縮小は、プレイヤーキャラクターであるBP_ThirdPersonCharacterと同じにします。回転のZに-90。ちなみに270と入力しても自動で-90に変換されます。

インデックス[1]の名前をDefenderにする。
「キャラクターである」にチェックを入れる。
回転と拡大・縮小は、エネミーキャラクターを想定して入力します。回転のZに-90。

各々が使用しているキャラクターの仕様に合わせてください。
カプセルのサイズが違うなら、そのサイズも同じになるように値を入力。

位置Zに-90を入力しても良いかもしれませんが、それをやるとキャラクターが床に埋まって落ちる現象が発生する可能性があると思われます。

Contextual Animシーンの作成

BP: Contextual Animシーン
名前: CAS_DDT ※自由に決めてください
・新規作成。
・Contextual Animationプラグインが有効化されている場合のみ、Contextual Animシーンを作成できます。

コンテンツブラウザで右クリックして アニメーション > Contextual Animシーン を選択。

名前はCAS_DDTにしました。

CAS_DDTを開きます。
設定 > 役割アセット にDA_CAS_Rolesを指定。
「ロールを更新」をクリックすると反映されます。

設定 > プライマリの役割 をAttackerにする。

プレビューデータの設定

これらはあくまでもプレビュー用です。

設定 > プレビューデータのオーバーライド の配列エレメントを追加して2つにします。

インデックス[0]の
役割をAttacker
タイプをSkeletal Mesh
プレビューアニメーションインスタンスをABP_Unarmed
プレビュースケルタルメッシュをSKM_Quinn_Simple

インデックス[1]の
役割をDefender
タイプをSkeletal Mesh
プレビューアニメーションインスタンスをABP_Unarmed
プレビュースケルタルメッシュをSKM_Manny_Simple

コリジョンの設定

設定 > 衝突時の挙動 は、「Ignore Channels」にして、「パラメータを無視するコリジョンチャンネル」の配列エレメントを追加します。

役割をAttackerにして、チャンネルを追加します。例えば3つ追加して、WorldStatic、WorldDynamic、Pawnを指定する。

Defenderも同じように設定します。

これで他の障害物への接触を気にすることなくアニメーションモンタージュが再生されます。
「Ignore Actor when Moving」でもある程度は上手く動作しますが、他の障害物のコリジョンに引っかかってズレる可能性があります。

新規AnimSetの登録

上メニューの +新規AnimSet をクリック。

インデックス[0]にAttacker、インデックス[1]にDefenderと記載されています。
それぞれに攻撃側の守備側のアニメーション モンタージュを指定してください。

移動モードは「Flying」にします。
Walkingのままだと、WorldStaticコリジョンを無視していますから床をすり抜けて落ちます。
アニメーションモンタージュが再生終了後、自動で元々の移動モードに戻ります。

OKをクリックすると、タイムラインに表示されます。

タイムライン

タイムラインを再生すると、2人のキャラクターの位置と回転がズレています。

調整するのは片方だけで良いですから、タイムラインの守備側を選択する。
そうすると「アセットの詳細」の一番下にSelected Anim Trackが表示されます。
そこの「シーンへのメッシュ」を開き、位置と回転の入力ができます。

Defender(守備側)の「シーンへのメッシュ」で位置と回転と調整します。
2つのアニメーション モンタージュが上手く組み合って再生されるかどうかは、この調整次第です。
今回は、位置Xを10、位置Yを100、回転Zを180にしました。

ワープポイント定義

Active Section > ワープポイント定義 の配列エレメントを1つ追加。

これは、アニメーションモンタージュに設置したモーションワープを発動させるためのものです。

ワープターゲット名はAttacker。
モードはCustom。
パラメータ > 原点 はDefender。これはDefender側が軸になるという意味です。Defenderの位置にAttackerが吸い込まれるように移動します。

もし、Attacker側に吸い込みたいような技であれば、Defenderにモーションワープを設定して、原点(軸)をAttackerにする必要があります。

必ず「ワープポイントを更新」をクリックして反映させてください。

プレイヤーキャラクターのブループリント

今回のチュートリアルではサードパーソンテンプレートを使用していますから、プレイヤーキャラクターのブループリントはBP_ThirdPersonCharacterになります。

状況に応じたアニメーションシーンアクタコンポーネント(ContextualAnimSceneActor)の追加

コンポーネントの+追加をクリックし、状況に応じたアニメーションシーンアクタコンポーネント(ContextualAnimSceneActor)を追加します。

モーションワープコンポーネントの追加

コンポーネントの+追加をクリックし、モーションワープコンポーネント(MotionWarping)を追加します。

CameraBoomのDo Collision TestをFalseにする

CameraBoomを選択し、詳細の カメラコリジョン > Do Collision Test のチェックを外してください。

Contextual Animationの発動自体には影響しませんが、これがTrueだとカメラが引っかかってガクガクする場合があります。

Contextual Animationのノード
Contextual Animationのノード
Contextual Animationを再生させるノードの基本的な形です。

Create Contextual Anim Scene Binding For Two ActorsのScene AssetにはCAS_DDTを指定しています。
・PrimaryにはAttackerを指定しましたから、Make Contextual Anim Scene Binding ContextのActorにはSelf(プレイヤーキャラクター自身)を繋ぎます。
・SecondaryのActorにエネミーキャラクターのActorを繋ぐわけです。

このままではテストできませんから、SphereでエネミーキャラクターをGetできるようにします。

Contextual Animationの動作テストノード

・キーボードのTを押すと、プレイヤーキャラクター周囲に半径300のスフィアが出現して、その中にいるPawn(Actor)をGetします。

エネミーキャラクターのブループリント

BP: ブループリント クラス > キャラクター
名前: BP_Enemy
・新規作成。
AnimクラスにABP_Unarmedを指定。
メッシュ > Skeletal Mesh AssetにSKM_Manny_Simpleを指定。
位置Zを-90、回転Zも-90。
状況に応じたアニメーションシーンアクタコンポーネント(ContextualAnimSceneActor)の追加

コンポーネントの+追加をクリックし、状況に応じたアニメーションシーンアクタコンポーネント(ContextualAnimSceneActor)を追加します。

今回はDefender側にモーションワープは使っておりません。
Defender側をモーションワープさせたい場合は、モーションワープコンポーネント(MotionWarping)の追加が必要です。

テストプレイ

エネミーキャラクターをレベルに配置してテストプレイ。

近づいてTキーを入力すると、DDTが発動します。
距離が離れていても、モーションワープで移動して同期します。
コリジョンも無視しますから、引っかかりません。

Contextual Animation終了後の処理

Contextual Animationのアニメーションモンタージュ再生終了後にイベントを実行する方法。

プレイヤーキャラクターのブループリントを編集します。

On Montage Blending Out Delegate にイベントをバインド

Construction Scriptを開く。

ContextualAnimSceneActorをGetして、そこから線を伸ばしてOn Montage Blending Out Delegate にイベントをバインドを配置。そのイベントから線を伸ばして、Create Event[一致するイベントの作成]を選択し、カスタムイベントを作成します。
名前は何でも良いです。今回はContextual Animation Endにしました。

これにより、アニメーションモンタージュがブレンドアウトした時、イベント Contextual Animation Endが実行されるわけです。

例えば、Contextual Animationを実行した時にエネミーキャラクターをGetしていますから、それを変数(AttackTarget)にしておき、ブループリントインターフェースを使って、エネミーキャラクターにもアニメーションモンタージュ再生終了後の行動を指示することができます。

今回の場合、DDTを受けたエネミーキャラクターがスッと起き上がっていますから、アニメーションモンタージュ再生終了後に、ゆっくり起き上がるアニメーションを再生させれば自然な動作になります。

コメント

タイトルとURLをコピーしました