ネリスさん備忘録

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

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

実質的にこの記事の続き

lunanelis.hatenablog.com



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

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

公式はこちら

docs.unrealengine.com

 

 

続きを読む

【UE5】GamePlayAbilitySystemによるコンボ攻撃の実装とそれに利用する小ネタ 後編【GAS】

前回からの続き

lunanelis.hatenablog.com

単発の攻撃ができるようになったため
ここからが本格的にAbilitySystemを使ったコンボ処理の組み込みとなる。

ただ、ここに載せるのは個人的にうまく作れた一例だから
もっとスリムな方法があればそれに越したことはない。

 

今回のざっくりとした内容

ボタンを連打しているだけで攻撃が準備状態となり、かつ発動区間内であれば少し遅らせたディレイ攻撃も可能になるというもの

基本的な考え方は前編で紹介したHistoria様のコンボ記事と同じだが
もっとスマートにできるやろと思ったのでそのあたりをやっていく。

続きを読む

【UE5】GamePlayAbilitySystemによるコンボ攻撃の実装とそれに利用する小ネタ 前編【GAS】

UE5でコンボ攻撃の下地を作ったからそれの備忘録。

調べてる段階だと複雑でとっつきにくいが、
使ってみるとなるほど便利ということがわかる優秀なシステムだと思う。

そんなGameplayabilitySystemを使ったコンボ攻撃の実装と
おまけにUE5で追加されたMotionWarpを使ったダッシュ攻撃の実装をしていく。

大体こんな感じになる

先に結論をいうとこういうことができるシステム

 

目次

  • Montageを用意する
  • GASの設定をする
    • GASのプラグインの追加と必要になる最低限のタグの追加をする
    • Abilityを作ってMontageを再生する
    • キャラでアクションを実行させる
  • 攻撃~Montage再生~待機を実装する
  • コンボ攻撃の攻撃~待機~入力があった場合にMontage再生の仕組みを作る
  • AnimNotifyStateを使ってGASのコンボを簡略化する
  • MotionWarpの使い方を出す
  • まとめ

 

続きを読む

【UE5】GASと対話する【備忘録】

GameplayAbilitySystemと対話中

  • Ability Tags
    ここに設定したタグをTryActivateAbilityiesByTagで呼び出すと動く
    複数設定すると、いずれかを呼び出せば動く
    呼び出し用の名前って事
  • Cancel Abilites With Tag
    ここに設定したタグを持つアビリティをキャンセルする
    必殺技による割り込み、被ダメージでのダウン等で活躍かな
  • Block Abilities With Tag
    このアビリティ実行中は該当タグ(AbilityTags)を持つアビリティの実行を禁止する。
    後述のActivationBlockedTagsと同じ実行禁止効果だが、受動と能動という関係。
    ダウン中は他の行動を禁止したいって場合はこっちを使ったほうがミスがない。
  • Activation Owned Tags
    アビリティ実行時に設定したタグをオーナーに付与する
    今このアクション実行中だよ!ということを明示するために必要
    別になくても動くっちゃ動くけど、普通は設定する
  • Activation Required Tags
    ここで設定したタグを持っていないと実行しなくなる。
    例えばダッシュ中のタグが付いていないとダッシュ攻撃は出せない。みたいな。
    ダッシュ攻撃作るなら、通常攻撃はダッシュ中発動できない制限がいるのかな?
    ドラゴンインストール中なんかの状態変化はこれで切り分けできそう
  • Activation Blocked Tags
    これに設定されたタグを持っている間はアビリティが実行できなくなる
    ↑のダッシュ中は通常攻撃が出ない。とか、攻撃中は攻撃できないとか。
    これちゃんと設定しないと、攻撃を攻撃でキャンセルとかいうおかしな挙動ができちゃう
  • Target Required Tags
    Activation Required Tagsと参照する対象が違うみたいだけど、違いがわからん…
    どっち使えばええの…?
  • Target Blocked Tags
    Activation Blocked Tagsと参照する対象が違うみたいだけど、違いがわからん…
    どっち使えばええの…?

公式
https://docs.unrealengine.com/4.27/ja/InteractiveExperiences/GameplayAbilitySystem/GameplayAbility/

公式のコピペみたいなもんだけど、エディタ内で翻訳されてないから覚えとかないとね

 

追記

UE4時代にあったAddGameplayTagsRemoveGameplayTagsに関して

ノードの機能としては指定したタグを付与したり、削除したりするものだが
UE5のこのノードはUE4のものと違うため、同じ名前なのに違う動作をしている。

UE4の記事みてGASの勉強をするとこの罠にかかるの本当に罠。
同じ効果を持つノードは以下の2つ

Looseで検索をかけると一発で出てくるノード2つ

これがUE4時代のGameplayTagを付与・削除するノードになる。

 

 

 

 

【UE5】サードパーソンテンプレートのBPを乗っ取るまで【備忘録】

サードパーソンテンプレートのキャラを自作キャラで乗っ取ることができたので、記録しておく。
思った以上に手順が多くて大変やねんな…

最終的にこんな感じになる↓ 

youtu.be

長いから目次が必要

サムネ用

f:id:LunaNelis:20220412070259p:plain

 

キャラクターをインポートする

UE4の時と同じなので特にいうことなし!
お好みの設定でインポートしませう
自分はモーフを入れるよ

f:id:LunaNelis:20220412032818p:plain

マテリアルやテクスチャを設定して準備は完了

今回はTポーズのキャラクターだけど、
やることは結局Aポーズでも同じだから何の問題もないね

f:id:LunaNelis:20220412033626p:plain

アニメーションをリターゲットする①

今回のメイン。UE4から変わりすぎてんよー

前説明をすると、UE5のリターゲットは新しくできたIKリグというアセットを比べて
IKリターゲッタというアセットで配るという仕組みになってる。

とりあえず、IKリグを作る。

f:id:LunaNelis:20220412035027p:plainf:id:LunaNelis:20220412035124p:plain

できた。プレフィックスはIK_でいいのかな?
個人的にIKRな気がせんでもないけど、公式でIKだしええか…

f:id:LunaNelis:20220412035223p:plain

開くとこんな画面。
見慣れたようなそうじゃないような…
大事なのは右下の赤枠部分。

f:id:LunaNelis:20220412035650p:plain

まずは左上で骨盤にあたるボーンを選んで右クリック
リターゲッティングルートの設定を選択

f:id:LunaNelis:20220412040604p:plain

新しいチェーンを追加するボタンでチェーンを増やして、こんな感じで設定する。
(本当は指やらなんやら細かいチェーンを設定したほうがいいが、今回は省く)

f:id:LunaNelis:20220412041826p:plain

チェーンってなんやねんって思うけど、UE4のリターゲットマネージャの
ヒューマノイドリグを設定する項目を[開始ボーン~終了ボーン]という形でまとめて設定できるようにしたものだと考えれば大体あってるかも。
UE4でいうとこれね。ボーン1個1個設定しなくても良くなってすごく楽。しかも自由度UP

f:id:LunaNelis:20220412042213p:plain

 

とりあえず、これで下準備が完了。


アニメーションをリターゲットする②

コンテンツ>Characters>Mannequins>Rigs>RTG_Mannequinに
マネキンのIKリターゲッタがあるので開く。

f:id:LunaNelis:20220412044235p:plain

こんな画面。
とりあえずTargetIKRigAssetTargetPreviewAssetの二つをさっき作ったIKRigとメッシュに置き換え

f:id:LunaNelis:20220412044607p:plain

そして右下のアニメーション一覧から適当なアニメーションを選択すると
リターゲット後のアニメーションをプレビューできる…

が、お稲荷ちゃんはTポーズゆえにこうなる…そりゃそうよ

f:id:LunaNelis:20220412044928p:plain

というわけで、画面上部にあるポーズの編集ボタンを押す

f:id:LunaNelis:20220412045551p:plain

そうするとボーンが選択できるようになって、デフォルトポーズを編集することができる。

f:id:LunaNelis:20220412045705p:plain

あと、詳細にあるTargetActorPreviewの設定をいじると、キャラを重ねられるので
ボーンの位置合わせにちょうどいい感じの設定をしよう

f:id:LunaNelis:20220412045834p:plain

Offsetを0に設定してScaleを良い感じにあわせて
こうやって重ねれば、細かい調整も楽々。

f:id:LunaNelis:20220412050123p:plain

調整が終わったらポーズの編集ボタンを解除して
改めてアニメーションを確認…ヨシ!

f:id:LunaNelis:20220412050334p:plain

ここまで出来たら右下からアニメーションを適当にまとめて選択して、
選択したアニメーションをエクスポートボタンを押す

f:id:LunaNelis:20220412050426p:plain

出力したい場所を選んでリターゲット完了!

f:id:LunaNelis:20220412050539p:plain

ちなみに、IKリターゲッタの設定さえ済ませてしまえば、
従来のアニメーションアセットを右クリックから選ぶリターゲット方法も使える。
こっちでリターゲットする場合、プレフィックスサフィックスを設定できるので
そういう面ではこっちのほうが優秀
(上記で説明してた方法だと、_Retargetedというサフィックスが勝手について邪魔)

f:id:LunaNelis:20220412051010p:plain

あと、ブレンドスペースは個別にリターゲットしようね
IKリターゲッタにはないからやはり手動でやる必要がある。

f:id:LunaNelis:20220412051602p:plain

 

 

リターゲットはできたのに、アニメーションが動いてないって人は
ポーズ編集の解除をしてない可能性がある…注意されたし

ABPを作り、継承する

UE5ではABPを継承し、親のABPの処理をそのまま使えるという機能が追加されたので
いちいちABPをコピーして変数も同じものを作ってアニメーションも置き換えて…みたいな死ぬほど面倒な作業がなくなった。ありがたく使わせてもらおう。

とりあえずABPを作る

f:id:LunaNelis:20220412052349p:plain

開いたらクラス設定を選択し、親クラスをABP_Mannyに変更する
このABP_MannyがテンプレートのマネキンのABPの本体である

f:id:LunaNelis:20220412052652p:plain

これをすると、多分キャラが残念なことになる。
アシクビヲクジキマシター!!

f:id:LunaNelis:20220412052825p:plainしかもアニメーションもしない

とりあえず足首曲がってるのはおいといて、
これも新たに増えたアセットオーバーライドの機能を使って
各種アニメーションを差し替えていく。

滅茶苦茶わかりにくいが、右上のここにアセットオーバーライドというタブがある。
ここにさっきリターゲットしたアニメーションをそれぞれ差し替えていく

f:id:LunaNelis:20220412053047p:plain

Idleモーションが再生されるようになった。
足首はくじいたままだけどね
あと、AnimGraphに何もなくても動くのは気味が悪いけど問題なし

f:id:LunaNelis:20220412053239p:plainf:id:LunaNelis:20220412053426p:plain

そのあたりの説明は以前軽くしてるが、親のABPがすべてやってくれていて
そのアニメーション部分だけを差し替えるという動作のため。

【UE5】サードパーソンテンプレートを見るぞ!!! - ネリスさん備忘録


とりあえず、見てくれが悪いので
足首が曲がる原因である親のFootIk処理を外しておく

f:id:LunaNelis:20220412053945p:plainf:id:LunaNelis:20220412054002p:plain

ABP_MannyのAnimGraph処理をちょいちょいっとね。

BPを差し替える

UE4でリターゲットやBP_ThirdPersonCharacterの
BP差し替えしてた人ならなんてことないはずなので省略!

f:id:LunaNelis:20220412054146p:plain

FootIKを使わなくていいという人なら、この時点で作業終了。

今後ABPはABP_Mannyを修正することで子クラスへの変更とすることができる。
Mannyであることを気にする人は自作の親クラスを作ってもいいかも。

IKの設定をする

正直、これはモデルの作りにも依存するからあくまでお稲荷ちゃんでの話になるが
UE5云々というより、FootIKという仕組みそのものを勉強した方がいいかもしれない。
なんなら自分で実装したほうがいいかもしれないまであるからね。

後述するが、マネキンと同じボーン構造を持っていれば何もしなくてもIKが機能する

 

とりあえずやっていく。
さっき外したコントロールリグのノードをつなぎなおしておく。
こいつをダブルクリックすると、該当するコントロールリグが開く
CR_Mannequin_BasicFootIKってやつね

f:id:LunaNelis:20220412055117p:plain

中で何してるかの概要は以前説明したから省略。
一言でいえば至極普通のFootIk処理が書かれているだけ。

まずは見た目から。
右上のプレビューシーンから、PreviewMeshを差し替え
そのままだと、やはり足首をくじいている。

f:id:LunaNelis:20220412055355p:plainf:id:LunaNelis:20220412055439p:plain

左下のリグ階層はマネキンのものが入ったままなので、全部消す

f:id:LunaNelis:20220412055530p:plain

こんどはImportHierarchyというボタンが現れるので、自分のSkeletalMeshを入れる

f:id:LunaNelis:20220412055623p:plain

今回は必要最低限のボーンだけ残して他は消してしまう。
ボーンを消すたびに左上のモデル表示がグチャるが、
コンパイルすると治るから心配無用

こんな感じで腰から足先までのボーンだけでOK

f:id:LunaNelis:20220412055800p:plain

もともとあった処理のボーン名と同じ(Foot_LやFoot_R)ため
この時点ではこんな感じになる。

f:id:LunaNelis:20220412055925p:plain

ここまで来たら、足のボーン(かかとにあたる場所)を右クリックし
新しいボーンを生成。両足ともに作る
名前はIK_Foot_L、IK_Foot_Rなど。
(名前をこれに合わせると、ちょっとだけ楽ができる)

f:id:LunaNelis:20220412060118p:plain

同じようにしてRootから新しいボーンを作り、IK_Rootという名前にでもしておく
(これの名前はなんでもOK)

f:id:LunaNelis:20220412060333p:plain

そのあと、IK_Foot_L,RをドラッグしてIK_Rootの子に設定する

じゃあ「最初からRootを先に作ってその下にIK_Foot_L,R作ればいいじゃん?」って言われそうだけど
Footのボーンの位置が大事だから必要な回り道なのだ

f:id:LunaNelis:20220412060420p:plain

一応この時点でIKとしては機能するが、アニメーションがおかしくなる
足がね、動かないの。腕だけ振ってる変な感じに。

f:id:LunaNelis:20220412060524p:plainf:id:LunaNelis:20220412060613p:plain

理由はざっくりとだけど、作ったIK_foot_L,Rが足に追従しておらず
常に地面に足を合わせようとしているせい。くっついちゃってるのね。
マネキンはもともとのモデルがIK用のボーンを所有しており、それが足に追従しているボーンのため何もしなくても動いているが
素人が作ったお稲荷ちゃんがそんなド親切なボーン設計になっているわけもなく。

 

というわけで、そういう処理を追記する必要がある。

作成したIK用ボーンを足のボーン位置に合わせる処理を追加する

f:id:LunaNelis:20220412061001p:plain

これにてFootIK設定は完了。

動かしてみれば動いてくれるはず。

youtu.be

あと、親のABP_Mannyでワーニングが出るようになるけど気にするな!
気になるならFootIK用のボーン名をちょっと変えようね
(エラー内容はモデルとコントロールリグでボーン名重複しとるからなんとかしてくれってこと)

f:id:LunaNelis:20220412063307p:plain

 

 

あとがき

ここまででマネキンを自作キャラに置き換えて動かすことができているはず
FootIKに関してはモデルの作り次第では何もしなくても動いてくれるし。

ただ、置き換えるにあたってFootIKの処理のアセット名はマネキンのままだし
ABPの親の名前はMannyだしで元のアセットの匂いが強いので
それがアレだという人は名前を変えたり1から作ったり色々いるかも。

一通り俯瞰してみると非常に便利な作りになったけど、
反面適当に使いたい人にとってはスタートアップが煩雑に思えるから難しいところね。

ともあれ、これでUE4の時みたいに自作キャラを走り回らせられるから
キャラで困ることは無くなった!

【UE5】サードパーソンテンプレートを見るぞ!!!

UE5きた!
とりあえずサードパーソンテンプレートを解体していく!

開いたらいきなりこれだよ…
地形がまず違う

f:id:LunaNelis:20220407002320p:plain

とりあえずまず目につくのはグリッド状のマテリアル
1メートル間隔で太線になってるから距離を測るのにもってこいだし
パーツをきっちりハメやすい。
ちょっと前に無料で配布されていたBlockoutToolsPlaginのような便利さを感じる…
そのマテリアルの中身を見てみると、なんかやけにすっきりしてる

f:id:LunaNelis:20220407012255p:plain

というのも、その左下にこんなノード群が。

なるほどね。マテリアルもパーツ化できるようになったわけね

f:id:LunaNelis:20220407012526p:plain

このNamedRerouteDeclarationっていうノードがパーツ化の正体か

f:id:LunaNelis:20220407012734p:plain

ふうむ、こんな感じで1度作った変数をローカル変数のように保存して
別の場所で取得できるノードってわけだぁ。
ありがちだったスパゲッティを大幅に軽減できるし、ノード整理がしやすくて大変Good

作ったNamedRerouteDeclarationを使いたい場合は、ノードにつけた名前(画像だと「AA」)を検索すれば出てくるみたいね

f:id:LunaNelis:20220407012854p:plain


そんなわけでマテリアルも便利になったし、1メートルのグリッドもデフォで入れてくれててすごい便利になったね。
マテリアルインスタンスで使われてるから、ライン幅とか色とか、結構調整できるから必要に応じて増やそう

そしてプレイ。
デフォルトでFootIKが入ってる…
走りモーションやジャンプモーションも以前のものより滑らかで、つなぎ目が見えなくなってる。

f:id:LunaNelis:20220407013908p:plain

実装を見に行こう…

とりあえずBP。
こっちは前と変わってないみたいだし割愛

f:id:LunaNelis:20220407015240p:plain

アニメーションブループリント(ABP)は、ABP_Quinnっと
クインっていうのね。

実装は……?
AnimGraphも無い…なぜ動いているんだ!詰んだ/(^o^)\オワタ

f:id:LunaNelis:20220407015433p:plain

ということもなく、コメントにもある通りABP_Mannyの子クラスであり、実装はすべてそっちで書かれている。
ABP_Quinnはアセットオーバーライドの機能により、対応するアニメーションを女性型のアニメーションに置き換えるだけとなっている。
これすごいね。ガワを変えるだけならこれで済むって話よ。汎用アクションを1回書くだけでいいからすごい楽ねー

あ、MannyとQuinnでマネキンね…

f:id:LunaNelis:20220407015745p:plain

処理の本体はABP_Mannyのほうということで、こっちを見に来た。
色塗る前のアイアンマンっぽいね。

処理の内容は

  1. 初期化時に親のCharacterとMovementComponentを取得する
  2. 更新時、使用者がCharacterであれば処理を実行。Sequenceにより3種の処理を行う。
    これにより、キャラクター以外で利用されている場合には何もしないようになる。(Idleモーションするだけ)
  3. Sequenceの上段:MovementComponentから移動量であるVelocityを取得。
    合わせて移動速度を取得
  4. Sequenceの中段:平たく言うと、歩いているかのフラグ
    加速度があり、移動速度が一定以上であれば「歩いている」と判断する
  5. Sequenceの下段:空中にいるかどうかのフラグ

UE4のマネキンと基本的には同じだが、4番の歩いているかのフラグが新たに追加されている。

f:id:LunaNelis:20220407020819p:plain

そしてこれがAnimGraph。
UE4のマネキンと結構違うのねー

とりあえずここで見れる範囲で言うと、AnimMontage用のスロットがすでに刺さっている事。
MannyのアニメーションにはAnimMontageはないため、おそらくこれを流用した人がそのままMontageを使ったアクションを扱えるような配慮。優しい

それと、コントロールリグが挟まっていること。
あとで書くけどこれはFootIKをしてる。

f:id:LunaNelis:20220407022004p:plain

MainStatesの中身
なんか分離しとる…

とりあえず、Locomotionは↑の画像のLocomotionのことみたい。
分かりにくいから書き足し。
ToFallingとToLandの2つが新しくできたステータスエイリアスノードってやつみたい
ざっくりいうと、このノードにくっついてる条件(⇔みたいなヤツ)を、設定したステート中に満たすとワープしてこれるというノードらしい

f:id:LunaNelis:20220407025441p:plain

ToFallingだと、Locomotionにいるときに落下フラグがTrueになった場合に
ToFallingにワープし、そのままFallLoopアニメーションに切り替わる。
もし上昇している場合は、Jumpモーションをした後に落下アニメーションを行う。

f:id:LunaNelis:20220407025918p:plainf:id:LunaNelis:20220407030003p:plain

ToLandはその逆ってことで、空中にいるステート中に落下フラグがFalseになる(着地した)場合、着地アニメーションを再生し通常のLocomotionに戻る。という挙動らしい。
なるほどなぁ。複数のステートの所在から、別のステートにワープできるからかなりすっきりするねー

さて、Locomotionはどうなってるかというと、こっちはシンプル
通常はIdleを再生してて、移動したらWalk/Runを再生する。
Walk/Runは移動速度に合わせてブレンドスペースで再生している。これはUE4のころから同じね

f:id:LunaNelis:20220407030414p:plain

 

そして最後はコントロールリグ。
中身を見てみる。ダブルクリックっと。

f:id:LunaNelis:20220407030726p:plain

ヴォエッ!!

f:id:LunaNelis:20220407030759p:plain

とりあえず、分解してみていく(ぶっちゃけコメントを翻訳すれば大体わかるけど)

  • Step1
    FootIKするフラグがTrueならIKのトレースを実行する。
    つまるところ、地面に着地しているときはFootIKをするってこと。
    自作したFootTrace関数によりトレースを伸ばし、足を下ろさないといけないかどうかチェックする
  • Step2
    Step1で取得したオフセットに向かって座標の補間を行う。
    これがないと、足がすぐ最終地点になっちゃうから、ゆっくり足を動かすためにやる。
  • Step3
    Step2の右側にあるやつ。
    足を下に伸ばす都合上、胴体を下げないと足が届かないので、より下に伸ばす足の分、胴体を下げることにする。
  • Step4
    実は今までやってきたのは変数への値の設定だけで、実際の体に値を設定していなかった。
    というわけで、右足、左足、胴体(骨盤)にStep2で計算した値を設定する
  • Step5
    FullBodyIKというノードを使って、なんかいい感じにする!(わからん)

分解してみれば、まぁFootIKの処理としては至極普通の流れであることがわかる。

実行されている見た目を見るとなおわかりやすい。
胴体を右足が下ろさなきゃいけない分下げる。(これのせいで当たり判定が見た目とかなりズレる)
左足はなんかいい感じに曲がる

f:id:LunaNelis:20220407033239p:plain


長くなったけど、UE4の時の雰囲気を残しつつ、テンプレートの時点で満足度できるほどの移動設定がされていて、このまま使えてしまうような親切度合いとなっていた。

 

変化してる点は多いけど、要点を押さえておけばUE4のときの感覚をあまり崩さずに使えそうだなぁ

 

今度は自作キャラ突っ込んで、リターゲットとか試してみようかな

 

【UE4】SplineとActorの位置から、Splineの割合を出す方法【備忘録】

あるActorからそのSplineの最も近い点を取得し、その割合を出すことで

ActorがSplineの何割進んだかが取れるノード群。

f:id:LunaNelis:20220202030939p:plain

ジップラインを途中からつかみたい時

コースの何割進んだか知りたい時

その他いろいろと使い出がある。

 

今回は本当にただの備忘録。