本日は Unity の小ネタ枠です。
Unityで共通のマテリアルを持つオブジェクトのマテリアル設定を一括で変更する方法を記事にします。
sharedMaterial
Renderer.sharedMaterial を変更すると、このマテリアルを使用するすべてのオブジェクトの外観が変更されます。
また、プロジェクトに保存されているマテリアル設定も変更されます。
docs.unity3d.com
サンプルシーン
以下の同じマテリアルを参照する3つのメッシュオブジェクトを用意しました。
サンプルスクリプトの作成
以下のサンプルスクリプトを作成しました。
共通のマテリアルカラーの変更を行う ChangeSharedMaterialColor 関数と、オブジェクト毎に個別にマテリアルカラーの変更を行う ChangeMaterialColor 関数を持ちます。
・MaterialColorChanger.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(MeshRenderer))] public class MaterialColorChanger : MonoBehaviour { /// <summary> /// 参照メッシュレンダラ /// </summary> private MeshRenderer p_MeshRenderer; private void Start() { p_MeshRenderer = this.GetComponent<MeshRenderer>(); } /// <summary> /// 共通のマテリアルカラーを変更する /// </summary> public void ChangeSharedMaterialColor() { p_MeshRenderer.sharedMaterial.SetColor("_Color", Color.green); } /// <summary> /// 個別のマテリアルカラーを変更する /// </summary> public void ChangeMaterialColor() { p_MeshRenderer.material.SetColor("_Color", Color.red); } }
作成したスクリプトを共通のマテリアルを持つどれか1つのオブジェクトに設定します。
動作確認
シーンを再生して動作を確認します。
共通のマテリアルカラーを変更する ChangeSharedMaterialColor 関数を実行すると、共通マテリアルを参照する全てのオブジェクトのマテリアルカラーが緑色に変更されます。
また、プロジェクトに保存されているマテリアルも変更されます。
次に個別にマテリアルカラーの変更を行う ChangeMaterialColor 関数を実行すると、スクリプトを設定したオブジェクトのマテリアルカラーのみが赤色に変更されました。
先にChangeMaterialColorを実行した場合
先に個別にマテリアルカラーの変更を行う ChangeMaterialColor 関数を実行した場合、その時点で個別のマテリアルが作成されます。
このため、次に ChangeSharedMaterialColor 関数を実行しても他のオブジェクトのマテリアルカラーは変わらず、クリプトを設定したオブジェクトのマテリアルカラーのみが緑色に変更されます。