Chapter 33

◽ スタティックメッシュアクターのマテリアルを取得1

ポコ太郎
ポコ太郎
2022.01.09に更新

次にスタティックメッシュアクターに関係するマテリアルの参照を取得してみましょう。

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

ですがその前に、試すのに最適なアセットを用意します。UE5 / UE4 に最初から用意されているメッシュやマテリアルを編集するか、複製して同じような構成で用意してください。

まずコンテンツブラウザ上にスタティックメッシュを1つ、マテリアルを3つ(その内の1つはレベル側でオーバーライドするために利用)用意します。オーバーライド用のマテリアルを親にしたマテリアルインスタンスも1つ用意します。詳しく見ていきます。

スタティックメッシュを開き、マテリアルスロットを2つにして、それぞれ別のマテリアルを設定し、スロット名も別々の名前で設定します。

オーバーライド用のマテリアルのマテリアルインスタンスはこちらのような感じです。

スタティックメッシュをレベルに配置し 📰 Details パネル内で「Element 0」のマテリアルをマテリアルインスタンスでオーバーライドします。これで準備は整いました。

マテリアルの参照を取るための関数

BP でマテリアルの参照を取得するための関数はこれらになります。

左上の「📗 Get Static Mesh Component」から得られる情報はコンポーネントが持つ情報です。つまりコンポーネントでオーバーライドしたマテリアルを知りたい場合はこちらです。

右上の「📗 Get Static Mesh」から得られる情報はスタティックメッシュのアセットの情報です。オーバーライドされる前のマテリアルの情報はこちらまで辿っていく必要があります。

配列の変数を用意

これから沢山の情報を取得してそれら全てログに表示させたいので、String 型の配列を追加します。ここでは「MaterialInfoArray」と名付けました。

BP での配列の扱い方は公式ドキュメントがとても分かりやすいです。

https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/Blueprints/UserGuide/Arrays/ArrayNodes/

配列の中身をクリア

Editor Utility Widget』でボタンを何度も押す可能性がありますが、ボタンを押す度に配列に追加されていくのでは困ります。ボタンを押したら処理の最後に配列をクリアするか、ボタンを押したらまず最初に配列をクリアするかする必要があります。

ここではボタンクリックがされたらまず最初に配列をクリアします。変数一覧から「MaterialInfoArray」をグラフ内にドロップして「Get」の方を追加し「📗 Clear」に繋ぎます。

Static Mesh Component から情報を取得する

📗 Get Materials

まずはコンポーネントが持つ全てのマテリアルを配列で取得する 📗 Get Materials 関数を利用してみます。図のように「アクター>コンポーネント>マテリアル」の順に取得します。

マテリアルが1つとは限らないため 📓 For Each Loop を挟み、マテリアルの名前を 📗 Get Display Name で取得して、事前に用意した配列に追加登録します。

配列の中身をログに表示

図のように配列の中身を 📓 For Each Loop で取り出してログに表示させるデバッグ用の構成を用意します。こちらは今回、全ての配列を追加し終わった後に実行したいので‥

そんな時にはこちらのように、最初に「📓 Sequence」を挟んで「Then 0」の処理が終わってから「Then 1」の方でログに表示するように組めば楽です。

さて、では BP を実行して実際にログに表示させてみます。

スタティックメッシュアクターコンポーネントに設定されているマテリアルと一致しますね。

📗 Get Base Material

ではそのまま親マテリアルも取得して配列に加えましょう。

ログを表示させると、このように取得したものがマテリアルインスタンスだった場合は親マテリアルも取得できました。マテリアルだった場合は自身が返ってくるようです。

📗 Get Num Materials

さて、次に進む前に「📗 Get Materials」以降のノードは一旦外しておきます。

改めてマテリアル数を調べる「📗 Get Num Materials」を使ってみます。

2つのマテリアルスロットがあることがちゃんと取得できています。

📗 Get Material Index

また先ほどの構成は外して「📗 Get Material Index」を使ってみましょう。こちらはスロット名を指定することで、そのスロットの Index が返ってきます。

ログにも「SlotB」という名前のスロットは「Index = 1(つまり2番目)」のスロットだとちゃんと表示されました。

📗 Get Material

今のノード構成はそのままに「📗 Get Material」を追加で使用して図のように構成します。

📗 Get Material はスロットの Index を指定してマテリアルを取得するため Index が分かっている前提になります。スロット名から Index を割り出す場合は上図の構成になります。

ログに表示すると Index 1 のスロットに「CubeMaterial2」が設定されていると確認できます。

📗 Get Material Slot Names

また先ほどまでのノード構成は一旦外して、最後はこちら「📗 Get Material Slot Names」を使ってみましょう。そもそも「スロット名が分からない」という場合にスロット名を配列で取得します。

ログを表示してみます。期待通りの結果ですね。

UI に表示

最後にデバッグ部分を 🧱 Text ウィジェットに表示する構成に差し替えます。

実行すると、正常にウィジェットに表示されました。

一通りの関数をご紹介したので長くなりましたが、今回はここまでになります。