Chapter 35

◽ マテリアルから使用テクスチャを取得

ポコ太郎
ポコ太郎
2022.01.16に更新

前回・前々回とスタティックメッシュアクターからマテリアルの取得を行いました。今度はそのマテリアルから使用しているテクスチャを取得しましょう。

マテリアルが使用しているテクスチャとは

一言で「使用しているテクスチャ」を調べるにも、下記のように対象のマテリアルが多岐に渡ります。アクターのコンポーネントでマテリアルをオーバーライドしている可能性もあります。

  • アクターのスタティックメッシュコンポーネント
    • スロットに設定されたマテリアルインスタンス
    • スロットに設定されたマテリアル
    • スロットに設定されたマテリアルインスタンスの親マテリアル
  • コンテンツブラウザ上のスタティックメッシュアセット
    • スロットに設定されたマテリアルインスタンス
    • スロットに設定されたマテリアル
    • スロットに設定されたマテリアルインスタンスの親マテリアル

そしてマテリアル内部で使用されているテクスチャの場合も2パターンあります。

  • パラメータ化されているテクスチャのみ
  • パラメータ化されていないテクスチャも含む

そしてこれらのどのパターンでも使用テクスチャを取得できます。

スタティックメッシュアクターの準備

前回まで試していたアセットにさらに手を加えます。メッシュとマテリアルはそのままですが、StarterContent からテクスチャを6枚複製して分かりやすい名前にリネームしました。

スタティックメッシュ「1M_Cube_Chamfer」の中身はこちら。

CubeMaterial1」にはノーマルマップを適用しています。

メッシュをレベルに配置・選択した状態で 📰 Details パネル内で「Element 0」にオーバーライド用のマテリアルインスタンス「CubeMaterialOR_Ins」をセットします。

CubeMaterialOR_Ins」には2枚のテクスチャを指定しています。

CubeMaterialOR_Ins」の親マテリアルには3枚のテクスチャが使われていて、その内2つはテクスチャを差し替えられるようパラメータ化している状態です。

これで準備は整いました。

BP の構成

マテリアル情報の取得に使っていた『Editor Utility Widget』を続けて編集していきます。まずはデザイナーでボタンの名前をテクスチャに変えます。

ボタンクリックイベントでは、最初に配列をクリアして、選択中のアクターから情報を取得して配列に格納し、最後に配列をログに出力する流れは前回のままで大丈夫です。

📘 Get Base Material

Static Mesh Actor にキャストしてからは図のように組みます。Sequence の Then 0(上段)と Then 1(下段)の処理の違いは、上段がコンポーネントから情報を取得していて下段はスタティックメッシュアセットから情報を取得している点だけで「📗 Get Material」で最初のスロットに対して「📘 Get Base Material」で親マテリアルを取得して「📗 Get Used Textures」で使用テクスチャを取得する流れは一緒です。

コンパイル・保存してツールを起動、実行してみると4つのテクスチャ名が取得できました。

コンポーネント側の最初のスロットは別のマテリアルインスタンスでオーバーライドしているため、その親のマテリアルの中で使用しているテクスチャ3枚の名前が表示されているのと‥

元々のスタティックメッシュアセットの最初のスロットに設定しているマテリアル内のテクスチャはノーマルマップ1枚だけになるので、こちらの名前が表示された訳ですね。

📘 Get Texture Parameter Names

次に「📗 Get Used Textures」を「📘 Get Texture Parameter Names」に置き換えてみます。こちらは存在するテクスチャパラメータ名を取得します。

コンパイルして実行してみると、2つのパラメータ名が取得できています。

こちらはコンポーネント上でオーバーライドしている方のパラメータ名が取得できていますね。元々のスタティックメッシュアセットに設定しているマテリアルにはパラメータがありません。

Cast to MaterialInstanceConstant

次は「📗 Get Material」から「Cast To MaterialInstanceConstant」でマテリアルインスタンスにキャストして、そこからテクスチャパラメータを取得します。

コンパイルして実行した結果は同じです。スロットにマテリアルインスタンスが指定されている場合、マテリアルインスタンスが使用しているパラメータ名は親マテリアルのパラメータ名は同じだからです。

📗 Get Material Instance Texture Parameter Value

パラメータ名が分かっているかまたは取得して利用することで「📗 Get Material Instance Texture Parameter Value」そのパラメータで指定しているテクスチャを取得できます。

コンパイルして実行した結果、2つのテクスチャ名が取得できました。

コンポーネント上でオーバーライドしているマテリアルインスタンスの使用テクスチャです。

以上で、コンポーネント・スタティックメッシュアセットの双方から、マテリアルとマテリアルインスタンスが使用しているテクスチャを取得することが確認できました。