Gameplay Ability System コードリーディング ⑤ WaitTargetData - Radius の利用

上記の続きになります。

前回は WaitTargetData で利用する GameAbilityTargetActor の一つである GameplayAbilityTArgetActor_Radius に関して眺めました。

今回はそれを利用するサンプルを書きつつ進めたいと思います。

サンプルの用意

GitHub - sentyaanko/GASDocumentation: My understanding of Unreal Engine 4's GameplayAbilitySystem plugin with a simple multiplayer sample project.

手順を簡略化するために GASDocumentation をベースに進めます。

GitHub - dany1468/GASDocumentation_PlayGround at blog/wait_target_data_radius

上記に今回のコードを上げていますが、GASDocumentation を folk し blog/wait_target_data_radius という branch で push しています。

サンプル用の Ability と、その Input トリガーの追加

Ability は GA_Sample_SpawnActor として以下のパスに用意しています。
GASDocumentation_PlayGround/GA_Sample_SpawnActor.uasset at blog/wait_target_data_radius · dany1468/GASDocumentation_PlayGround · GitHub

Ability に関しては、GDGameplay Ability を継承する必要があります。

また、Input を紐づけるために、コードの修正も行っています。
Add new AbilityInputID `Sample` · dany1468/GASDocumentation_PlayGround@fca71af · GitHub

加えて、以下のように T key に対して Sample という ActionMapping を追加しています。

こうすることで、Ability に対して Input の紐づけができます。(この辺の詳細はあまり見てないので他にも用途はあるのかもしれません)

Ability を Character に紐づける

BP_HeroCharacter が操作用になるので、こちらに Ability を設定します。

これで、キャラクターを操作中に T をクリックすることで Ability を Activate することができるようになります。

Ability の実装

ここからが本題になります。今回は WaitTargetData を TargetActor に Radius を使い、検出できた場合には以前に見た SpawnActor で検出した location に Cube を出すということを行います。

見ての通りですが、コメントされている箇所 2 つは、GA_Meteor_BP から持ってきています。

Show Confirm / Cancel help text

GA_Meteor_BP の方では岩を落とす場合の確認に使われていますが、今回は単純に Radius の Confirm に使います。

StartLocation の作成

GameplayAbilityTargetingLocationInfo を生成する必要があるためこのような方法になっているようです。

GameplayAbilityTargetingLocationInfo を経由はしていますが、よくあるキャラクターの前方を指定しているだけですね。

Filter の指定

こちらも GameplayTargetDataFilter を生成する必要があります。

今回は、検出対象を GASDocumentation に付属している BP_Blue_Minion にしているため、これを Required Actor Class に指定しています。それ以外はデフォルトです。

WaitTargetData の設定

ここまでで用意した StartLocationFilter を指定しています。
また、Class には GameplayAbilityTargetActor_Radius を指定し、Radius には 500 を指定しました。

検出後の SpawnActor

Radius のコードを読んだ際にも触れましたが、仮に適切な Pawn が検出できなくても ValidData に流れてきてしまいます。
よって、ValidData に流れてきても実際に Actor を含んでいるかを確認した上で SpawnActor に流しています。

Spawn しているのは BP_CubeToSpawn という Actor ですが、単に Cube の mesh が配置してあるだけの BP です。

Character 側での Debug Sphere の表示

これは補助的なものですが、 WaitTargetDataRadius が検出される場所をなんとなく可視化するために Character 側で Debug Sphere を表示しています。(これも GAS でできたらよかったんですが手抜きしました 😅)

動きの確認

youtu.be

左マウスクリックが射撃にも関連してるので微妙に分かりにくいのですが、T を押した時に Confirm のメッセージが表示され待機状態に入ります。
その後、左マウスクリックを押すのですが、その時に Radius の範囲内に今回対象となっている Blue Minion が入っているかどうかで、Blue Minion の場所に Cube が出現するかどうかが変わります。

Confirmation Type を Instant にする

ちなみに、Confirmation Type を Instant にすると、T を押した時点で待機状態無しで Radius の判定が行われます。

まとめ

サンプルとしてはあまり面白みの無いものでしたが、初歩的な WaitTargetData の動作の確認ができたのではないかと思います。

今回は簡略化のために Confirmation Type については GASDocumentation の既存コードから拝借しましたが、いまいちよくわからないので次回はそこの詳細を見ていこうと思います。