PropertyBlock

来源:互联网 发布:node就是nodejs 编辑:程序博客网 时间:2024/06/15 11:29

可以用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材质,管理不慎易导致内存泄漏。

原创粉丝点击