获取Renderer材质时的leak问题
Renderer上的材质获取时会new一个副本,比如胶囊体(Capsule)的Renderer
我们不改变Material的属性,仅仅get下就会new一个副本出来
var mat = GetComponent<Renderer>().material;
ugui上的材质获取时不会new副本,而是直接返回共享材质
修改材质属性的影响
用到的脚本
using UnityEngine; using UnityEngine.UI; public class ModifyMatColor : MonoBehaviour { public Color m_c = Color.white; void Start() { ChangeRendererColor(); ChangeGraphicColor(); } private void ChangeRendererColor() { var renderer = GetComponent<Renderer>(); if (null == renderer) return; var mat = renderer.material; mat.color = m_c; } private void ChangeGraphicColor() { var g = GetComponent<Graphic>(); if (null == g) return; var mat = g.material; mat.color = m_c; } }
1) Image_Red使用该脚本将material的颜色改为红色,Image_Yellow改为黄色,最终是2个Image都变成了黄色。
所以,修改ugui上的material是影响所有使用默认材质的物体
2) Capsule_Green使用该脚本将material的颜色改为绿色,Capsule_Blue改为蓝色,最终它们分别变成了绿色和蓝色。
所以,修改Renderer上的material的属性只影响单个物体
想修改ugui的材质,可以自己新建多个材质
比如给Image_Red新建一个Image_RedMat.mat,Image_Yellow新建一个Image_YellowMat.mat,
这样设置材质颜色的时候,就不会相互影响了
参考
MaterialPropertyBlock_阿赵3D的博客-CSDN博客_materiapropertyblock, Profile中查看产生副本问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)