unity 对象存在多个材质球进行替换

  1. 挂载脚本到当前对象上
  2. 当前对象上子物体下,有很多子物体,并且存在有 一个子物体有多个材质情况

下面是完整脚本:

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;

public class ChangeObjMat : MonoBehaviour
{
    //透明材质(想要替换的材质)
    public Material m_TM;

    /// <summary>
    /// 保存所有的MeshRenderer
    /// </summary>
    public List<MeshRenderer> m_RendererList;
    /// <summary>
    /// 保存子物体下 每个子物体的所有材质(为了还原初始物体上的材质)
    /// </summary>
    private List<List<Material>> m_RecordRendererList = new List<List<Material>>();
    void Start()
    {
        //所有子物体的MeshRenderer
        m_RendererList = GetComponentsInChildren<MeshRenderer>().ToList();

        //保存所有子物体所有材质
        m_RecordRendererList.Clear();
        for (int i = 0; i < m_RendererList.Count; i++)
        {
            m_RecordRendererList.Add(m_RendererList[i].materials.ToList());
        }
    }
    /// <summary>
    /// 改变子物体材质
    /// </summary>
    /// <param name="Change"></param>
    public void ChangeChildrenMat(bool Change)
    {
        if (Change)
        {//替换所有的子物体材质为 m_TM
            for (int i = 0; i < m_RendererList.Count; i++)
            {
                int len = m_RendererList[i].materials.Length;

                //创建相同大小的的数据保存材质m_TM
                Material[] matArr = new Material[len];
                for (int j = 0; j < len; j++)
                {
                    matArr[j] = m_TM;
                }
                //赋值
                for (int j = 0; j < len; j++)
                {
                    m_RendererList[i].materials = matArr;//整个数组赋值,不能m_RendererList[i].materials[j] = matarr赋值,具体原因不甚了解
                }

            }
        }
        else
        {//还原所有物体材质
            for(int i = 0;i < m_RecordRendererList.Count; i++)
            {
                List<Material> materialList = m_RecordRendererList[i];

                m_RendererList[i].materials = materialList.ToArray();
            }

        }
    
    }

    //测试使用
    private bool isGo = true;
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.A))
        {
            ChangeChildrenMat(isGo);
            isGo = !isGo;
        }   
    }

    
}

更多推荐