可以用SetPropertyBlock方式来实现多个物体共享材质,有部分属性略有不同的情况
这种方式被用在unity的地形上,里面的树就是通过这种方式实现不同树共用材质,
却可以有不同的颜色倾向,风力效果等等
这种方式可以在一定程度上简化材质数量,提高效率
注意SetPropertyBlock 并不支持UI.Image,因为不能取到render组件
用法如下
MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();
obj.GetComponent<Renderer>().GetPropertyBlock(propertyBlock);
propertyBlock.SetColor("_Color", new Color(0.5f, 0, 0, 1));
obj.GetComponent<Renderer>().SetPropertyBlock(propertyBlock);
如果是直接用
obj.GetComponent<Renderer>().material.color = Color.red;
可以在运行状态发现材质变成了新的实例,而不是使用以前的材质
通过脚本设置标准材质颜色
有下面这么多种属性可以被设置
_Color
_MainTex
_Cutoff
_Glossiness
_Metallic
_MetallicGlossMap
_BumpScale
_BumpMap
_Parallax
_ParallaxMap
_OcclusionStrength
_OcclusionMap
_EmissionColor
_EmissionMap
_DetailMask
_DetailAlbedoMap
_DetailNormalMapScale
_DetailNormalMap
_UVSec
_EmissionScaleUI
_EmissionColorUI
_Mode
_SrcBlend
_DstBlend
_ZWrite
可以通过
obj.GetComponent<Renderer>().material.SetColor("_Color",new Color(0.5f,0,0,1));
obj.GetComponent<Renderer>().material.SetTexture("_MainTex", pic);
_Color
_MainTex
_Cutoff
_Glossiness
_Metallic
_MetallicGlossMap
_BumpScale
_BumpMap
_Parallax
_ParallaxMap
_OcclusionStrength
_OcclusionMap
_EmissionColor
_EmissionMap
_DetailMask
_DetailAlbedoMap
_DetailNormalMapScale
_DetailNormalMap
_UVSec
_EmissionScaleUI
_EmissionColorUI
_Mode
_SrcBlend
_DstBlend
_ZWrite
等来设置
或者
obj.GetComponent<Renderer>().material.color = Color.red;
7.30.2016概念修正,因为有人看了感到混乱,这里强调更正一下
另外不要和sharedMaterial用混,sharedMaterial并不能实现不同物体使用同一个材质而有不同颜色之类属性的问题
sharedMaterial是用在运行时候改变材质的,这比直接修改material快速
因为不需要新建材质来进行改变,直接用material实际上新建了一个材质
但是这种方式会改变project中的材质设置,最好用在发布时
有时使用不当也会引起内存泄漏
另外可以看看这里的
http://www.xuanyusong.com/archives/2530
参考地址
http://docs.unity3d.com/ScriptReference/MaterialPropertyBlock.html
http://forum.unity3d.com/threads/different-material-properties-shader-uniforms-for-objects-with-a-shared-material.367477/