PropertyBlock

可以用SetPropertyBlock方式來實現多個物體共享材質,有部分屬性略有不同的情況

這種方式被用在unity的地形上,裏面的樹就是通過這種方式實現不同樹共用材質,

卻可以有不同的顏色傾向,風力效果等等

這種方式可以在一定程度上簡化材質數量,提高效率

注意SetPropertyBlock 並不支持UI.Image,因爲不能取到render組件

用法如下

[html] view plain copy
 print?
  1. MaterialPropertyBlock propertyBlock = new MaterialPropertyBlock();  
  2. obj.GetComponent<Renderer>().GetPropertyBlock(propertyBlock);  
  3. propertyBlock.SetColor("_Color", new Color(0.5f, 0, 0, 1));  
  4. obj.GetComponent<Renderer>().SetPropertyBlock(propertyBlock);  
如果是直接用

obj.GetComponent<Renderer>().material.color = Color.red;

可以在運行狀態發現材質變成了新的實例,而不是使用以前的材質


通過腳本設置標準材質顏色

有下面這麼多種屬性可以被設置

[html] view plain copy
 print?
  1. _Color  
  2. _MainTex  
  3. _Cutoff  
  4. _Glossiness  
  5. _Metallic  
  6. _MetallicGlossMap  
  7. _BumpScale  
  8. _BumpMap  
  9. _Parallax  
  10. _ParallaxMap  
  11. _OcclusionStrength  
  12. _OcclusionMap  
  13. _EmissionColor  
  14. _EmissionMap  
  15. _DetailMask  
  16. _DetailAlbedoMap  
  17. _DetailNormalMapScale  
  18. _DetailNormalMap  
  19. _UVSec  
  20. _EmissionScaleUI  
  21. _EmissionColorUI  
  22. _Mode  
  23. _SrcBlend  
  24. _DstBlend  
  25. _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材質,管理不慎易導致內存泄漏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章