情報は力ではない

UE4 とか Blender とか。

GameplayEffect の Stacking と Overflow を使ってみる

この記事は、Unreal Engine 4 (UE4) Advent Calendar 2019 - Qiita 15 日目の記事です。

qiita.com

前日は @ka-s さんの「【UE4】ランドスケープをスタティックメッシュに変換する方法とハマったところの紹介 - Qiita」でした。ランドスケープもスタティックメッシュに変換できるんですね。知らなかったです。

今回は、Gameplay Ability System の要素の一つである GameplayEffect の Stacking と Overflow を使用して何か作っていきたいと思います。

前提

今回は UE4.23.1 で確認しています。 また AttributeSet には Health という Attribute が定義されている前提で話を進めます。

GameplayEffect とは

GameplayEffect は Gameplay Ability System の要素の一つで Attribute を変更するために使用するクラスです。

Gameplay Ability System については、おかずさんの ActionRPG についての資料がわかりやすいかと思います。

実際に試してみたい方はおかわりはくまいさんの記事を参考にするとよいと思います。

okawari-hakumai.hatenablog.com

Stacking と Overflow

GameplayEffect のパラメータには Stacking と Overflow というセクションがあります。
Stacking は同じ GameplayEffect のスタックに関する設定ができます。Overflow は GameplayEffect のスタックが上限に到達した際の設定ができます。

今回はこの機能を用いて、1度目の攻撃はエフェクトが生じるだけでダメージはないが、2度目の攻撃はダメージを受けるというような機能を作成していきたいと思います。

下の動画は完成イメージです。1度目はグレイマンの周りにエフェクトが発生するだけですが、2度目はダメージを受けるようになっています(敵の攻撃を作るのをサボったため、Q キーの押下で敵からの攻撃とみなしています。。

GameplayEffect の作成

今回は GameplayEffect を2つ作成します。1つは Stack させるための GameplayEffect。もう1つは Overflow した際に発動する GameplayEffect です。 まず作るのが簡単な Overflow した際に発動する GameplayEffect を作成していきます。

Content Browser で右クリックし Blueprint Class を選択し GameplayEffect を作成します。今回は GE_Frostbyte としておきました。

f:id:masahiro8080:20191208162306p:plain
GameplayEffect の作成

作成した GE_Frostbyte を開き Modifires セクションを設定していきます。
この GameplayEffect が発動したら対象にダメージを与えるように設定します。Modifiers セクションから Attribute に Health を設定し、Scalable Float Magnitude でダメージ量を設定します。
GE_Frostbyte はこれで終わりです。

f:id:masahiro8080:20191208162701p:plain
Modifiers セクションの設定

次に Stack する方の GameplayEffect を作成していきます。
同様に GameplayEffect を作成します。名前は GE_StackingFrostbyte にしておきます。作成した GE_StackingFrostbyte のパラメータを設定していきます。
Overflow セクションには Overflow Effects として先ほど作成した GE_Frostbyte を追加します。この Overflow セクションは Stack の最大量を超えた際に発動する GamepleyEffect を設定します。Stack の最大量を超えた際には再び Stack を空にしておきたいので Deny Overflow Application、Clear Stack on Overflow ともにチェックを入れます。

次に Display セクションですがここでは GameplayEffect が発動した際のエフェクトに関わる設定をします。後で氷っぽいエフェクトを追加したいのでそのための設定として Gameplay Cues を一つ追加し Gameplay Cue Tags に Effect.Frostbyte を追加します。追加するには Edit から Add New Gameplay Tag から追加します。

f:id:masahiro8080:20191208164628p:plain
Overflow セクションと Display セクション

次は Stacking セクションです。Stacking セクションでは Stack に関する設定を行っていきます。
Stacking Type は Aggregate by Source に設定します(この設定は Ability System Component が持つこの GameplayEffect のスタックカウントの追加の仕方を設定する項目だと思っているのですが、Aggregate by Target との違いが、正直なところよくわかっていません(すみません))。Stack Limit Count を 1 に設定しました。Stack Limit Count は Stack に積める最大個数です。この設定によりこの GameplayEffect が 2 つ Stack されると Overflow を起こします。

最後に Gameplay Effect セクションです。ここではこの GameplayEffect の期間に対する設定を行います。GameplayEffect の Stack 機能を使用するには、Duration Policy を Has Duration か Infinite に設定する必要があります。ここでは Duration Policy を Has Duration に設定し、Scalable Float Magnitute を 10.0 に設定しました。これによりこの GameplayEffect は 10 秒間 Stack に残ることになります。なので 10 秒間の間に敵の攻撃を受けてしまうとダメージということになります。10 秒を過ぎると Stack から削除されます。

f:id:masahiro8080:20191208165215p:plain
Stacking セクションと Gameplay Effect セクション

GE_StackingFrostbyte の設定は以上です。

次に先ほど Display セクションで設定したエフェクトに関する設定を行っていきます。

GameplayCue の作成

GameplayEffect が発動した際や削除された際の GameplayCue はエフェクトやサウンドに関する処理を司るクラスです。

Content Browser から Blueprint Class を選択し GameplayCueNotify_Actor を作成します。名前を GCN_Frostbyte としておきます。

f:id:masahiro8080:20191208165826p:plain
GameplayCueNotify_Actor の作成

GCN_Frostbyte を開き処理を記述していきます。 まず Functions の Override から On Active を選択し次のような処理を記載します。 My Target から Mesh を取り出し Mesh に Emitter を Spawn しています。Emitter Template には InfinityBlade のアセットで氷属性っぽいエフェクトを使用しています。Spawn Emitter Attached の戻り値を保持しているのは GameplayEffect が削除されたときに Emitter を削除するためです。

f:id:masahiro8080:20191208170055p:plain
On Active 関数

次に On Remove の処理を記述していきます。 GameplayEffect が削除された際に Emitter を消すだけの処理を記載しています。

f:id:masahiro8080:20191208170400p:plain
On Remove 関数

最後に Class Defaults の設定を行っていきます。 変更したのは Auto Destroy on Remove と Gameplay Cue Tag の2つです。 GameplayEffect が削除された際にこの GameplayCue も削除してほしいので Auto Destroy on Remove にチェックを入れています。Gameplay Cue Tag には Effect.Frostbyte を設定しています。これは GE_StackingFrostbyte の Display セクションで設定した値です。これを設定することにより GE_StackingFrostbyte が発動した際に GCN_Frostbyte も発動することになります。

f:id:masahiro8080:20191208170552p:plain
Class Defaults

以上ですべての設定は終わりです。

確認のためにレベルブループリントでプレイヤーに GE_StacingFrostbyte を Stack させる処理を記述していきます。 Player Pawn から Ability System Component を取得し ApplyGameplayEffectSpecToSelf で自分自身に GE_StackingFrostbyte を適用しています。

f:id:masahiro8080:20191208171014p:plain
GE_StackingFrostbyte の動作確認

以上により、この記事の最初に表示した動画のようになります。

おわりに

駆け足でしたが Stacking と Overflow の使い方の紹介でした。これを機に GameplayAbilitySystem に興味を持つ人が増えればよいなと思います。

以上です。

明日はがっちょ( ¨̮ )さんの「地形で遊ぼう!」です。地形の内容ということで楽しみです!

参考

Gameplay Attributes and Gameplay Effects | Unreal Engine Documentation GitHub - Pantong51/GASContent: Repo to gather all Gameplay Ability System content for UE4 GitHub - tranek/GASDocumentation: My understanding of Unreal Engine 4's GameplayAbilitySystem plugin with a simple multiplayer sample project. UE4 GameplayAbility Pluginについてのメモ - Qiita