Renderer.Material和Renderer.SharedMaterial的区别

结论

  • renderer.sharedMaterial意为共享材质,使用了相同材质球的 renderer中的sharedMaterial一致,更改材质属性,相同材质的实体的材质也会被更改;
  • renderer.material是自己的材质,更改材质属性,也只是更改自身的;
  • 经过测试,使用 renderer.material进行材质球属性更改,Unity 会生成一份新的material实体,造成内存增加,只有在切换场景或Resources.UnloadUnusedAssets()才会释放,有可能造成内存泄露。想象这样的情形,持续实例化meshRenderer并更改材质球属性,然后释放 meshRenderer,而新生成的材质球实例得不到释放,造成泄露;
  • 经过测试,使用 renderer.sharedMaterial 会使得编辑器下material 资源产生setDirty的后遗症,造成编辑模式下的资源更改;

测试

使用 renderer.material接口进行材质球属性更改

这里写图片描述

使用 renderer.sharedMaterial接口进行材质球属性更改

这里写图片描述

会使得Editor下material资源被 setDirty,开发时可以考虑一下方式(可以写成扩展方法)

public static Material GetMaterial(Renderer render)  {  
    #if UNITY_EDITOR  
        return render.material;  
    #else  
        return render.sharedMaterial;  
    #endif  
} 

测试代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 测试使用 renderer.material和使用renderer.sharedMaterial进行属性设置的区别
/// </summary>
public class TestDiffModifyMaterialProperty : MonoBehaviour {
    public MeshRenderer[] MR;
    void Start(){
        StartCoroutine(TestUse_Material());
    }

    Color RandomColor(){
        return new Color(Random.Range(0,1f), Random.Range(0,1f), Random.Range(0,1f));    
    }
    /// <summary>
    /// 使用renderer.material来更改属性
    /// </summary>
    /// <returns>The use material.</returns>
    IEnumerator TestUse_Material(){
        MR[0].material.color = RandomColor();
        yield return new WaitForSeconds(2f);
        MR[1].material.color = RandomColor();
        yield return new WaitForSeconds(2f);
        MR[2].material.color = RandomColor();
    }
    /// <summary>
    /// 使用renderer.sharedMaterial来更改属性
    /// </summary>
    /// <returns>The use shared material.</returns>
    IEnumerator TestUse_SharedMaterial(){
        MR[0].sharedMaterial.color = RandomColor();
        yield return new WaitForSeconds(2f);
        MR[1].sharedMaterial.color = RandomColor();
        yield return new WaitForSeconds(2f);
        MR[2].sharedMaterial.color = RandomColor();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值