1. 程式人生 > >unity標準材質球動態改值和共用材質不同設定問題

unity標準材質球動態改值和共用材質不同設定問題

可以用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/