目次
※この記事で使用しているUnrealのVersionは04.27.0です。
※この記事のサンプルプロジェクトは以下URLにアップされています。
サンプルプロジェクト
【UE4】ImportSubsystemについて【★★★】
今回は「ImportSubsystem」というSubsystemについて簡単にご紹介します。
Subsystemについては以下を御覧ください。
ImportSubsystemは、アセットのImportやReimport時に発行されるデリゲートイベントをCustomEvent等にBindして受け取ることのできる機能を持ったEditor上で使用できるSubsystemです。
Bindできるのは以下の4つのデリゲートとなります。
//Import処理開始前のデリゲート
//BindするBP関数は「BindEventtoOnAssetPreimport」
FOnAssetPreImport OnAssetPreImport;
//Import処理終了後のデリゲート
//BindするBP関数は「BindEventtoOnAssetPostImport」
FOnAssetPostImport OnAssetPostImport;
//Reimport処理後のデリゲート
//BindするBP関数は「BindEventtoOnAssetReimport」
FOnAssetReimport OnAssetReimport;
//SK,SM等のアセットのLODImport処理終了後のデリゲート
//BindするBP関数は「BindEventtoOnAssetPostLODImport」
FOnAssetPostLODImport OnAssetPostLODImport;
これらのBind関数を使ってCustomEventや関数にデリゲートをBindすることで、Import,Reimportのタイミングでイベントを受けとり様々な処理を行うことができます。
例えば、TextureをImport時に、そのTextureを使ったMaterialInstanceを自動で生成する、
といったような使い方ができます。
試しにEditorUtilityWidgetに上記の処理を書いてみます。
※Bindする都合上、どこかしらにInstanceを生成して保持しておく必要があるため、ひとまずEditorUtilityWidgetを用いてテストしてみます。
もう少し実用的な使用方法は後術します。
これを実行したあとにTextureをImportすると以下のような結果になります。
ただ、上記のようにEditorUtilityWidgetを使う場合は、Importを行う前に毎回EditorUtilityWidgetをRunしておく必要があるため、あまり実用的ではありません。
理想的な起動方法としては、Editor起動直後に↑で作成したようなツールが起動され、バックグラウンドで常に待機してくれているようなものかと思います。
Editor起動直後からEditorに常駐させることができるInstanceは、冒頭で説明した「Subsystem」を使用することで実現可能です。
ただ、SubsystemはC++でしか定義ができないため、若干面倒です。
C++を使わないで、Editorに常駐させることができるInstanceを作成する方法はいくつかありますが、一番簡単な方法としては、「EditorVlidator」と「Editor起動時に実行するEditorUtility」を使用する方法です。
EditorValidatorは、アセットの保存時そのアセットが独自のルールに沿っているかどうかをチェックする事ができるクラスになります。
※以下のブログにEditorValidatorについて書かれていますので御覧ください。
Editor起動時に実行するEditorUtilityにつきましては以下を御覧ください。
実際に作成してみます。
まずは、EditorValidatorクラスを作成します。
作成したら、GraphEditorを開いてブループリントを書いていきます。
次に、EditorValidatorがEditor起動時に自動的に登録されるのをまつためのEditorUtilityTaskというクラスを作成します。
※「GetEditorWorld」関数は、「EditorScriptingUtilitiesPlugin」を有効にすることで使用可能になります。
最後に、このタスクをEditor起動時に実行するためのEditorUtilityObjectを作成します。
これらのBlueprintを作成した後に、一度Editorを終了してから起動します。
そうすることで、↓のようにEditor起動直後に右下にエディター上のアセットの読み込み待ちタスクが表示されます。
タスクが終わった後にTextureをImportすると、Blueprintで書いたImport後の処理が適応されて、自動的にTexture名が変更されたり、MaterialInstanceが作成されたりします。
ざっくり雑にImportSubsystemの使用例を書いてみました。
今回は以上になります。
※この記事のサンプルプロジェクトは以下URLにアップされています。
サンプルプロジェクト