Unity代码修改材质信息的优化
程序员文章站
2022-06-11 10:46:08
...
我的项目是一个搭建式的设计平台,平台内置各种形状、模型给用户,自己组合拼接这种。其中就有部分需求是需要能够对修改形状的颜色,贴图等信息。
之前实现的方式比较简单粗暴,界面上开发了颜色选择面板、贴图面板和一些配置参数,然后通过Renderer里的material修改color/texure等信息。
private void SetColor(Renderer _render,Color _color)
{
_render.material.color = _color;
}
private void SetTexure(Renderer _render,Texture _tex){
_render.material.SetTexture ("_MainTex", _tex);
}
private void SetTexureSize(Renderer _render,Texture _tex,Vector2 _size){
_render.material.SetTextureScale ("_MainTex", _size);
}
这么实现发现存在一个问题,即通过Renderer获取material的方式,会创建一个material实例, 当我创建的形状多了之后,DC会显著增加。但又不能使用SharedMarerial来操作,我需要保证每个形状的参数设置都是独立的。
网上找了解决方案,发现几篇文章提到的【MaterialPropertyBlock】,材质属性块的方式来修改材质信息,不会创建新的material实例,又能满足我的需求。查阅相关用法后,改进了一下我代码,果然,创建出来的形状实例的material不再是新的实例了,从profile面板查看了一下表现,动态合批正常进行,DC下降显著。
public void SetMaterial(Renderer _render,Color _color){
MaterialPropertyBlock prop = new MaterialPropertyBlock ();
_render.GetPropertyBlock (prop);
prop.SetColor ("_Color", _color);
_render.SetPropertyBlock (prop);
}
public void SetTexure(Renderer _render,Texture _tex){
MaterialPropertyBlock prop = new MaterialPropertyBlock ();
_render.GetPropertyBlock (prop);
prop.SetTexture ("_MainTex", _tex);
_render.SetPropertyBlock (prop);
}
public void SetTexureScale(Renderer _render,Vector2 _scale)
{
MaterialPropertyBlock prop = new MaterialPropertyBlock ();
_render.GetPropertyBlock (prop);
prop.SetVector ("_MainTex_ST", new Vector4 (_scale.x, _scale.y, 0, 0));
_render.SetPropertyBlock (prop);
}
参考资料:
使用MaterialPropertyBlock来替换Material属性操作 - 简书 (jianshu.com)
Unity MaterialPropertyBlock 正确用法(解决无法合批等问题)_costa100的专栏-CSDN博客