💬

ダメージ計算周りのパラメーターをGameplayEffectで設定していたのをDataAssetで設定するように移行した話

2022/12/15に公開

この記事はUnreal Engine (UE) Advent Calendar 2022 カレンダーその3の15日目の記事です。
前回はPateさんの [UE5]PixelStreamingのパラメータ設定方法でした。

自分の記事では、自分たちのチームで活用した、DataAssetからGameplayEffectを作成した際に得た知見について記載しようと思います。

概要

自分たちのチームで作ってるゲームは元々UE4の公式サンプルプロジェクトである「ActionRPG」を参考にしてGameplayAbilityやAttributeSetなどを使ってダメージ計算のやりとりをしています。その際に、以下のような問題がありました。

  • GameplayEffectの設定項目が多かった
    • 慣れればどこを設定すればいいかわかるが、階層が深かったりで慣れてない人が設定するには大変だと感じた
  • 何を設定すればいいかわかりずらかった
    • うちのチームのゲームではHP以外にも内部で設定しているパラメータがあり、与えたい値に対して計算するクラスが違ったので、迷う場面があった。

上記のような問題があり、チームで話し合った結果、DataAssetを使って設定する項目をまとめて運用できないか?という話が上がりました。

その際に調べながら試した結果、以下の方法でできそうなのがわかりました。

  1. ダメージ計算のベースとなるGamePlayEffectを作成します。
  2. ダメージ計算用のパラメーターが入ったベースとなるDataAssetを作ります。
  3. ベースのDataAsset関数内で1.で作成したGamePlayEffectを作成して、作成したGamePlayEffectに必要な情報を渡してダメージ計算をさせる。

順を追って説明をしようと思います。

1. ダメージ計算のベースとなるGamePlayEffectを作成する

まず最初に、ダメージ計算のベースとなるGameplayEffectを作ります。
実際にできたのGameplayEffectがこちらになります。

ここでやっていることは、以下の2つです。

  • 「Calculation Class」に ダメージ計算用で使うClassを全て指定する
    • 画像には写ってませんが他にも計算するClassを指定しています
  • Blueprintからダメージ値などの値を設定できるように、「Magnitude Calculation Type」を「Set by Caller」にする
    • これは3.のDataAsset内の関数で設定をするためです。

2. ダメージ計算用のパラメーターが入ったベースとなるDataAssetを作る

次に、ダメージ計算に必要なパラメータを格納できるベースとなるDataAsset「DamageInfo」を作成しました。
実際のDamageInfoはこのようになっています。
※内部設定を公開しすぎてゲームの攻略が簡単になってしまうのも困るので少しぼかしてます。こういう感じで設定するんだと雰囲気だけ感じてもらえれば幸いです

このパラメータをもとに、実際にダメージ計算する関数を作っていきます。

3. DamageInfoの関数内で1.で作成したGamePlayEffectを作成して、作成したGamePlayEffectに必要な情報を渡してダメージ計算をさせる

次に実際にダメージ計算に必要なGamePlayEffectを作成し、ダメージ計算をさせる関数を作成していきます。
関数の全体像はこちらになります
※こちらも上と同様の理由で少しぼかしてます。雰囲気だけ感じてもらえれば幸いです

ここでやっていることは以下の4つになります。

  • 「Make Outgoing Spec」で1. で作成した「GameplayEffect」をベースとして「GameplayEffectSpecHandler」を作成
    • これはEffectSpecHandlerにしないとパラメータの設定ができなかったため
  • 作成したGameplayEffectSpecHandlerにダメージ計算で使う値を「Assign Tag Set by Caller Magnitude」を通して設定する
  • 「Add Granted Tag」でダメージを与える相手に付与するGameplayTagを設定する
  • 「ApplyGameplayEffectSpecToTarget」でTargetに指定した相手に対してダメージを与える

やったこととしては以上になります。

実際にやってみた所感

DataAssetでやりとりできるようにしたことで、

  • 設定する項目がひと目でわかるようになったので、設定がしやすくなった
  • ダメージ計算で使うパラメータと計算ロジックがまとめられるので、ダメージ計算自体のロジックが変わってもApplyDamage関数内を変えればよくなった

まとめ

DataAssetに移行したことで、問題が解決できたのはとても良かったです。
また何か知見があった際に記事を書こうと思います。

次はDv7Pavilionさんの【UE5】倉庫番を作ろう! プロジェクトセットアップ・ゲームプレイ編です。楽しみですね…!

参考

Gameplay Effect にてModifierの値をBPから直接指定できる Set by Caller の使い方について
UE4 C++ GameplayAbilitiesを勉強していくPart.3-1 GameplayEffect ModifierMagnitudeCalculationとExectuionCalculation

Discussion