BLOGブログ

2017.11.24UE4/Blueprint

[UE4][C++] ユーザー定義オブジェクトのアセット化で楽をする

0.前置き

Excel等で編集したリスト形式のデータをアセット化する機会はよくあると思います。

このとき、DataTableで事足りるのであればそれを使うのが簡単です。

しかし幾つかの事情により独自の型でデータを保存したい場合があります。

 

①編集など都合によりデータが複数のシートに分かれている、又は一つのレコードが複数のシートに分かれている

②Name以外の型をキーとして参照したい(intとか)

③アセットへの参照を含ませたい(長い呪文を書かずに)

④複数の行を一つのレコードとして扱いたい

 

とりあえずDataTableにしておいて実行時に何とかするのも一つの手段ですが、

エディタで済ませられる処理についてはそうした方がパフォーマンス上好ましいです。

 

このような場合、独自にオブジェクトの型を定義しアセット化することになります。

※このやり方については以前の記事にて紹介されていますので、合わせて御覧下さい。

http://historia.co.jp/archives/1401

http://historia.co.jp/archives/1423

http://historia.co.jp/archives/1425

 

真面目にやるのであれば、元となるテキストデータを読み込みデータ化するプロセス(インポート処理)をわざわざ定義することになります。

アセットのタイプに応じたFactoryクラスを作成し、FactoryCreateText等をオーバーライド・実装することになりますが、これはとても・・・とても面倒です。

 

 

既にインポートそのものは可能なデータ(CSV等)を元とする場合であれば、

このあたりを簡略化する手段があります。

 

1.DataTableとして取り込んで加工する

一旦DataTableとしてインポートした後エディタで再処理する手法が有用な場合があります。

・複数のDataTableを統合する

・データ名を参照に置き換える

・任意の列をキーとして参照できるようにする

等をこれで行えます。

UCLASS(BlueprintType)
class MYTESTPROJ_API UMyDataAsset : public UObject
{
  GENERATED_BODY()

public:
/*
  元となるデータテーブルを WITH_EDITORONLY_DATA 内に宣言
  (データテーブルそのものは実行時に使用しないため)
 必要に応じて複数の変数や配列を用いる
 */
#if WITH_EDITORONLY_DATA
  UPROPERTY(EditAnywhere, Category="Test")
  class UDataTable* DataTable;
#endif

/*
  データを格納したい形式でフィールドを宣言(以下はてきとうな例)
 */
  UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
  TArray<FMyDataStructure1> DataAsArray;
  UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
  TMap<int, FMyDataStructure2> DataAsMap;

public:
/*
  データテーブルを読み取って必要な処理を施しフィールドに格納する
 */
  UFUNCTION(meta = (CallInEditor = "true"), Category="Test")
  void Process();
};

以下2点がポイントです

①#if WITH_EDITORONLY_DATA にDataTableを入れる

パッケージにDataTableそのものは含まれないようになります。

Process()内の実装においてこれを参照する部分にも同様の囲みが必要になることに注意してください。

②Process()関数の属性に meta=(CallInEditor=”true”) を含める

こうすることで、作成したアセットの編集ウインドウに以下のようなボタンが表示されます。

これを押すことにより任意のタイミングで処理を行えます。

DataTableのReimport処理もProcess内に書いてしまえばワンボタンで更新が可能になります。

一応ですが、関数の名前は任意です。

作用の異なる複数の関数を作成することも有用です。

 

テキストからのパースを含むインポート処理を書くことに比べてかなり気楽にできるはずです。

 

2.UDataAssetを利用する

Factoryを定義するのはとてもとても面倒です。

殆どCopy&Pasteで済むとしても面倒です。

UObjectのかわりにUDataAssetを継承することで、Factoryの定義なくしてアセット化を行えます。

この後開くダイアログで作成したいクラスを選択すればOKです。

マウスオーバー時に型名として”DataAsset”と表示されますが、

定義した通りの型のプロパティに問題なく設定できます。

 

 

以上、参考になれば幸いです。よいアセットライフをお過ごしください。