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

关于Unity Material的修改 - 简书 (jianshu.com)

posted @ 2023-01-19 00:03  yanghui01  阅读(48)  评论(0编辑  收藏  举报