データ ドリブン ゲームプレイ は、ライフタイムの長いゲームの作業量と複雑さを軽減するうえで役立ちます。たとえば、ゲームによっては、オンライン サービス モデルを使用してユーザーにアップデートを提供する場合があります。このモデルでは、ゲーム内の特定のデータ パラメータを調整することで、ユーザーのフィードバックに基づいてコンテンツのバランスを取ったり、追加したりすることができます。
データ ドリブン ゲームプレイは、データの作成と進行状況を可視化し、パラメータ化するためのインターフェースを提供します。データは Microsoft Excel などの、スプレッドシート ドキュメントに移行することができます。これらのドキュメントを維持して、インポートすることで、ゲームにデータを自動的に反映させることができます。
DataTable および CurveTable は、Excel ドキュメントを介して Unreal Engine にインポートできます。これらの Excel ドキュメントは xlsm
(マクロ対応の Excel ドキュメント) であり、マクロによるエクスポート ボタンがあります。そのボタンを使用して、中間データ形式であるカンマ区切り値 (.csv
) 形式に簡単にエクスポートできます。
これらのドキュメントは、データを見つけることや編集することがさらに容易になるように、単一の場所に格納されています。サンプルの .xlsm
ファイルをダウンロードするには、次のリンクを 右クリックし、[Save as (対象をファイルに保存)] を選択してダウンロードします。
データ テーブル
データ テーブルは、意味のある使いやすいやり方でグループ化されている、多岐にわたる関連データのテーブルであり、そのデータ フィールドは、アセット参照などの、任意の有効な UObject
プロパティにすることができます。デザイナが CSV ファイルをデータ テーブルにインポートする前に、そのデータをどのように解釈するかをエンジンに指示する行コンテナをプログラマーが作成しておく必要があります。
これらのテーブルは、指定されたコード ベースの UStruct
に 1 対 1 でマッピングされている列名と、その変数で構成されており、インポータで認識されるように、FTableRowBase
を継承している必要があります。
最初の列は「Name」という名前であることが想定されており、ゲームで使用するために各列がアクセスする名前が格納されています。それ以降の列には、見出しの変数名と、その下の同じ列には、その行と列の交差位置のデータが入ります。この形式では、1 つの行が、FTableRowBase
から継承された構造体に 1 対 1 で直接マッピングされます。
キャラクターが「レベル アップ」を達成するために経験値を獲得できるゲームプレイ データの例を示すため、以下の CSV ドキュメントを作成しました。
/** レベルアップ テーブルのエントリを定義する構造体 */
USTRUCT(BlueprintType)
struct FLevelUpData : public FTableRowBase
{
GENERATED_USTRUCT_BODY()
public:
FLevelUpData()
: XPtoLvl(0)
, AdditionalHP(0)
{}
/** 'Name' 列は XP レベルと同じです */
/** 前のレベルから特定のレベルに到達するための XP */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
int32 XPtoLvl;
/** このレベルで獲得した追加のヒットポイント */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
int32 AdditionalHP;
/** アチーブメントに使用するアイコン */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
TSoftObjectPtr<UTexture> AchievementIcon;
};
CSV ドキュメント:
Name,XPtoLvl,AdditionalHP,AchievementIcon
1,0,0,"Texture2d'/Game/Textures/AchievementIcon1'"
2,1000,9,"Texture2d'/Game/Textures/AchievementIcon2'"
3,1000,10,"Texture2D'/Game/Textures/AchievementIcon3'"
4,1500,12,"Texture2D'/Game/Textures/AchievementIcon4'"
5,2000,14,"Texture2D'/Game/Textures/AchievementIcon5'"
アセット タイプを囲んでいる二重引用符は、パイプラインをインポートするプロパティでは重要です。二重引用符がないと、そのテキストは Texture2d
としてインポートされます。
データ テーブルのインポート プロセス
CSV ファイルをインポートするには以下の手順に従います。
-
Excel などのスプレッドシート ソフトウェアで、ファイルを
.csv
拡張子で保存します。 -
Unreal Editor を開き、コンテンツ ブラウザ の [Import (インポート)] をクリックします。
-
DataTable としてインポートする CSV ファイルを見つけて選択します。[Import As (名前を付けてインポート)] の以下のオプションのいずれかを選択します。
- DataTable
- CurveTable
- Float Curve (Float カーブ)
- Vector Curve (ベクター カーブ)
- Linear Color Curve (リニア カラー カーブ)
-
ドロップダウン メニュー リストで [DataTable Row Type (DataTable の行タイプ)] を選択します。
-
次の追加の [Import Options (インポート オプション)] を使用できます。
インポート オプション 説明 Ignore Extra fields (余分なフィールドを無視) 有効にすると、インポート データの余分なフィールドは無視され、無効にすると、それらに関する警告が表示されます。 Ignore Missing Fields (不足しているフィールドを無視) 有効にすると、想定されているが見つからないフィールドは無視され、無効にすると、それらに関する警告が表示されます。 Import Key Field (キー フィールドをインポート) キーとして使用する、インポート データ内の明示的なフィールド。これが空であれば、 .JSON
では Name が使用され、.CSV
では見つかったフィールドが使用されます。 -
これにより、コンテンツ ブラウザ の現在のディレクトリ内に DataTable オブジェクトが作成されます。
-
DataTable オブジェクトを ダブルクリック すると、そのオブジェクトのコンテンツがエディタで表示されます。そのオブジェクトを 右クリック して、メニューで [Reimport (再インポート)] を選択すると、オブジェクトを更新できます。
オブジェクトを再インポートするときは、元のファイル パスが使用されます。
データ カーブ
データ カーブ は DataTable と同様に機能しますが、サポートされているのは浮動小数点型のみです。DataTable と同様に、最初の列は「Name」という名前であり、ゲームで使用するために各列がアクセスする名前が格納されています。
2 番目以降の列見出しには、プロットされるカーブの X 軸変数が入っています。この見出しの下にあるデータは、その行の Y 軸値です。この形式では、1 つの行が、コードでアクセスしてデータを補間できる 1 つのカーブに対応しています。
ダメージ進行のテーブルの例を以下に示します。
0 | 1 | 2 | 3 | |
---|---|---|---|---|
Melee_Damage | 15 | 20 | 25 | 30 |
Melee_KnockBack | 1 | 2 | 4 | 8 |
Melee_KnockBackAngle | 10 | 45 | 60 | 65 |
Melee_StunTime | 0 | 1 | 5 | 7 |
カーブ テーブル
カーブ テーブル は 2 次元の数値データを定義するのに便利です。シンプル カーブとリッチ カーブはカーブ データ テーブル エディタで編集できます。
カーブ テーブルを編集する場合は、エディタを開いてテーブル内またはカーブ ビュー内でカーブを編集できるため、そのカーブを作成した外部プログラムに戻る必要はありません。
コンテンツ ブラウザ内でカーブ テーブルを作成するには、[Miscellaneous (その他)] セクションに移動します。
カーブ テーブルのインポート プロセス
CSV ファイルをインポートするには以下の手順に従います。
-
Excel などのスプレッドシート ソフトウェアで、ファイルを
.csv
拡張子で保存します。 -
Unreal Editor を開き、コンテンツ ブラウザ の [Import] をクリックします。
-
カーブ テーブルとしてインポートする CSV ファイルを見つけて選択します。[Import As] の以下のオプションのいずれかを選択します。
- DataTable
- CurveTable
- Float Curve
- Vector Curve
- Linear Color Curve
-
ドロップダウン メニュー リストで [Curve Table Type (カーブ テーブル タイプ)] を選択します。選択すると、補間タイプとして [Constant (定数)]、[Linear (リニア)]、[Cubic (キュービック)] のいずれかを選択するように求められます。
補間タイプ 説明 Constant Y の値は X のデータポイントとの間で補間されず、X の既知の値にクランプされます。 Linear Y の値は X のデータポイントとの間で線形補間されます。 Cubic Y の値は X のデータポイントとの間で三次補間されます。 -
これにより、コンテンツ ブラウザ の現在のディレクトリ内にカーブ テーブル オブジェクトが作成されます。
-
カーブ テーブルをダブルクリックすると、それがカーブ テーブル エディタで開かれきます。
-
[Graph (グラフ)] ボタンをクリックすると、カーブ テーブルのデータがグラフ形式で表示されます。
-
[Curve Table View (カーブ テーブル ビュー)] では複数のカーブを表示できます。
-
カーブを右クリックして [Rename (名前変更)] または [Delete (削除)] を選択すると、そのカーブを名前変更または削除できます。
データの連携
これらのテーブルのデータを使用するには、DataTable または CurveTable のどちらを連携させるかに応じて、FDataTableRowHandle または FCurveTableRowHandle のいずれかを ブループリントで公開された変数として配置する必要があります。
コンテンツ プロバイダは、次の 2 つのサブフィールドがあるデータ フィールドを公開します。
サブフィールド | 説明 |
---|---|
DataTable/CurveTable | データが保持されているテーブルへのコンテンツ参照です。 |
RowName | データの取得元とする行の最初の列にある名前です。 |
データの使用方法 (C++)
データを連携させたら、ハンドル構造体がヘルパー関数FindRow()
と GetCurve()
を提供します。これらの関数によって、データが入力されている構造体またはカーブのいずれかを取得する手段が提供されます。
FCurveTableRowHandle
の場合は、FRichCurve
ポインタが返されます。一方、FDataTableRowHandle
の場合は、
テンプレート関数呼び出しで構造体を指定できます。この構造体として、最終的な構造体、
または継承階層でのその親のいずれかを指定できます。
すべての構造体および返されたカーブは、関数のローカル スコープの範囲外でキャッシュしないようにする必要があります。そうすることで、そのテーブルが再インポートによってリフレッシュされたときに、データの変更内容が直ちに反映され、無効なポインタによるアクセスが発生しなくなります。
上記の DataTable の例では、参照されているアセットは遅延ロード アセット (TSoftObjectPtr
によって処理される) です。
そのアセット フィールドのタイプが UTexture
に設定されている場合、DataTable がロードされるときに、そのすべてのアセットがロードされることになります。