ゲームプログラマーの誰に尋ねても、データ駆動型の手法を採ることがベストであると答えることでしょう。ゲームデザイナーがプログラマーの助けを借りずにゲームプレイを最大限調節できるようになるからです。また、ゲームデザイナーに尋ねると、調節とバランス調整が何度も必要となるゲームでは、Excel (または他のスプレッドシート ツール) で提供されている有用なツールを使って直接データを操作できることがベストであると多くの方が答えることでしょう。
そこで問題は、ゲームデザイナーによって定義されたデータをどのように Excel から取り込み、UE4 で使用できる形式に落とし込めるかということになります。耳寄りなニュースがあります。実は、UE4 ではもうこれが可能なのです!
アンリアル・エンジン 4 では、コンマで区切られた変数 (.csv) ファイルからデータをインポートできます (Excel ファイルはそのファイル形式に簡単にエクスポートできます)。さらに、Excel のドキュメントでマクロを作成することによって、そのドキュメント自体の内部に置かれているボタンをクリックして .csv ファイル形式にエクスポートされるようにすることができます。次は、そのようにして作成されたドキュメントの例です。
- Example.xlsm (ダウンロードするためには、右クリックして [名前を付けてリンク先を保存] を選択します。)
*注意: マクロを実行するためには、[コンテンツの有効化] をクリックしなければならない場合があります。これは、Excel のセキュリティ機能によります。許可なく勝手にコードがコンピュータ上で実行されないようにしているのです。
データのテーブルの型
データのテーブルの型は、次の 2 つが便利です。
- DataTables
- CurveTables
DataTables を使うと、インポートで必要となるようなほとんどあらゆるデータ型を自由に定義できます。一方、CurveTables は、浮動小数点数によって定義されたカーブに沿って補間するので、よりカスタマイズされています。
Data Tables
データテーブルを使うことによって、カスタムのデータ構造を定義して、Excel でその値を編集、保持できるようになります。データの形式を定義するためには、FTableRowBase を継承するとともに、各種プロパティとデフォルトの値を定義する構造体を作成します。
例として、レベルアップのための経験値データの定義と、ゲームにデータを供給する CSV ドキュメントを以下に掲載します。
/** レベルアップ テーブルのエントリーを定義する構造体 */
USTRUCT(BlueprintType)
struct FLevelUpData : public FTableRowBase
{
GENERATED_USTRUCT_BODY()
public:
FLevelUpData()
: XPtoLvl(0)
, AdditionalHP (0)
{}
/** 前のレベルから所定のレベルに進むための経験値 */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
int32 XPtoLvl;
/** このレベルで得られるエキストラ HP */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
int32 AdditionalHP;
/** Achivement (成績) のために使用するアイコン */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=LevelUp)
TAssetPtr<UTexture> AchievementIcon;
};
これに対応する CSV のドキュメントは、次のようになります。最初の列は、データの行を識別するための一意の名前です。後にデータを取得する場合に、必要なデータの行を名前で参照します。
Name,XPtoLvl,XP,Asset
1,0,0,"Texture2d'/Game/Textures/AchievementIcon1'"
2,1000,1000,"Texture2d'/Game/Textures/AchievementIcon2'"
3,1000,2000," Texture2D'/Game/Textures/AchievementIcon3'"
4,1500,3500," Texture2D'/Game/Textures/AchievementIcon4'"
5,2000,5500," Texture2D'/Game/Textures/AchievementIcon5'"
Curve Tables
CurveTables の用途は、より限定的です。というのは、float 型しか含むことができないためです。Excel 内部で各種の式とツールを使用して、ゲームのための経験値やその他の項目のためにカーブを定義し、UE4 でそれらのカーブを評価できます。.
たとえば、キャラクターのレベルやその他のファクターに基づいてダメージがどのように増加するのかを表すカーブを定義することができます。
具体例
次は、ダメージの進行カーブのためのテーブルの例です。(ご覧のとおり、列の数字は連続する整数である必要はありません。差があってもかまいません。)
0 |
2 |
3 |
7 |
|
---|---|---|---|---|
Melee_Damage |
15 |
20 |
25 |
30 |
Melee_KnockBack |
1 |
2 |
4 |
8 |
Melee_KnockBackAngle |
10 |
45 |
60 |
65 |
Melee_StunTime |
0 |
1 |
5 |
7 |
カーブが特に役立つのは、バランス調整やアイテムの分布、能力とスキルのための属性といったものを扱う場合です。定義したカーブでは、その上に位置するどの点についても求めることができます。たとえば、ゲームの難易度に応じて HP を変化させたいモンスターがいる場合、100 から 10,000 までの HP のカーブを、線形または 3 次またはその他の方法で定義できます。そして、カーブの最小値から最大値に向かって (たとえば) 75% の地点の値を抽出することによって、「難し目」などという難易度レベルのための HP 値を決めることができます。
インポート
インポートの過程はとても簡単です。Excel (または他のソフトウェア) のスプレッドシートを .csv 形式にエクスポートするだけです。そして、そのファイルをコンテンツ ブラウザにドラッグアンドドロップします。
現在のところ、Excel で .csv ファイルを開いている場合に、それを UE4 にインポートしようとすると、はっきりとしたエラーメッセージが表示されることなく失敗してしまいます。インポートする前には、必ず Excel でファイルを閉じるようにしてください。この問題は現在調査中です。
ダイアログボックスが表示されるので、DataTable (したがって、C++ で前に定義されている Row Type も) または CurveTable を選択できます。CurveTable を選択した場合は、カーブ上の点と点の間を補間する方式 (線形、3 次など) を選択する必要があります。
そこから、Data Table または Curve Table のアセットをコンテンツ ブラウザで 見ることができます。さらに、それらをダブルクリックして開くと、その値を調べることができます。
データを使用する
データをできるだけ設定しやすくするためには、Type FDataTableRowHandle または FCurveTableRowHandle について、ブループリントにエクスポーズされた変数を作成すると良いでしょう。すると、ブループリントでデザイナーが Table と Row Name を指定できるようになります。
これらの参照が設定されると、FCurveTableRowHandle::GetCurve() を呼び出して、FRichCurve を取得したり、FDataTableRowHandle::FindRow() を呼び出して、先に定義した構造体のインスタンスへの参照を取得できるようになります。ただし、これらの参照は、関数のスコープを超えて持ち続けるべきではありません。その理由は、データが再インポートされた場合に、変更を直ちに有効にすべきであり、無効なポインターにアクセスすべきではないからです。
DataTables と CurveTables に関する更なる情報
『データ主導型ゲームプレイエレメント』というドキュメントをご覧ください。
この記事をお読みになることで、Excel を使用して、デザインのプロセスを改善できるようになると思いますが、さらに質問がありましたら、いつものようにAnswerHub や フォーラムに遠慮なく投稿してください。