material和sharedMaterial有何区别

内容会持续更新,有错误的地方欢迎指正,谢谢!

举个简单的例子,修改颜色或者直接更换shader

material.color = Color.red;
material.shader = Resources.Load(“Shader/Alpha-Diffuse”, typeof(Shader)) as Shader;

Render可以使用material或者是sharedMaterial两个属性。

Renderer render;

render.material;

render.sharedMaterial;

如果要是用material的话,每次更换属性的时候Unity就会自动new一份新的material作用于它。它 直到Application.LoadLevel() 或者Resources.UnloadUnusedAssets();的时候才会施放内存。所以material就有可能会造成内存泄漏,那么我们干脆就不要使用它。material会生成备份,假设有两个物体,就会导致这两个物体新生成的材质所占用的内存各不相同,也就是材质不同,这就意味着动态批处理就不可能了!

而在Inspector中直接修改material,此时修改的是sharedMaterial,所以,不同物体上的同一材质的属性会一起更新。

但是在代码中如果直接用render.sharedMaterial的话,你会发现在编辑器开发模式下,运行一会儿游戏本地的.material文件凡是修改了的都变化了,如果这些文件都在svn管理中,那么他们都会变成红叹号,表示文件已经被修改。这样太危险了,一不小心上传了怎么办。 为了解决这个问题,可以用一个简单的方法,每次获取material的时候根据平台而定。

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

未完待续~

猜你喜欢

转载自blog.csdn.net/billcyj/article/details/80457862