Unity3D如何用C#脚本修改GameObject的第二个材质颜色?
修改GameObject第二个材质的颜色
你遇到的问题根源很明确:MeshRenderer.material是访问第一个材质的快捷属性,当物体挂载了多个材质时,得通过材质数组来定位到第二个材质进行修改。下面给你两种常用的实现方案,根据你的需求来选:
1. 修改当前物体独有的材质实例(不影响其他物体)
这种方式会为当前物体创建材质的实例副本,修改后只有这个物体的材质会变化,适合需要单独调整某一物体材质的场景:
// 获取目标物体的MeshRenderer组件 MeshRenderer targetRenderer = rayHit.collider.gameObject.GetComponent<MeshRenderer>(); // 获取当前物体的材质实例数组(注意:materials返回的是实例副本) Material[] materialInstances = targetRenderer.materials; // 修改第二个材质的颜色(数组索引从0开始,第二个材质对应索引1) materialInstances[1].color = Color.black; // 将修改后的数组重新赋值给Renderer,让修改生效 targetRenderer.materials = materialInstances;
2. 修改原始材质资源(影响所有使用该材质的物体)
如果你希望所有用到这个第二个材质的物体都同步变色,可以使用sharedMaterials数组——它直接指向原始材质资源,修改后所有关联物体都会受影响:
MeshRenderer targetRenderer = rayHit.collider.gameObject.GetComponent<MeshRenderer>(); // 直接修改共享材质数组中第二个材质的颜色 targetRenderer.sharedMaterials[1].color = Color.black;
小提醒
- 别搞混索引:数组从0开始计数,第二个材质对应的是索引
1哦。 - 频繁调用
materials会创建新的材质实例,可能带来性能开销,尽量避免在Update这类高频函数里重复执行。
内容的提问来源于stack exchange,提问作者tim
相关产品推荐
相关产品推荐

