可以用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);
等來設置
或者
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/
==============
說明: 如果使用new材質,管理不慎易導致內存泄漏。