unity 对象存在多个材质球进行替换,并且子物体中有很多子物体
·
unity 对象存在多个材质球进行替换
- 挂载脚本到当前对象上
- 当前对象上子物体下,有很多子物体,并且存在有 一个子物体有多个材质情况
下面是完整脚本:
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;
}
}
}
更多推荐


所有评论(0)