马上注册,加入CGJOY,让你轻松玩转CGJOY。
您需要 登录 才可以下载或查看,没有帐号?立即注册
×
本帖最后由 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上。如下所示: 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。 最后,附上示例代码: - using UnityEngine;
- using System.Collections;
- public class TestMaterial : MonoBehaviour
- {
- Renderer thisRenderer;
- float delay = 3f;
- float changeColorTm;
- bool isChangeOnce;
- void Awake()
- {
- thisRenderer = GetComponent<Renderer>();
- thisRenderer.material.color = Color.red;
- changeColorTm = Time.time + delay;
- isChangeOnce = false;
- }
- void Update()
- {
- if (!isChangeOnce && Time.time >= changeColorTm)
- {
- isChangeOnce = true;
- thisRenderer.sharedMaterial.color = Color.green;
- }
- }
- }
复制代码
|