UE4 の Editor Utility Blueprint でマテリアルインスタンスを大量作成する

# はじめに
UE4はアセットの作成やレベル内への配置をブループリントで自動化することができます

[ブループリントを使用してエディタをスクリプト化する](https://docs.unrealengine.com/ja/Engine/Editor/ScriptingAndAutomation/Blueprints/index.html)

> ブループリントが便利なのは、プロジェクトのランタイム ゲームプレイの作成だけではありません。Unreal Editor 内でプロジェクト コンテンツを操作するときにも、非常に効果的なツールです。エディタ内でブループリント グラフをオンデマンドで実行して、アセットを使用したり、レベル内にコンテンツを配置したり・・・

この機能を使って色違いのマテリアルインスタンス139個を自動で作成してみました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/83e1a75c-45d5-4c24-a36b-f590fcd02967.png)

# 環境
Unreal Engine 4.24.3
Unreal Engine 4.25.0（2020/5/6 追記）

#材料の準備
## Editor Scripting Utilities プラグインを有効にする
設定 > プラグイン から Editor Scripting Utilities を有効にしエディタを再起動します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/15905244-7d68-16d4-48a6-81cdb1dfe9fa.png)
このプラグインを有効にすることでブループリントのノードの選択肢に Editor Scripting が追加され、アセットの作成やレベル内への配置をブループリントで行うことができるようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/decc2748-48c2-88b4-c232-938d3681ef71.png)

##マテリアル、マテリアルインスタンスを作成
マテリアルを新規作成し名前を`MT_Base`とします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/932fb2c7-43bc-6c33-4a1e-c596581f4da0.png)

作成したマテリアルを開く > VectorParameter を作成し名前を`BaseColor`にして ベースカラー につなげたらマテリアルを保存します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/cb8fe6f3-ece9-cf1d-bbf7-2a1e746df5a3.png)

コンテンツブラウザで MT_Base を右クリック > マテリアルインスタンスを作成 をクリック。作成したら名前を`MI_Base`にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/967473a7-6d0d-4684-1272-84ed66b2e118.png)

自動作成するマテリアルインスタンスの保存場所として`ColorMaterials`というフォルダを作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/468b9662-91a6-2a31-cd03-7dd363754ee6.png)

## 色テーブルをCSVで作成
下記のようなCSVファイルを作成し`ColorTable.csv`という名前で保存します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/15e6fbed-3a63-d9b1-1bfd-6cfcdfa842b1.png)

## 構造体を作成してCSVファイルを読み込む
コンテンツブラウザで`STR_ColorTable`という名前で構造体を作成 > 下記のように項目を追加して保存します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/66627104-4e16-3c5c-715c-0eab620ddfbf.png)

ColorTable.csv をコンテンツブラウザにドロップするとダイアログが表示されるので、データテーブルの列の種類に `STR_ColorTable` を選択しOKをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/d8b1926a-fbac-d097-0c36-2c2983300ef8.png)

ColorTable というデータテーブルが作成されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/1736993f-3500-3d94-8441-7b0b87688976.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/99bc5467-8240-be68-2213-5957e7901676.png)

# ブループリントの作成
## エディタで呼び出せるカスタムイベントを作成する
コンテンツブラウザの新規作成で Editor Utilities > Editor Utility Blueprint を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/456f919c-e6fd-e2cd-e8bd-cbe549dcdcdd.png)

AssetActionUtility を選択し
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/dfdf41e4-c598-9d1b-f1bc-8a8f1b95a549.png)

`BP_MI_Create`という名前にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/817adfe6-96e2-d56f-029d-65647ee46612.png)

BP_MI_Create を開く > カスタムイベントを作成し`CE_MI_Create`という名前にし、`エディタで呼び出す`にチェックを入れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/acf31887-5dde-f6d3-6166-75c4bdc5dd52.png)

BP_MI_Createを一旦保存 > コンテンツブラウザ内のアイテムを右クリックすると Scripted Actions というメニューがありその中に CE MI Create ができていることを確認します。ここからイベントを呼び出すことができるようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/a9f71eef-d217-b055-7a26-ed6020dad2a3.png)
確認出来たら再度 BP_MI_Create を開きます

## マテリアルインスタンスを自動作成する
Get Data Table Row Names で ColorTable を取得し、For Each Loop と 「テーブル行を取得」 をつなげていきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/0658582a-d382-2b2f-bc1f-ae25083a5c7f.png)

外側の列 ピンからワイヤーを引き出し STR_ColorTable を分解します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/23f7cd0f-ceac-889f-5012-3fb98fac7cd2.png)

Append ノードでフォルダパス `/Game/ColorMaterials/` とColorNameを合体してマテリアルインスタンスの保存パスを作成します
R,G,Bを255で割った値を使ってMakeColorで色を作成します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/7ae2004b-7004-e4e1-baf7-60735b1eb7dd.png)

Duplicate Asset ノードを作成し Source Asset Path を `/Game/MI_Base/` として複製元に準備作業で作成したマテリアルインスタンスを指定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/5f67541f-8f62-f2ab-e3f4-b63a682fcb57.png)

Cast To MatrialInstanceConstant と Set Material Instance Vector Parameter Value をつなげます。
Parameter Nameに`BaseColor`と入力します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/b1da577c-07de-214f-5fb1-d0a8ec0a8263.png)
これでブループリントが完成です

# エディタからブループリントを実行
コンテンツブラウザのアイテムを右クリックし Scripted Actions > CE MI Create をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/5f10cce9-258e-eefd-9e46-1bdc6feb5c18.png)

ColorMaterials フォルダに139個のマテリアルインスタンスが自動作成されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/83e1a75c-45d5-4c24-a36b-f590fcd02967.png)

#まとめ
作成したブループリントの全体像
https://blueprintue.com/render/57me-i7-
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433170/fcd40b04-c23a-582e-cb58-a119f080d420.png)
スクリプティングによりエディタ内作業を自動化して大幅な効率化やミスの防止に役立ちそうです！

# 参考
Unreal Engine 4 ドキュメント 
[エディタのスクリプティングと自動化](https://docs.unrealengine.com/ja/Engine/Editor/ScriptingAndAutomation/index.html)
[ブループリントを使用してエディタをスクリプト化する](https://docs.unrealengine.com/ja/Engine/Editor/ScriptingAndAutomation/Blueprints/index.html)
[スクリプト アクション](https://docs.unrealengine.com/ja/Engine/Editor/ScriptingAndAutomation/Blueprints/ScriptedActions/index.html)