获取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中查看产生副本问题