ネリスさん備忘録

主にUE4の備忘録を残すよ!

【UE5】GamePlayAbilitySystemによるコンボ攻撃の実装とそれに利用する小ネタ おまけ【MotionWarping】

実質的にこの記事の続き

lunanelis.hatenablog.com



コンボ攻撃はできたから、ダッシュ攻撃を実装する

MotionWarpingを使って、前説明したAnimNotifyStateのようなものを作り
その区間中にRootMotionのように移動量を付与できるというもの

公式はこちら

docs.unrealengine.com

 

 

 

 

MotionWarpingの概要

UE5で新たに追加された機能の一つ。
AnimMontageに移動を付与できるトラックを追加できるというもの。

「移動するアニメーションならRootMotionでもいいのでは?」
と思ったりもするが、この機能が強いのは任意の座標や回転を渡して自由な移動をすることができる点。

既存のRootMotionだとアニメーションに設定した分の移動量分しか動けないため、
落としてきたアセットとかがもうちょっと移動距離があればなぁ~…。
とかを解決できる。

ダッシュ攻撃や走りながら段差を乗り越えたりするパルクールのような動作や
ローリング回避の距離調整などなど、用途を考え出すと結構なんでも使えてRootMotionの時代終わったかもしれんなと思うほど。
(まぁRootMotionそのものは使うんですが)

 

MotionWarpingを調べるうえでの注意点

自分が調べていて引っ掛かった問題として
UE5のPreview版(先行体験版)正式版(5.0以降)設定項目等が一部変わっているため
古い情報ページだと途中で存在しないパラメータを出されたりして詰む事がある。

調べる際は投稿日時を見てできるだけ新しい情報を見よう。

MotionWarpingの利用方法

というわけで、この動画が大変参考になった。

youtu.be

が、長いしパルクール用の説明も入ってるのでこの解説をバラして簡易利用する。
これはあくまで備忘録なのだ

 

プラグインを入れる

この機能使おうって人には今さらだけど
編集→プラグインの追加からMotionWarpingを探して追加、そして再起動
終わり!

アニメーションの設定を行う

ダッシュ攻撃に使いたいRootMotionのアニメーションをまず用意する
(もともとInPlaceのアニメーションではどうも動かないっぽい?賢い人教えて?)

今回はジャンプ回し蹴りのアニメーションをリターゲットしてきたのでこれを使う。
かっこいいからね

ただのRootMotionをそのまま再生すると、座標は変わらないのにキャラのモデルだけが離れていくようになってしまうため
アセット詳細タブにあるEnableRootMotionにチェックを入れる

ここまでの設定ができたら、Montageにこのアニメーションを追加する

新しいMontageでもいいし、前作ったコンボに組み込んでもいい。

自分はコンボの1段目に入れることにした。

MotionWarpingStateをいれて設定する

ダッシュ攻撃を入れたMontageの通知トラックを右クリックして
MotionWarpingステートを追加する

移動させたい時間分伸ばしておいて…

詳細タブでRootMotionModifireSkewWarp
WarpTargetNameDashAttackにしておく(この名前は任意のものでOK)

キャラにコンポーネントを追加する

キャラクターのBPに行き、コンポーネントを追加する
MotionWrapingComponentを追加して終わり

移動量を設定する

動作確認をしてみる。

キャラクターのBPでMontageを再生し、同時にMotinWarpの関数である
Add or Update Warp Target from Location and Rotationノードを使う
名前が長ああああああああああああああああああああああい!!
これより長い純正のノード名ある?ってぐらい長い

動作としては、Montageで追加したMotionWarpingステートの区間に、TargetLocationの位置まで移動するというもの。
WarpTargetNameという引数があるが、これはMontageのMotinWarpingStateで指定したWarpTargetNameと同じものである。名前を合わせてあげよう
今回の場合DashAttackとなる

画像の処理であれば、キャラクターの正面方向に10メートル進むというもの。

これを再生すると回し蹴りをしながら前進するというアクションになる

youtu.be

試しにこの設定を30メートルにするとものすごいぶっ飛んでいく。

youtu.be

ちなみに、TargetRotationを設定していないため、アニメーション終了後かならず北?のほうを向いてしまっている。
TargetLocationと同じく、MotionWarpingステート中にTargetRotationの方向に回転しているためである。後でちゃんと設定する。

 

これで動かせることが確認できたので、コンボ攻撃に組み込んでみることにする。

以前のコンボ攻撃で使ったAbilityのPlayMontageAndWaitノードの後ろに以下の画像のように処理を組んでいく

やっていることはさっきのテスト版のものと同じ
違うのはちゃんとTargetRotationを設定していること(もともとのプレイヤーの向いている方向をターゲットとして指定しているだけ)と
ここはAbilityのためキャラクターやMotionWarpingComponentの取得方法が違うくらい。

試してみればコンボ中にも移動量を調整したダッシュ攻撃ができるようになったはず。

まとめ

MotionWarpingはRootMotionの移動量を自由に変化させられる機能なので便利だが、RootMotion、Montage、キャラ、移動先の指定といくつかものアセットを跨ぐため、最初は混乱するかもしれないが
MontageにStateを追加して、アニメーション再生時に移動先を指定する。
これがほぼ全てなので、やればわかるようになるはず。

また、今回使ったノードはAdd or Update Warp Target from Location and Rotationノードだったが、他にもコンポーネントの位置に移動するものとかもあるので用途に応じて使うと色々できそうなきがする。

某緑の勇者のフックショットみたいな移動もできそうだし、ロックオンしたターゲットへの追尾攻撃なんかもできそうだし
覚えておくとアクションの幅が広がると思う機能だった。

 

次は少々特殊だけどAbilitySystemに対してMontageから通知を投げる方法を紹介

lunanelis.hatenablog.com