Unity往List添加材质时报Material[]转Material类型转换错误如何解决
错误原因
Renderer.materials返回的是Material[]数组类型,而List<Material>.Add()方法仅接受单个Material类型的参数,二者类型不匹配才触发了这个转换报错。- 额外注意:如果你的目标是修改材质实例,用
materials会自动生成新的材质实例,不会影响原材质资源;如果只需要读取原材质,用sharedMaterials更节省性能。
解决方案
有两种常用的修正写法:
方法1:用AddRange方法直接添加整个数组
AddRange可以直接把整个数组的元素批量添加到List中,不需要额外遍历数组:
public GameObject[] myObjs; private List<Material> myObjs_mats = new List<Material>(); void Start () { for(int i = 0; i < myObjs.Length; i++){ Renderer rend = myObjs[i].GetComponent<Renderer>(); // 空判断避免GameObject没有Renderer时报空引用错误 if(rend != null){ myObjs_mats.AddRange(rend.materials); } } }
方法2:遍历材质数组逐个Add
如果需要对每个材质做额外处理的时候可以用这个写法:
public GameObject[] myObjs; private List<Material> myObjs_mats = new List<Material>(); void Start () { for(int i = 0; i < myObjs.Length; i++){ Renderer rend = myObjs[i].GetComponent<Renderer>(); if(rend != null){ foreach(Material mat in rend.materials){ // 可在此处添加单个材质的处理逻辑 myObjs_mats.Add(mat); } } } }
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

