结论
- 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;
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));
}
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();
}
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();
}
}