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にしておきます。
データアセットの作成
クラス: 状況に応じたアニメーション役割アセット
名前: 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シーンの作成
名前: 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を再生させるノードの基本的な形です。

・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できるようにします。
エネミーキャラクターのブループリント
名前: BP_Enemy
・新規作成。
位置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を受けたエネミーキャラクターがスッと起き上がっていますから、アニメーションモンタージュ再生終了後に、ゆっくり起き上がるアニメーションを再生させれば自然な動作になります。
コメント