はじめに
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アセットでゲームプレイタグを設定
以下の記事を手順通りにやれば、上記の項目はクリアできます。👇
良き記事ありがたや。
【本題】GASに引数を渡す方法
▼ DataAssetの作成
引数として渡したいデータを持たせたDataAssetを作成してください。
今回は、以下の名称でアセットを作成したとして説明します。
名称 | |
---|---|
PrimaryDataAsset | BP_PDA_arguments |
DataAsset | DA_arguments |
保管するデータは、
- String型のTestMessage
- SoundWave型のTestSound
としました。
(DataAssetの作り方を超ざっくりXのポストでまとめたので、わからない方は良ければ参考にしてください。)
GASの呼び出し元クラスに、BP_PDA_arguments型の変数を用意します。
デフォルトバリューは、DA_argumentsとします。
▼ 呼び出し元クラスでのGASのActivate方法
"SendGameplayEventToActor"を使ってGASをActivateします。
PayloadのOptionalObjectに、先ほど作成したDataAssetを格納した変数をつないでください。
▼ GASの実装
"EventActivateAbilityFromEvent"に引数を用いた処理を実装できます。
EventDataからOptionalObjectを引っ張ってきて、作成したPrimaryDataAssetのクラスにCastToします。
CastTo~~のノードから引数として設定したデータをGetできます。
デフォルトだと、"EventActivateAbility"と"EventOnEndAbility"しか表示されていません。"EventActivateAbilityFromEvent"は検索して出現させてください。
GASのActivateによく使われる"TryActivateAbilitiesByTag"ノードにはPayloadを入力するピンがありません。
補足情報
① OptionalObjectは二つあるので、DataAssetを二つ引数に設定することも可能です。
② Payloadに含まれるEventMagnitudeも自由に使っていいFloat型の引数のようです。
③ 以上から、そもそも引数が「Object型の変数二つ+Float型の変数一つ」で事足りる場合はデータアセットを作る必要はありません。あとから仕様変更で足りなくなる可能性があるなら最初からDAにしといたほうが楽かも?
とはいえ、たくさんDA用意するのは、ちょい大変だから作らずに済むならそれのほうが楽かも...。
④Float型の引数だけGASで使いたい場合はGameplayAttribute・GameplayEffectのご利用もご検討ください。むしろこっちがGASの王道の実装方法なのだと思います。
おわりに
以上で、好きな引数をGASに渡してActivateすることができました!
よりスマートな方法があれば教えてくださいmm
ここまで読んでくれてありがとうございました!
参考記事
謝辞
Toyojiroさん(@Toyojiro3619)、Metasevenさん(@suramaru517)とのXでのやりとりで勉強させてもらいました。
ありがとうございました!