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

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

最近Editor Utility系の話が多くてすみません。マテリアルとかその他のお話も近々書きますので…><

UE4 Blutilityという名前が4.23からなくなるようなので色々調べてみた

alweiさんの記事にあるように、UE4.23になってから、「Blutility」は消え、「Editor Utility Blueprint」という代替が出てきました。

「Editor Utility Widget」が入ったというところに埋もれていますが、今まで使えていた「Blutility」をダブルクリックすることによって出てくる簡易的な拡張ウィンドウは、この「Editor Utility Blueprint」では使えません…ドコニイッタンダ。

どうやらソースの方からも消えているようなので、復活は見込めないようです。

あの拡張ウィンドウは「Editor Utility Widget」では出来ない、Assetの参照をContent Browserからドラッグ&ドロップで持ってこれたりする部分ができなくなったのがかなりの痛手だと一部の界隈では嘆いています。

しかし! 同じ機能を4.23でも簡単に実現することができます。

何を使うかというと、「Data Asset」です。

Data Assetを定義するクラスで「Call In Editor」のプロパティを付けた関数やカスタムイベントを用意するだけで、Blutilityと同じことを行えます。

※過去にも【UE4】手軽に独自のデータアセットを作成する 【★★】で少し書いています。

しかし、Data AssetクラスのBlueprintからだと、Editor Utility内で使える関数が軒並み使えません(Editor Onlyで使用できる機能ができない)

これを解決するには、Data Asset側でBlueprint Utility系のアクターやインスタンスを作成して、その中の関数などを呼び出すということを行います。
(C++でEditor Utility系のモジュールをincludeした継承クラスを作ったり、独自アセットを定義したりすればすぐ解決しますが、C++を使わない方法のご紹介になります)

Data Assetを使ったエディター拡張(データテーブルの操作の場合) レベル【★】

簡単な例として、DataTableのReimportを行うUtility機能を作成してみます。(別にReimportの為だけに処理を書く必要はないのですが、そこは置いておきましょう)

最初に「Blueprint Interface」アセットを作成します。

→これは、Data Assetクラス内では、後に作成するEditor Utility系のEditor Onlyのインスタンスの関数やイベントも呼ぶことができないので、情報を伝達させるためにInterfaceを使用します。

Content Browser左上の「Add New」から、「Blueprints」→「Blueprint Interface」を選択します。

そして、作成したInterfaceをダブルクリックし、開いたウィンドウ内の「My Blueprint」ウィンドウ内の「Functions」と書かれている右側にある「+」ボタンを押して、新しい関数を作成します。

関数の引数には、「DataTable」型のReferenceと、「String」型のものを用意しましょう。

できましたら一旦閉じ、今度は「Edittor Utility Blueprint」を作成します。

「Add New」→「Editor Utilities」→「Editor Utility Blueprint」を選択します。

そして、親クラス選択画面で、「Editor Utility Object」を選択しましょう。

作成しましたら、ダブルクリックで開きます。

まずは、「Toolbar」内にある「Class Settings」を選択します。
そして、「Details」ウィンドウ内の「Interfaces」部分の「Implemented Interface」プロパティにある「Add」というボタンを押して、出てきたウィンドウ内から、先程作成したInterfaceアセットの名前を探し出して選択します。

できましたら、一度左上にあるCompileボタンを押しましょう。

その後、「Event Graph」内の適当な場所で右クリックして、「Event + Interface内で作成した関数の名前」(例Event Reimport Data Table)のノードを呼び出しましょう。
※Eventがついていない方は、後にData Asset側で使います。

ノードは以下のような見た目のものです。

あとは、Data TableをReimportする関数「Fill Data Table from CSV File」というノードをつなげてあげます。
一応↓では結果をテキストで出力していますが、特に必要な処理ではありません。

出来ましたら、Compileを押して一旦このウィンドウは閉じます。

次は、ようやく「Data Asset」のクラスを作成します。

Content Browser左上の「Add New」から、「Blueprint Class」を選択します。

そして、親クラスを選択する画面で「Primary Data Asset」を選択します。

作成出来ましたらダブルクリックで開きましょう。

中身は以下のように処理を書きます。

まず、「Custom Event」ノードは、Detailで「Call In Editor」のチェックを入れるのを忘れないでください。

「Construct Object from Class」ノード(「クラスからオブジェクトを構成」ノード)は、Classの指定には先程作成した「Editor Utility Object」のクラスを選択します。
Outerは「Get a Reference to self」という項目のノードをつなげています。

呼び出しているInterface関数の引数は、新しくこのクラス内で定義してあげましょう。

ここまで出来ましたら、機能は完成しました。
このクラスをもとにしたデータアセットを作成しましょう。
Content Browser左上から、「Add New」→「Miscellaneous」→「Data Asset」を選択しましょう。

クラス選択画面では、今作成したData Assetのクラスを選択します。

そして、作成したデータアセットを開くと、4.22以前にあった「Blutility」の拡張ウィンドウとほぼ同じ見た目を確認することが出来ます。おかえり!

後はデータテーブル必要なデータテーブルを定義します。

Data Tableを定義するには「Structure」が必要なので作成します。

「Add New」→「Blueprints」→「Structure」を選択します。

とりあえず今回は、「多言語対応テキストテーブル」という想定で、以下のような構造体にしました↓

TextID:Name型
TextValue:String配列型

作成出来ましたら、このStructureを元にした「Data Table」アセットを作成します。

Content Browser左上から、「Add New」→「Miscellaneous」→「Data Table」を選択しましょう。

Structure選択画面では今作成したStructureを選択します。

これでUnreal側のデータは揃いました。

今度はReimportする対象のCSVを作成します。

今回のCSV作成は以下を参考にしました。

呪いのマーケットプレイス – 制作奮闘記

こちらにあるExcelをベースに、Unreal側の配列に対応したCSV出力を VBAをで作成しました。(配列や構造体の対応方法は需要があれば記事にします。が、VBAなので記事的に面白くないですよ…)

これで作ったCSVをプロジェクトフォルダ直下に「Resource」というフォルダを作成し、そこに入れました。

あとは、作成したData Assetを開いて、必要な情報を入力してCall In Editorで作ったボタンを押せば実行されます。

以上!

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