using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; public class ChangeObjMat : MonoBehaviour { //透明材质(想要替换的材质) public Material m_TM; /// /// 保存所有的MeshRenderer /// public List m_RendererList; /// /// 保存子物体下 每个子物体的所有材质(为了还原初始物体上的材质) /// private List> m_RecordRendererList = new List>(); void Start() { //所有子物体的MeshRenderer m_RendererList = GetComponentsInChildren().ToList(); //保存所有子物体所有材质 m_RecordRendererList.Clear(); for (int i = 0; i < m_RendererList.Count; i++) { m_RecordRendererList.Add(m_RendererList[i].materials.ToList()); } ChangeChildrenMat(isGo); } /// /// 改变子物体材质 /// /// 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 materialList = m_RecordRendererList[i]; m_RendererList[i].materials = materialList.ToArray(); } } } //测试使用 public bool isGo = true; void Update() { if (Input.GetKeyDown(KeyCode.A)) { ChangeChildrenMat(isGo); isGo = !isGo; } } }