ネリスさん備忘録

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

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

前回からの続き

lunanelis.hatenablog.com

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

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

 

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

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

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

 

目次

 

「コンボ攻撃2」を作成する

何はともあれ、コンボをつなぐには「コンボ攻撃2」が必要になるため作る。
クラスの作り方は以前と同じのため割愛

ノードの中身はこんな感じ
1コンボ目とはちょっとだけ違う

まずはPlayMontageAndWaitStartSectionCombo2を設定していること。
コンボ2の攻撃モーションを行わせる設定。

CommitAbilityとPlayMontageAndWaitの間に挟まっているWaitGameplayEventノード
これが今回大事なノードで、このノードに入るとここで処理が止まり
別の場所でSendGameplayEventtoActorノードが呼び出されたときに処理が再開するというもの。

これを利用して攻撃を準備しつつ、発動するその時まで待つという処理を作る

クラスのデフォルトで設定するタグ群はこんな感じ

  • AbilityTags
    コンボ1段階目と同じく、攻撃アクションで起動できるように。
  • BlockAbilityiesWithTag
    この攻撃中は該当タグを持つ他のアビリティが発動しないようにする
  • ActivationOwnerdTags
    発動時に付与される
    タグ。
    これにより↑のBlockが有効になり、重複発動を防ぐことができる
  • ActivationRequiredTags
    設定したタグを所持していないと発動できなくなる
    ここだけAbility.Ready.Combo2とタグの2番目が違うことに注意。
  • ActivationBlockedTags
    これに設定したタグを持っている間は実行できなくなる
    コンボの成立には関係はない
    (この設定は被ダメージ時の怯み時に攻撃できなくするためのもの)
BlockAbilityesWithTagとActivationBlockedTagsについて

BlockAbilityesWithTagとActivationBlockedTagsがどちらもアビリティの発動を禁止するもので混同するかもしれないが

BlockAbilityesWithTag他のアビリティの発動を縛る効果
AvtivationBlockedTagsこのアビリティの不発条件

言葉で説明すると難しいが、例えば
「この攻撃は回避行動でキャンセル可能、こっちの技は回避行動でキャンセル不能」というように技ごとに違いがある場合は攻撃アビリティBlockAbilityesWithTagに回避の禁止を設定を使い
「すべての攻撃中は回避禁止」であれば
回避アビリティAvtivationBlockedTagsに攻撃のタグを設定することになる。


ステートをきっちり組んで作らないといけないのはこのあたりが原因。
適当にやってると発動条件が重複したり、絶対に満たせない条件が発生したりする

 

細かい話もあったが、これでこの「コンボ攻撃2」は

  • Ability.Ready.Combo2をキャラクターが持っているときにAbility.Action.Attackタグで起動可能
    (起動しているが、WaitGameplayEventノードによりアクションを保留している状態)
  • Ability.State.NextAttackのタグの付いたイベントが発生時にアクションを開始

という状態のアビリティとなった。
これがどうやってコンボとして機能するかはお楽しみ

 

攻撃~入力待機~攻撃発動待機~発動を作る

まずこのコンボを成立させるには、コンボ1をしている最中に以下の3点が必要となる

  • 起動条件であるAbility.Ready.Combo2のタグを所持させる
  • 入力区間終了後はAbility.Ready.Combo2のタグを消す
  • アクション可能になったときにAbility.State.NextAttackのタグの付いたイベントを実行する

最初にコンボを作るために
WaitGameplayEventによる動作の待機と
「入力可能状態」の実装と「実行タイミング処理」の実装をする

Readyタグによって2コンボ目を実行可能状態にし
プレイヤーからの攻撃命令の実行を可能にし
Eventの発行により攻撃を押した瞬間に攻撃モーションの実行が行われる

AnimNotifyStateを使ってGASのコンボを簡略化する

AnimNotifyStateってなんじゃいって人はこれを参照。

historia.co.jp

すごくざっくりというと、AnimMontage中にイベントを実行したり、更新処理を付与できたりするやつ。

これを使って「入力待機区間「発動タイミングの区間を作る
イメージとしてはこんな感じ

とりあえず、AnimNotifyStateを作ってANS_AttackReadyという名前にして
イベントを実装する

それぞれのイベントのタイミングは以下の通り

ReceivedNotifyBegin:区間が始まったときに1度呼び出されるイベント
ReceivedNotifyEnd:区間が終わったときに1度呼び出されるイベント
ReceivedNotifyTick:区間中毎フレーム呼び出されるイベント。

描くまでもないだろうけどこういうこと。

入力待機区間を作る

入力待機区間の役割は攻撃ボタンを押すことで2コンボ目のAbilityが起動できるようにすること。
すなわち、BeginでAbilityの発動条件を満たすようにタグを付与し、Endでそのタグを削除するというものを作る

まずはタグを外部から設定できるように変数を作る

外から編集するためにスポーン時に公開しておく
効果のほどは後程

オーバーライドしたReceivedNotifyBeginイベントをこんな感じに

同じくReceivedNotifyEndイベントをこんな感じにする

内容は単純に、開始時に設定した任意タグを付与し、終了時に付与したタグを削除するだけのもの。

ちなみに、ヒストリアのコンボ作成の記事では以下のAddGameplayTagsノードを使ってタグを付与しているが、UE5ではほぼ同名のノードが使えなくなっている

そのため、同じ機能を持つ新しいノード
AddLooseGameplayTagsノードを使ってタグを付与する必要がある
削除は同様にRemoveLooseGameplayTagsで行う

※この画像の上側にあるAddGamepayTagはほぼ同じ名前だが使い方が違うためNGとなる
所詮そっくりさんでしかないのだ…

よく見ると違う名前だし、結構な罠だとは思う。

 

発動タイミングの区間を作る

同じようにAnimNotifyStateを作ってANS_AttackBrunchという名前にする
今度はReceivedNotifyTickイベントをオーバーライドする
中身はこんな感じ

内容としては、区間にいる間毎フレームSendGameplayEventtoActorノードを使ってAbilitySystemのイベントを実行しまくる。
今回の処理ではAbility.State.NextAttackというタグのイベントを実行する

このタグは2コンボ目の処理でのWaitGameplayEventノードに対応しており
処理を見返してもらうと設定したタグの名前が一致していることがわかるはず。
(忘れた人は上の方へ戻って見直してみようね)

 

Montageに作成したAnimNotifyStateを追加する

コンボ1のMontageの通知トラックに右クリック→通知ステートを追加から
作成したANS_AttackReadyANS_AttackBrunchを追加する
そしてこんな感じに伸ばしていく。
次の攻撃の入力受付区間がReadyの間で
入力後次の攻撃に移行する区間がBrunchの間ということになる。

注意としては、ANS_AttackReadyのEndはANS_AttackBrunchのEndより後ろにしないこと。
入力したはいいが不発に終わってしまう他、不審な挙動の原因となる。

また、配置したANS_AttackReadyを選択すると、詳細ウィンドウにデフォルト変数を設定できる項目があるため、設定しておく
今回はコンボ2の発動条件を満たすため、Ability.Ready.Combo2を設定

これでコンボ2までの流れが完了。
攻撃してみれば2コンボ目が発動する…はず。

 

おさらい

一通り処理を作成してきたので動作のおさらい

  1. 攻撃ボタンを押すことでコンボ1のAbilityが起動しMontageのCombo1が再生される
  2. MontageのANS_AttackReadyが開始されAbility.Ready.Combo2タグがキャラクターに付与される
  3. 上記タグが付与されたことによりコンボ2のAbilityが起動可能
  4. 攻撃ボタンを押すことでコンボ2のAbilityが起動する
  5. コンボ2はWaitGameplayEventで処理が一度止まるため、攻撃ボタンを押した時点では何も行わない
  6. ANS_AttackBrunchの区間に入ることでSendGameplayEventtoActorが呼び出された結果止まっていた処理が進み、MontageのCombo2が再生される
  7. コンボの連携完了

ちなみに、4で攻撃ボタンを押さない場合、ANS_AttackReadyのEndで発動条件のタグが消されるため正常に終了する。

あとはコンボ3,4と同じことを繰り返すことでボタン連打でコンボがつながるようにできる。

 

次はMotionWarpを使ったダッシュ攻撃の実装を説明したい…

lunanelis.hatenablog.com

した。