マテリアル切り替え方法に関して

BPの組み方に関して、アドバイスを頂きたく投稿させて頂きます。

・はじめに
Actor Tagで取得したスタティックメッシュのマテリアルを変更する機能を作成しています。

Material ElementをSlectノードで切り替えています。
マテリアルを変えたい場合は、ColorNumber(Integer)の値を1にして切り替えます。
元に戻したい場合は、ColorNumber(Integer)の値を-1引いて、0にして元に戻すという仕組みにしています。

・問題
切り替える事はできるようになったのですが、Material Element の番号 0と1で切り替えているので
Material Elementが複数ある場合、このやり方では通用しないと気付きました。

ここからがどうしても、調べても、考えてもなかなか上手くできず四苦八苦しています。。

お忙しい中、お手数をお掛けいたしますがアドバイスの程宜しくお願い致します。
※1枚目が全体、以降は全体の箇所をピックアップした画像になります。


337995-

※追記
1枚拡大できる写真が不足していましたので、アップさせて頂きます。

アドバイスとのことなので遠慮なく

ノード確認しましたが、そもそも意味が通っているようには見えないんですよね…
まずBeginPlay時にMeshを配列に保存していますが、その保存したMeshを SampleXray01 のイベント内でForEachで回し、その配列のIndexにあたるMaterialSlotに MI_Xray をセットしています
これの何が意味が通らないかは以下のとおりです

  • Meshが複数あった場合、MaterialSlotがどんどんずれていく(1つなら0、3つあると0,1,2…のように)
  • 0番目にきちんとMaterialが当たるのは1つ目だけ

テスト環境がどのようになっているかわかりませんが、上記のようなことになっていませんか?

その後、NOXRAYタグを付けたものに対して色々処理をしていますが、これ必要でしょうか?
この部分に関しては、無駄に全部つかもうとしているのが問題なのでは?と思います
あるいは、 ActorHasTag ノードを用いて、Materialを当てる際に弾いてしまえばよいのでは?と思います

それと、

ColorNumber(Integer)の値を-1引いて、0にして元に戻すという仕組みにしています
とありますが、コメントでそう書いている箇所を見てもよくわかりませんでした
単に各Meshの全MaterialSlotにNone(Default)を当てているだけのように見えます

Material Element の番号 0と1で切り替えているので Material Elementが複数ある場合、このやり方では通用しないと気付きました
ノードの意味が通っているかは別として、全Slotに同じXrayマテリアルを当てる、というのでよいのなら、すでにそのまま使えそうな処理がありますよ
Sample_XrayRelease でMeshの全Slotに対してNoneを当てているところがそれです
当てるのがNoneではなく MI_Xray になるだけですね

T_Sumisaki様

お忙しい中、私のためにアドバイスありがとうございます。

T_Sumisaki様の頂いた内容を私なりに解釈させて頂き、返信させて頂きます。

■01、以下、に関してですが仰る通りです。私のミスです。ここはForEachで回し、その配列のIndexは繋げない
ように変更しました。 お手を煩わしてしまい申し訳ありません。

Meshが複数あった場合、MaterialSlotがどんどんずれていく(1つなら0、3つあると0,1,2…のように)
0番目にきちんとMaterialが当たるのは1つ目だけ
テスト環境がどのようになっているかわかりませんが、上記のようなことになっていませんか?


■02、必要なのかなと思っています。
NOXRAYは、透過しないものを指定しています。
※透過しないものとはマテリアルを変更しないものになります。
これを付けた理由は、変更しやすいと思いそうしました。良いやり方ではないのかもしれません。。

その後、NOXRAYタグを付けたものに対して色々処理をしていますが、これ必要でしょうか?
この部分に関しては、無駄に全部つかもうとしているのが問題なのでは?と思います
あるいは、 ActorHasTag
ノードを用いて、Materialを当てる際に弾いてしまえばよいのでは?と思います


■03、ありがとうございます。そうですね。
同じマテリアルを当てるまでならなんとかできるかと思います。
また初期化、元のマテリアルに戻したいのかも考えて、ここ数日間時間を作って触っているのですが、、
上手く行かず困っています。。。

ノードの意味が通っているかは別として、全Slotに同じXrayマテリアルを当てる、というのでよいのなら、すでにそのまま使えそうな処理がありますよ
Sample_XrayRelease
でMeshの全Slotに対してNoneを当てているところがそれです
当てるのがNoneではなく MI_Xray になるだけですね


上記、頂いたアドバイスを参考に自分でも考えてみたいと思いますが
アドバイスを頂きながら恐縮ですが、
T_Sumisaki様にデータ(サンプルを準備しました)を見て頂けると大変うれしく思います。
宜しくお願い致します。

・サンプルデータ

僕が手を付けるのであれば、添付画像のように変更しますね
最小限なので、他に条件がある場合はもう少し手を入れる必要があるでしょう

ちなみにSetMaterialでNoneを設定(何も設定しない状態)すると、StaticMeshAssetにもともと設定されているMaterialに切り替わります
書き換えられるのはStaticMeshComponentが保持しているMaterialである、ということですね

T_Sumisaki様

確認して頂き、ありがとうございます。

そうなんですね。
以下に、関して初めて知りました。。

ちなみにSetMaterialでNoneを設定(何も設定しない状態)すると、StaticMeshAssetにもともと設定されているMaterialに切り替わります
書き換えられるのはStaticMeshComponentが保持しているMaterialである、ということですね

大変親切にして頂きありがとうございます。
上記のアドバイスを元に試してみます。

少しお時間を頂き解決次第、ご報告させて頂き。
完了とさせて頂きます。

T_Sumisaki様
お忙しい中、親切にして頂きありがとうございました。

ご報告遅くなりすみません。
無事上記、解決致しました。

大変親切に教えていただきありがとうございました。