Unity用マテリアルチェンジャーを作りました

シーンに配置したモデルの任意のマテリアルを

プリセットから選んでランダムに置換するスクリプトを作りました

https://twitter.com/BTA_kelorin_jo/status/1216580319903502336

結構苦しんだので、これは配布するか有料にするか考え中です

おそらく他の役立ちツールができたらセットで販売、頓挫したら無料配布て感じの予定です。

 

最初に、エディタ拡張でなく実行時に動作する版作ったけど

https://twitter.com/BTA_kelorin_jo/status/1216339001579196416

いじっててなんかおかしいぞってなって調べたところ、

Unityでは実行時のマテリアルって

オブジェクト(インスタンス)ごとに別々に複製されてたのですね。

 

プレハブに使われてたマテリアル数×シーンに配置されてるオブジェクト数という

べらぼうな数のマテリアルが作られた

 

それをこのスクリプトで更に差し替えると、差し替えた分だけ増える…

差し替える前にマテリアルを参照するだけ、MeshRenderer.Materialにアクセスするだけでも強制的に増えるんだとか。

(どれだけ増えるかは、上メニュー/Window/プロファイルから確認できます)

 

しかも差し替える前の元マテリアルは自動で破棄されず、メモリに残り続ける。

未使用マテリアルを破棄するのはインスタンスごとメモリから消すなら簡単だけど、未使用分だけ消すのは難しいみたい

 

オープンワールドに自動生成した建物やモブへの使用を想定して作ったので、むちゃくちゃ大量のゴミマテリアルを作ってしまいそう。

 

自動生成せざるを得ない状況でないなら、実行前に建物並べてマテリアル差し替えるほうが安全そうです。

 

ちなみに同時に、窓のマテリアルのエミッションを昼夜で変えられるスクリプトも作ってましたが、これもばっちりマテリアルが増えます。

複製されたマテリアルに対して作用してるので、

スライダーいじって窓の色が変わるのはスクリプトをアタッチした1オブジェクトだけです。

シーンにある大量のビル窓やネオン照明をすべて個別に操作しないといけない、

実行時にプロジェクトにある元のマテリアル(SharedMaterial)の方をいくらいじ

っても、すでに生成されたインスタンスには反映されませんでした。

これは使いづらい…

いや、シーン上にある窓付きオブジェクトを自動検出して一括操作するのはそう難しくないけど、増えるマテリアルの件のせいで大丈夫かこれって躊躇してます

 

マテリアルがインスタンス作ったら無条件で増えるわけではなく、Awake後に作られた同一プレハブの複製だったら増えない場合もあるので、そこまで気にすることないのかなあ

 

 

 

 




0


≪ 前の作品 作品一覧 次の作品 ≫
Twitterでシェア!



"kelorin jo BTA" is creating "Unity・MMD向けステージモデル"
UnityやMMDなどで使える箱庭モデルを作っています。それとデジタル原型師もしてます
kelorin jo BTA is creating Unity・MMD向けステージモデル

UnityやMMDなどで使える箱庭モデルを作っています。それとデジタル原型師もしてます
お支払い方法
 クレジットカード
 銀行振込
 楽天Edy決済
 デビット&プリペイドカード(Vプリカ等)
  支援はいつ開始してもOK!
  Entyで支援すると約1.5倍以上オトク!
詳細