※この記事で使用しているUnrealのVersionは04.20.3です。

※この記事のサンプルプロジェクトは以下URLにアップされています
サンプルプロジェクト

リアルな現場のDataTable事情 レベル【★★】

【UE4】DataTableの使い方-その① ~基本編~では、大雑把にDataTableの初歩的なことについて記事にしました。

では、実際の現場はどんな使い方をしているのでしょうか?

(僕が見てきた中で)よくあるのが、エクセル、CSV、DataTableをワンセットで扱うものです。
エクセルで計算などを行い、VBA等でCSVに出力。それをUnrealにインポートするというフローになります。

例えばマップリストのDataTableを作る場合。

という感じで作るでしょう。

こうしておけばいちいちマップを開いて中のプロパティをいじる必要なくマップの情報を更新できます。

ただ、エクセルと実際のレベルデータに食い違いがある場合や、CSVへのエクスポート・DataTableへのReimportを忘れたりすると、バグの温床になりかねない。(情報の一元化ができない)
しっかりと開発体制を整えレギュレーションを決めれば問題なく機能する設計ではあります。

でも、個人的には同じ情報がExcel・CSV・DataTableと3つもあるのは何か気持ち悪い。

でも、確かにエクセルは見やすいし便利で、世の中にはエクセル大好き人間が多いので、エクセルを使ったリスト管理がなくなることは無いのでは無いでしょうか……

で、あれば、なるべくエクセルが必要のなくなる設計を目指せばEngine内で作業が完結しスマートなのではないでしょうか?

無駄なエクセルは排除 レベル【★★☆】

例えば、プレイヤーのマップごとのスタート地点がリストになったデータテーブルがあるとしましょう(何かしらの理由でShipping版にはPlayerStartアクターを起きたくない場合など)

このリストを

1:実際のマップを開き、Shippingに含まないサブレベルに、想定される復帰地点に適当なアクターを置き、そのDetailの情報をコピー

2:エクセルに入力。

3:CSVエクスポート。

4:DataTableへImport

こんな風に作るのはおかしい!と思いましょう。

情報が一度Unrealから出て、再びUnrealへ戻ってくるという(しかも同じ情報が)やらないほうがいい類の設計かと思います。(何かしらの外部情報と掛け合わせる場合を除く)

Unreal内で完結できるものは、Unrealで完結させましょう

C++で拡張すれば手っ取り早く出来ますが、そんなことをしなくても、Blueprintだけでも問題なくできるかと思います。

Blutilityでワンクリック更新 レベル【★★★】

エディター内でデータテーブルの内容を更新するには、「Blutility」という機能を使います(まだ実験段階の機能です)

この機能は、エディター上の左上にある「編集」→「エディタの環境設定」を選択し、
中の設定の「一般」→「実験段階」→「Tools」内にある「Editor Utility Blueprints(Blutility)」にチェックを入れます。

こうすることで、「ブループリントユーティリティ(Blutility)」というBlueprintを作成できるようになります。

まず、このBlutilityを作成します。作成する際の親クラスですが、今回は「AssetActionUtility」というクラスを指定して作成します。

このBlueprintAssetですが、普通にダブルクリックをしても、イベントグラフは出てきません。右クリック→「ブループリントの編集」を選択することでBlueprintを編集できます。

とりあえず開いてみましょう。

今回のポイントは、最近実装された、DataTableのReimport関数です。

↑画像の下2つの関数を使うことで、Unreal内のみでReimportが完結するようになります。

では、実際に手間を省くブループリントを書いていきましょう。

まず、前提条件として
1,メインのレベルの命名規則はPL_XXXX(XXXXは固有の名前)
2,Shippingに含めない、PlayerStartのみがおいてあるレベルの命名規則をPL_XXXX_DummyLV
3,レベルはすべて/Game/Map以下のフォルダにある
4,DummyLVにあるPlayerStartの位置・回転情報を指定したDataTableにReimportしたい。

とします。↓こんな感じです。

データテーブルはこんなやつ

上記の要素を踏まえてUnreal内で「ワンボタン」で完結するようなBlueprintを書いてみました。

ConvertVecToCSVStringの中身

ConvertRotToCSVStringの中身

やっている内容としては、
・GetAssetRegistryという関数でパスからアセット一覧を取得
・取得したアセットで、PlayerStartのある「PL_XXXX_DummyLV」を探し出す
・探し出したレベルを読み込んで、その中のプレイヤースタートの情報を読み取って、CSVStringを作成
・すべて終わったらデータテーブルにImportする

といったような感じです。

Blutilityで作ったカスタムイベントは、「詳細」ウィンドウにある「エディターで呼び出す」にチェックを入れることで、Blutilityウィンドウにボタンを作ることが出来ます。

作成したら、一度ブループリントを閉じて、今度はBlutilityアセットをダブルクリックで開きましょう。

↑のウィンドウが出るはずです。

そのまま作成したボタンを押すと、指定した「DataTable」アセットにDirtyのマーク(編集したよのマーク)がついているかと思います。

開いてみると、レベルの情報を元にしっかりとデータが入っているはずです。

浮動小数点がすごいけど、しっかりデータは入っているようです。やった!

これをやっておけば、次回変更が合った場合はいちいちUnreal→Excel→CSV→Unrealの手順を踏まずに、「ワンボタン」でことを終わらせることが出来ます。

また、このBlueprintだと、DummyLV文だけレベルを開いてうっとおしいという場合は、処理を改造して特定のレベルだけをImport、あとは今DataTableに入っているデータをそのまま使うなんてこともできるかと思います。

今回書いたようなケースは本来は無いとは思いますが、Unreal内のデータだけで情報が足りるものに関しては、いちいちエクセルに出力せずに、直接Unreal上で書き込んでしまえば、手間もファイルも減るかと思います。

※この記事のサンプルプロジェクトは以下URLにアップされています
サンプルプロジェクト