码迷,mamicode.com
首页 > 其他好文 > 详细

关于material和sharedMaterial的问题

时间:2016-11-18 22:47:40      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:png   unity3d   技术分享   总结   ati   选择   blog   rtm   amp   

在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上。如下所示:

技术分享

1、测试material

TestMaterial脚本的内容如下所示:

 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class TestMaterial : MonoBehaviour
 5 {
 6     Renderer thisRenderer;
 7     // Use this for initialization
 8     void Start()
 9     {
10         thisRenderer = GetComponent<Renderer>();
11         thisRenderer.material.color = Color.red;
12     }
13 }

运行,效果如下图所示:

技术分享

注意,只有Cube0的颜色改变,在mesh renderer中,材质球的名字是M0(Instance)。

2、测试sharedMaterial

代码如下:

 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class TestMaterial : MonoBehaviour
 5 {
 6     Renderer thisRenderer;
 7     // Use this for initialization
 8     void Start()
 9     {
10         thisRenderer = GetComponent<Renderer>();
11         thisRenderer.sharedMaterial.color = Color.red;
12     }
13 }

运行,效果如下所示:

技术分享

注意,Cube0、Cube1的颜色均发生改变,但是在mesh renderer中,材质球的名字还是M0。但是,此时在Project中的M0的Main Color属性发生了改变,如下所示:

技术分享

 

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

 

重点来了:在实际使用的时候,我们可以在开始的时候使用material产生一个新的材质球作用于该renderer,然后之后的操作都使用sharedMaterial,这样,效率更高,而且不会影响其他使用同一个材质球的renderer。

最后,附上示例代码:

 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class TestMaterial : MonoBehaviour
 5 {
 6     Renderer thisRenderer;
 7     float delay = 3f;
 8     float changeColorTm;
 9     bool isChangeOnce;
10 
11     void Awake()
12     {
13         thisRenderer = GetComponent<Renderer>();
14         thisRenderer.material.color = Color.red;
15         changeColorTm = Time.time + delay;
16         isChangeOnce = false;
17     }
18 
19     void Update()
20     {
21         if (!isChangeOnce && Time.time >= changeColorTm)
22         {
23             isChangeOnce = true;
24             thisRenderer.sharedMaterial.color = Color.green;
25         }
26     }
27 }

 

关于material和sharedMaterial的问题

标签:png   unity3d   技术分享   总结   ati   选择   blog   rtm   amp   

原文地址:http://www.cnblogs.com/bzyzhang/p/6079142.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!