Unity代码修改材质信息的优化

我的项目是一个搭建式的设计平台,平台内置各种形状、模型给用户,自己组合拼接这种。其中就有部分需求是需要能够对修改形状的颜色,贴图等信息。

之前实现的方式比较简单粗暴,界面上开发了颜色选择面板、贴图面板和一些配置参数,然后通过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博客

猜你喜欢

转载自blog.csdn.net/sinat_28962939/article/details/121167153