unity標準材質球動態改值和共用材質不同設定問題
阿新 • • 發佈:2018-12-26
可以用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/