近期热门
粉丝3
关注 0
获赞 0
关于material和sharedMaterial的问题

[U3D] 关于material和sharedMaterial的问题

[复制链接]
4106 4 0 0 7年前 举报
本帖最后由 bzyzhang 于 2016-11-18 21:27 编辑

在unity3d中,Renderer组件有两个属性:material和sharedMaterial,它们都可以用来获取Renderer的材质属性。但是它们之间却又很大的区别,下面通过示例来讲解一下。
准备工作:unity3d中新建一个空场景;创建两个cube,分别命名为Cube0、Cube1;在Project中新建一个材质球,取名M0,shader选择Unlit/Color,shader的Main Color属性设为白色,即(255,255,255,255);将M0分别赋值给Cube0、Cube1;新建一个脚本TestMaterial,将脚本拖到Cube0上。如下所示:
0.jpg
1、测试material
TestMaterial脚本的内容如下所示:
  1. 1 using UnityEngine;
  2. 2 using System.Collections;
  3. 3
  4. 4 public class TestMaterial : MonoBehaviour
  5. 5 {
  6. 6     Renderer thisRenderer;
  7. 7     // Use this for initialization
  8. 8     void Start()
  9. 9     {
  10. 10         thisRenderer = GetComponent<Renderer>();
  11. 11         thisRenderer.material.color = Color.red;
  12. 12     }
  13. 13 }
复制代码
运行,效果如下图所示:
1.jpg
注意,只有Cube0的颜色改变,在mesh renderer中,材质球的名字是M0(Instance)。
2、测试sharedMaterial
代码如下:
  1. 1 using UnityEngine;
  2. 2 using System.Collections;
  3. 3
  4. 4 public class TestMaterial : MonoBehaviour
  5. 5 {
  6. 6     Renderer thisRenderer;
  7. 7     // Use this for initialization
  8. 8     void Start()
  9. 9     {
  10. 10         thisRenderer = GetComponent<Renderer>();
  11. 11         thisRenderer.sharedMaterial.color = Color.red;
  12. 12     }
  13. 13 }
复制代码
运行,效果如下所示:
2.jpg
注意,Cube0、Cube1的颜色均发生改变,但是在mesh renderer中,材质球的名字还是M0。但是,此时在Project中的M0的Main Color属性发生了改变,如下所示:
3.jpg

总结:使用material属性的时候,每次都会new一份新的material作用与它,但不会改变本地工程中的材质material;sharedMaterial是共享材质,无论使用多少次,内存中都只会占用一份内存,但是会影响其他使用同一材质球的对象。所以,从效率上来说,sharedMaterial的效率更高。

重点来了:在实际使用的时候,我们可以在开始的时候使用material产生一个新的材质球作用于该renderer,然后之后的操作都使用sharedMaterial,这样,效率更高,而且不会影响其他使用同一个材质球的renderer。
最后,附上示例代码:
  1. using UnityEngine;
  2. using System.Collections;

  3. public class TestMaterial : MonoBehaviour
  4. {
  5.     Renderer thisRenderer;
  6.     float delay = 3f;
  7.     float changeColorTm;
  8.     bool isChangeOnce;

  9.     void Awake()
  10.     {
  11.         thisRenderer = GetComponent<Renderer>();
  12.         thisRenderer.material.color = Color.red;
  13.         changeColorTm = Time.time + delay;
  14.         isChangeOnce = false;
  15.     }

  16.     void Update()
  17.     {
  18.         if (!isChangeOnce && Time.time >= changeColorTm)
  19.         {
  20.             isChangeOnce = true;
  21.             thisRenderer.sharedMaterial.color = Color.green;
  22.         }
  23.     }
  24. }
复制代码

0
点赞
0
打赏
0
添加到收藏夹

0

点击复制链接

使用微信扫码分享
一次扣10个券
全部评论4
您需要登录后才可以回帖 登录

写代码的都好屌!

7年前
回复

使用道具 举报

拉破车 发表于 2016-11-18 21:46
我的天啊,,代码,,,,, 这个,,,,,完蛋 啊,看不懂啊,哈哈

代码逻辑太乱吗?

7年前
回复

使用道具 举报

不错,在逻辑更改shader时侯是个优化的知识点.
7年前
回复

使用道具 举报

我的天啊,,代码,,,,, 这个,,,,,完蛋 啊,看不懂啊,哈哈
7年前
回复

使用道具 举报

您当前使用的浏览器IE内核版本过低会导致网站显示错误

请使用高速内核浏览器或其他浏览器