[UE]AbilitySetのパラメータをDataTableで初期化する方法

<検証時のバージョン>
Unreal Engine 5.2.0(紹介内容の1点目)
Unreal Engine 5.2.1(紹介内容の2点目)

<前置き>
Gameplay Ability System (GAS)のAttributeSetのパラメータ(HPなど)を初期化する方法について、DataTableを使用してみました。

今回紹介する内容は以下の通りです。
・DataTableからパラメータを初期化する方法
・1つのDataTableで複数クラスのパラメータを初期化する方法

今回は対応していませんが、AbilitySystemComponetの継承クラスを作成した方が2点目の実装方法としては良いです。

DataTableからパラメータを初期化する方法

1: C++からAttributeSetの継承クラスを作成してパラメータを定義

2: DataTableの準備
DataTableをクリックした後、Pick Row StructureからAttributeMetaDataを選択

作成したデータテーブルに1のAttributeSetのパラメータを設定
AbilitySystemComponentのInitStats関数で初期化を行うため、RowNameは「AttributeSetのクラス名」 + 「.」 + 「パラメータ名(変数名)」を設定します。
※以下2個目の画像のコードにある通り、AttributeSetのプロパティからDataTableのどの行を取得するかを選択しているためです

3: パラメータを初期化実行

以下の2点を対応する
・AttributeSetのパラメータを設定したいクラス(今回はCharacterの継承クラス)にAbilitySystemComponentを追加する
・呼び出し先(今回はCharacterクラス)のBeginPlay関数内でInitStats関数を実行する
 ※引数のAttributesとDataTableは1と2で作成したものを使用します

<確認>
DataTableのBase Valueで設定した値が反映されることが確認できました。

1つのDataTableで複数クラスのパラメータを初期化する方法

1つ目の方法ではクラス単位でDataTableを作成する必要があるため、AttributeSetに適応するクラス名を識別する情報を追加します。
※AttributeSet.hのコードに記載されているCurveTableを利用する方法の方が良いのだと思いますが、まだ使い方を把握できていないので別の方法をとっています。

1: 初期化処理実行用の関数を定義
<呼び出し元>
今回はCharacterクラスに定義していますが、AbilitySystemComponentの継承クラスで定義した方が良いです(Component追加先のクラスの指定はないため)。
AttributeSetのインスタンスはCreateObjectを使用して任意のクラスから作成できますが、今回は最初に作成したクラスを決め打ちとしています。

<AttributeSetクラス>
AttributeSetクラスのInitFromMetaDataTable関数をベースにしています。

変更箇所はRowNameStr(DataTableのRowNameを検索するための文字列)に特定のクラスを識別するための文字列(引数のSpecificName)を追加しています。
また、プロパティがFNumericPropertyである場合の処理も定義されていますが、今回の実装ではFGameplayAttributeDataのプロパティのみなので省略しています。

2: DataTableの準備
DataTableの作成方法は先程と同じです。
今回はプレイヤーと敵で定義するため、先頭に「Player」+「.」と「Enemy」 + 「.」を設定しています。

3: パラメータを初期化実行

1点目の「DataTableからパラメータを初期化する方法」と同様です。
今回はプレイヤーと敵のクラスでそれぞれ実行させます。
※下記はプレイヤーの場合です

<確認>
プレイヤーと敵で別々の値にて初期化されていることが確認できました。

最後に

以前GASを使用した際は、パラメータの初期化はAttributeSetはコンストラクタで定義していたため、値を変更する場合はc++のコードを変更していましたが、DataTableで変更できると調整がしやすくなりました。

GASは今後も使用すると思いますので、追加で紹介したい内容があれば掲載します。

コメント