MRが楽しい

MRやVRについて学習したことを書き残す

Unityで共通のマテリアルを持つオブジェクトのマテリアル設定を一括で変更する

本日は Unity の小ネタ枠です。
Unityで共通のマテリアルを持つオブジェクトのマテリアル設定を一括で変更する方法を記事にします。
f:id:bluebirdofoz:20210914231223j:plain

sharedMaterial

Renderer.sharedMaterial を変更すると、このマテリアルを使用するすべてのオブジェクトの外観が変更されます。
また、プロジェクトに保存されているマテリアル設定も変更されます。
docs.unity3d.com

サンプルシーン

以下の同じマテリアルを参照する3つのメッシュオブジェクトを用意しました。
f:id:bluebirdofoz:20210914231244j:plain

サンプルスクリプトの作成

以下のサンプルスクリプトを作成しました。
共通のマテリアルカラーの変更を行う 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);
    }
}

f:id:bluebirdofoz:20210914231259j:plain

作成したスクリプトを共通のマテリアルを持つどれか1つのオブジェクトに設定します。
f:id:bluebirdofoz:20210914231310j:plain

動作確認

シーンを再生して動作を確認します。
f:id:bluebirdofoz:20210914231322j:plain

共通のマテリアルカラーを変更する ChangeSharedMaterialColor 関数を実行すると、共通マテリアルを参照する全てのオブジェクトのマテリアルカラーが緑色に変更されます。
また、プロジェクトに保存されているマテリアルも変更されます。
f:id:bluebirdofoz:20210914231331j:plain

次に個別にマテリアルカラーの変更を行う ChangeMaterialColor 関数を実行すると、スクリプトを設定したオブジェクトのマテリアルカラーのみが赤色に変更されました。
f:id:bluebirdofoz:20210914231341j:plain

先にChangeMaterialColorを実行した場合

先に個別にマテリアルカラーの変更を行う ChangeMaterialColor 関数を実行した場合、その時点で個別のマテリアルが作成されます。
このため、次に ChangeSharedMaterialColor 関数を実行しても他のオブジェクトのマテリアルカラーは変わらず、クリプトを設定したオブジェクトのマテリアルカラーのみが緑色に変更されます。
f:id:bluebirdofoz:20210914231351j:plain
f:id:bluebirdofoz:20210914231402j:plain