GameplayEffect で継続ダメージ処理をやってみる。
最近、GameplayEffect について調べてます。少しわかってきたので、簡単なサンプルを作ってみたいと思います。今回は毒状態みたいな継続ダメージ処理を GameplayEffect で実装してみたいと思います。
前提
- Unreal Engine 4.22.3 を使用しています。
- AttributeSet の実装や AbilitySystemComponent の実装については記述しません。
- AttributeSet には Health という HP を表す Attribute で設定されていると仮定します。
やりたいこと
今回実装してみるものの仕様はざっくり以下になります。 * 毒状態のような継続ダメージ処理 * 継続する期間は 15 秒間 * 5 秒おきにダメージを喰らう * 継続ダメージが有効中は、パーティクルを発生させる * ダメージ時は、パーティクルを発生させる
下2つの仕様は GameplayEffect が有効かどうかを視覚的に確認したいがために追加しました。
それでは、実装していきます。
GameplayEffect の作成
まず、GameplayEffect のブループリントを作成します。
Blueprint Class から GameplayEffect クラスを選択し、GameplayEffect のブループリントを作成します。
作成した GameplayEffect の Class Defaults で設定をしていきます。
今回は GameplayEffect
、Period
、Display
を使用します。
Gameplay Effect カテゴリの設定
まず、Gameplay Effect
カテゴリの設定をしていきます。
以下、Gameplay Effect
は GE と省略します。
GE の有効時間を一定期間に設定するために、Duration Policy
は Has Duration
にします。
次に、有効時間を設定するために、Duration Magnitude
の項目を設定していきます。
Magnitude Calculation Type
は値をどのように設定するかに関する項目です。
今回はそのまま float 値で 15 秒と設定したいので、Scalable Float
に設定し、
Scalable Float Magnitude
に 15.0 と設定します。
これにより、この GE を起動してから 15 秒間の間、この GE は有効状態になります。
次にダメージ処理のための設定を行います。
Modifiers
は、指定した Attribute をどのように更新するかを設定します。
今回は GE が適用される毎に Health を 50.0 ずつ減らすようにしてみました。
そのため、Attribute
には AttributeSet の Health、Modifier Op
には Add
を設定しています
(DefaultAttributeSet はこのサンプル用に作成しておいた AttributeSet クラスの名前です)。
これにより GE の実行時に Health の値に -50.0 を追加してくれます。
Period カテゴリの設定
次に Period
カテゴリの設定を行います。
ここでは、何秒おきにこの GE を実行するかを設定できます。
今回は 5 秒おきに GE を実行するので、Period
に 5.0 を設定しました。
また、GE を起動直後はダメージを発生させたくないので、Execute Periodic Effect on Application
のチェックを外しておきました。
この項目を有効にしておくと、GE が起動した際にもダメージが発生することになります。
Display カテゴリの設定
最後に Display
カテゴリを設定していきます。
Display
カテゴリはエフェクトやサウンドのようなものを設定するために存在する項目のようです。
といっても実際に設定するのは、主にタグかと思います。
Gameplay Cues
の Gameplay Cue Tags
に Effect.Poison
というタグを作成し、設定しました。
これを設定しておくことで、この GE が起動または実行されたときに、このタグに紐づいた Gameplay Cue
が処理します。
以上で、GE の設定は終わりです。次に Gameply Cue
の実装をしていきます。
Gameplay Cue
では、GE が起動したときやダメージ処理が実行されたときのエフェクト処理を記述していきます。
Gameplay Cue の作成
Blueprint Class から GameplayEffect クラスを選択し、GameplayCueNotify_Actor のブループリントを作成します。
作成した Cue の Class Defaults の Gameplay Cue
カテゴリの Gameplay Cue Tag
に Display
で設定したタグを設定します。
これで先ほどの GE が起動された場合にこの Cue が紐づくようになります。
次にエフェクトの発生処理を記述していきます。
まず初めに、OnActive 関数をオーバーライドし、次のように実装します。 OnActivate 関数は、この Cue に紐づいた GE が起動した場合に呼ばれます。 ここでは、GE が有効中であることがわかるように GE が有効中の間常にエフェクトが発生するように P_Smoke を発生させるようにしました。あとで消せるように Emitter Smoke 変数でパーティクルを保持しています。
次に OnExecute 関数をオーバーライドし、次のように実装します。 OnExecute 関数は GE が実行されるたびに呼ばれます。今回のサンプルの場合は ダメージ処理が発生するたびに呼ばれることになります。 ここでは、GE が実行されるたびに P_Explosion を発生するようにしました。
最後に OnRemove 関数をオーバーライドし、次のように実装します。 OnRemove 関数は GE が削除される際に呼ばれる関数です。 ここで GE が削除されるときの後処理を記述しています。
準備は以上です。最後に動作確認をしていきます。
動作確認
レベルブループリントで、キャラクターに GE を付与し、GE を実行するようにします。
キャラクターの Health が減っているかどうかを確認するために TIck イベントを次のように実装しました。 GetHealth 関数や GetMaxHealth 関数は、今回説明しませんが、 キャラクターが持つ AttributeSet から Health と MaxHealth の値を取り出すような処理を C++ 側で記述しています。
実行すると次のような感じです。 GE が起動すると煙が上がり、約5秒おきに爆発エフェクトが発生することがわかると思います。 また、非常に見づらいですが、左上の Debug String から Health が 50 ずつ減っていることも確認できるかと思います。
駆け足で説明してきましたが、このような感じです。 まだまだ GameplayEffect について調べているので、ほかに使い方がわかれば新しく記事を書くつもりです。
今回は以上です。