社員技術ブログ

【UE5】Editor Utility Widget で指定したマテリアルを一括で差し替える

どすこんにちは。
今日はEditor Utility Widgetを使って指定したマテリアルを一括で別のマテリアルに差し替える機能を作りたいと思います。

処理フロー

はじめに処理の流れを考えます。今回はマテリアルを2つ指定して入れ替えを行うので以下のような手順で実装しようと思います。
1:差し替えの対象となるマテリアルを指定する
2:新しく設定するマテリアルを指定する
3:レベルに配置されたアクターからスタティックメッシュコンポーネントを取得する
4:取得したスタティックメッシュコンポーネントで(1)のマテリアルが使用されている場合、(2)のマテリアルに変更する

実装

それではEditor Utility Widgetの作成に入ります。
まずはデザイナーで必要なボタンやテキストを配置します。
そして出来上がったものがこちらです。(3分クッキング感)

上から差し替え対象のマテリアルの指定欄と新たに設定するマテリアルの指定欄です。
それぞれの欄の下側のテキストエリアには選択したマテリアル名を表示します。
一番下の実行ボタンを押すと処理が実行されます。
実行ボタンの横のチェックボックスでは、チェックを入れることでレベル上のアクターだけでなく
コンテンツブラウザにあるアセットのマテリアルも同時に変更できるようにします。

続いてグラフで処理を組んでいきます。
そして出来上がったものが(以下略)

個別に処理を見ていきます。
マテリアルの指定ですが、どちらも処理の内容は同じなので、それぞれのボタンのクリックイベントからの処理はひとつの関数(Fn Get Material)にまとめています。


関数の中では選択中のすべてのアセットを配列で取得し、格納された順番の最も若いマテリアルを指定するようにしています。
また、マテリアルだけでなくマテリアルインスタンスにも対応したいので、変数にはMaterial Interfaceを使います。
最後にどのマテリアルが選択されているかがわかるようにテキストをマテリアル名に変更します。

実行ボタンのクリックイベントからの差し替え処理の実装です。


各マテリアルが格納されているか、同じマテリアルが指定されていないかを確認したら、
「アセットも変更する」チェックボックスのフラグ設定を行います。
折り返して、レベルに配置されているアクターの参照をGetAllActorOfClassノード(Actorを指定)で取得します。
取得したActorからGetComponentsByClass(ClassにStaticMeshComponentを指定)でスタティックメッシュコンポーネントを取得。


スタティックメッシュコンポーネントのマテリアルを取得し、それが指定されたマテリアルであればSetMaterialで置き換えます。
この時「アセットも一緒に設定する」フラグがTrueであれば、スタティックメッシュアセットに対してもマテリアルの変更を行います。

実行

コンテンツブラウザからエディタユーティリティウィジェットを実行して機能を確かめます。

レベルに置いた赤マテリアル(M_1)のキューブに対して、緑マテリアル(M_1_Inst・・・M_1のマテリアルインスタンス)に変更するよう設定します。

実行するとレベルに配置したアクターのマテリアルが差し替えられました。

アセットも一緒に変更するフラグFalseの時はレベルに置いたアクターのみマテリアルが変わり、

Trueの時はコンテンツブラウザ内のアセットも同時に変化しているのが確認できます。

以上、ご清聴ありがとうごっつぁいました。

関連記事

TOP