【UE5】GameplayAbilitySystemに自由に引数を渡したい

# はじめに
UE5から使うハードルが下がったと評されるGameplayAbility、 a.k.a. GAS。
GASに自由に引数を渡す良い方法がいまいちわからなかったのですが、SNSパワーで理解できたのでメモがてら記事にしました。

# ひとこと結論
呼び出し元：SendGameplayEventToActorでGASをActivate。その際、PayloadのOptionalObjectに引数を保存したDataAssetを渡す。
GAS："EventActivateAbilityFromEvent"ノードでPayloadを受け取る。

...
以下本編です。

# 対象者

- GASの基本的な使い方を知っている人
- DataAssetを使ったことがある人
- Object型、Float型以外の引数をGASに渡したい人

（※Object型、Float型の引数を渡したい方はDataAssetを使わなくてもいい可能性があります。最後の「補足情報」もご覧ください！）

# 準備
以下の準備をお願いします。詳しい説明は先人に任せちゃいます。
- GameplayAbilitiesプラグインの導入
...

- GASの呼び出しを行うクラス（以降呼び出し元クラス）の準備
- 呼び出し元クラスにAbilitySystemComponentを追加
- 呼び出し元クラスに、GiveAbilityノードを実装
...

- GameplayAblilityアセットの作成
- GameplayAblilityアセットでゲームプレイタグを設定

<br>

以下の記事を手順通りにやれば、上記の項目はクリアできます。👇
良き記事ありがたや。

https://qiita.com/atermwd/items/14b5c51e3e4a8a3f9ccc



# 【本題】GASに引数を渡す方法

### ▼ DataAssetの作成

引数として渡したいデータを持たせたDataAssetを作成してください。
今回は、以下の名称でアセットを作成したとして説明します。

|         |    名称    |
|-------------|------------|
| PrimaryDataAsset       |      BP_PDA_arguments      |
|      DataAsset       |      DA_arguments      |

保管するデータは、
- String型のTestMessage
- SoundWave型のTestSound

としました。

（[DataAssetの作り方](https://x.com/n1sh1_vr/status/1842610152547168563)を超ざっくりXのポストでまとめたので、わからない方は良ければ参考にしてください。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115955/6f994ef8-9db3-ce02-60d9-f147286ba895.png)


GASの呼び出し元クラスに、BP_PDA_arguments型の変数を用意します。
デフォルトバリューは、DA_argumentsとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115955/65ecd585-601e-1429-e1fe-59ed4008208f.png)



---

### ▼ 呼び出し元クラスでのGASのActivate方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115955/093008db-8e01-75fc-8d7b-f4161ff27901.png)

"SendGameplayEventToActor"を使ってGASをActivateします。
PayloadのOptionalObjectに、先ほど作成したDataAssetを格納した変数をつないでください。



---
### ▼ GASの実装

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115955/0521015b-732d-acbc-c558-91f326489a17.png)

"EventActivateAbilityFromEvent"に引数を用いた処理を実装できます。
EventDataからOptionalObjectを引っ張ってきて、作成したPrimaryDataAssetのクラスにCastToします。
CastTo~~のノードから引数として設定したデータをGetできます。

:::note info
デフォルトだと、"EventActivateAbility"と"EventOnEndAbility"しか表示されていません。"EventActivateAbilityFromEvent"は検索して出現させてください。
:::

:::note info
GASのActivateによく使われる"TryActivateAbilitiesByTag"ノードにはPayloadを入力するピンがありません。
:::




# 補足情報
①　OptionalObjectは二つあるので、DataAssetを二つ引数に設定することも可能です。

②　Payloadに含まれるEventMagnitudeも自由に使っていいFloat型の引数のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3115955/2d4d81ff-bc29-f822-6966-230f7b3baa61.png)


③ 以上から、そもそも引数が「Object型の変数二つ＋Float型の変数一つ」で事足りる場合はデータアセットを作る必要はありません。あとから仕様変更で足りなくなる可能性があるなら最初からDAにしといたほうが楽かも？
とはいえ、たくさんDA用意するのは、ちょい大変だから作らずに済むならそれのほうが楽かも...。

④Float型の引数だけGASで使いたい場合はGameplayAttribute・GameplayEffectのご利用もご検討ください。むしろこっちがGASの王道の実装方法なのだと思います。

# おわりに
以上で、好きな引数をGASに渡してActivateすることができました！
よりスマートな方法があれば教えてくださいmm
ここまで読んでくれてありがとうございました！

# 参考記事

https://wvigler.hatenablog.com/entry/2021/05/10/101813


https://qiita.com/atermwd/items/14b5c51e3e4a8a3f9ccc


# 謝辞
Toyojiroさん（[@Toyojiro3619](https://x.com/Toyojiro3619)）、Metasevenさん（[@suramaru517](https://x.com/suramaru517)）とのXでのやりとりで勉強させてもらいました。
ありがとうございました！