情報は力ではない

UE4 とか Blender とか。

GameplayEffect で継続ダメージ処理をやってみる。

最近、GameplayEffect について調べてます。少しわかってきたので、簡単なサンプルを作ってみたいと思います。今回は毒状態みたいな継続ダメージ処理を GameplayEffect で実装してみたいと思います。

前提

  • Unreal Engine 4.22.3 を使用しています。
  • AttributeSet の実装や AbilitySystemComponent の実装については記述しません。
  • AttributeSet には Health という HP を表す Attribute で設定されていると仮定します。

やりたいこと

今回実装してみるものの仕様はざっくり以下になります。 * 毒状態のような継続ダメージ処理 * 継続する期間は 15 秒間 * 5 秒おきにダメージを喰らう * 継続ダメージが有効中は、パーティクルを発生させる * ダメージ時は、パーティクルを発生させる

下2つの仕様は GameplayEffect が有効かどうかを視覚的に確認したいがために追加しました。

それでは、実装していきます。

GameplayEffect の作成

まず、GameplayEffect のブループリントを作成します。

Blueprint Class から GameplayEffect クラスを選択し、GameplayEffect のブループリントを作成します。

f:id:masahiro8080:20190707132044p:plain

作成した GameplayEffect の Class Defaults で設定をしていきます。 今回は GameplayEffectPeriodDisplay を使用します。

Gameplay Effect カテゴリの設定

まず、Gameplay Effect カテゴリの設定をしていきます。 以下、Gameplay Effect は GE と省略します。

f:id:masahiro8080:20190707131851p:plain

GE の有効時間を一定期間に設定するために、Duration PolicyHas 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 を実行するかを設定できます。

f:id:masahiro8080:20190707133055p:plain

今回は 5 秒おきに GE を実行するので、Period に 5.0 を設定しました。 また、GE を起動直後はダメージを発生させたくないので、Execute Periodic Effect on Application のチェックを外しておきました。 この項目を有効にしておくと、GE が起動した際にもダメージが発生することになります。

Display カテゴリの設定

最後に Display カテゴリを設定していきます。 Display カテゴリはエフェクトやサウンドのようなものを設定するために存在する項目のようです。 といっても実際に設定するのは、主にタグかと思います。

f:id:masahiro8080:20190707133418p:plain

Gameplay CuesGameplay Cue TagsEffect.Poison というタグを作成し、設定しました。 これを設定しておくことで、この GE が起動または実行されたときに、このタグに紐づいた Gameplay Cue が処理します。

以上で、GE の設定は終わりです。次に Gameply Cue の実装をしていきます。 Gameplay Cue では、GE が起動したときやダメージ処理が実行されたときのエフェクト処理を記述していきます。

Gameplay Cue の作成

Blueprint Class から GameplayEffect クラスを選択し、GameplayCueNotify_Actor のブループリントを作成します。

f:id:masahiro8080:20190707133708p:plain

作成した Cue の Class Defaults の Gameplay Cue カテゴリの Gameplay Cue TagDisplay で設定したタグを設定します。 これで先ほどの GE が起動された場合にこの Cue が紐づくようになります。

f:id:masahiro8080:20190707133748p:plain

次にエフェクトの発生処理を記述していきます。

まず初めに、OnActive 関数をオーバーライドし、次のように実装します。 OnActivate 関数は、この Cue に紐づいた GE が起動した場合に呼ばれます。 ここでは、GE が有効中であることがわかるように GE が有効中の間常にエフェクトが発生するように P_Smoke を発生させるようにしました。あとで消せるように Emitter Smoke 変数でパーティクルを保持しています。

f:id:masahiro8080:20190707134020p:plain

次に OnExecute 関数をオーバーライドし、次のように実装します。 OnExecute 関数は GE が実行されるたびに呼ばれます。今回のサンプルの場合は ダメージ処理が発生するたびに呼ばれることになります。 ここでは、GE が実行されるたびに P_Explosion を発生するようにしました。

f:id:masahiro8080:20190707134232p:plain

最後に OnRemove 関数をオーバーライドし、次のように実装します。 OnRemove 関数は GE が削除される際に呼ばれる関数です。 ここで GE が削除されるときの後処理を記述しています。

準備は以上です。最後に動作確認をしていきます。

動作確認

レベルブループリントで、キャラクターに GE を付与し、GE を実行するようにします。

f:id:masahiro8080:20190707134612p:plain

キャラクターの Health が減っているかどうかを確認するために TIck イベントを次のように実装しました。 GetHealth 関数や GetMaxHealth 関数は、今回説明しませんが、 キャラクターが持つ AttributeSet から Health と MaxHealth の値を取り出すような処理を C++ 側で記述しています。

f:id:masahiro8080:20190707134811p:plain

実行すると次のような感じです。 GE が起動すると煙が上がり、約5秒おきに爆発エフェクトが発生することがわかると思います。 また、非常に見づらいですが、左上の Debug String から Health が 50 ずつ減っていることも確認できるかと思います。

youtu.be

駆け足で説明してきましたが、このような感じです。 まだまだ GameplayEffect について調べているので、ほかに使い方がわかれば新しく記事を書くつもりです。

今回は以上です。