欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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博客