关于material和sharedMaterial的问题

在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 }
时间: 2024-08-08 04:05:59

关于material和sharedMaterial的问题的相关文章

Material和SharedMaterial的区别

简单概括 Material:使用的时候,如果有其他物体同时在占用这一份,则会复制一份instance出来,只改变对应的这一份.会留存在内存中,不会销毁.unloadunuse会销毁. SharedMaterial:改变参数的时候,所有共用的都会改变. 修改对应的接口,在Editor下使用material,其他情况改为SharedMaterial.renderer.GetShareMaterial. public Material material { get { if (_sharedMater

【转载】Unity3D研究院之共享材质的巧妙用法(sharedMaterial效率问题)

如果你需要修改模型材质的颜色,或者是修改材质Shader的一些属性, 通常情况是用获取模型的Renderer组件,然后获取它的material属性. 举个简单的例子,修改颜色或者直接更换shader material.color = Color.red;material.shader = Resources.Load(“Shader/Alpha-Diffuse”, typeof(Shader)) as Shader; Render可以使用material或者是sharedMaterial两个属性

Unity面试题整理

Unity技术面试题 一:什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行.换句话说,开启协程就是开启一个可以与程序并行的逻辑.可以用来控制运动.序列以及对象的行为. 二:Unity3d中的碰撞器和触发器的区别?答:碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性.当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数:当Is Trigger=true时,碰撞器被物理引

Unity全面的面试题(包含答案)

这个是我刚刚整理出的Unity面试题,为了帮助大家面试,同时帮助大家更好地复习Unity知识点,如果大家发现有什么错误,(包括错别字和知识点),或者发现哪里描述的不清晰,请在下面留言,我会重新更新,希望大家共同来帮助开发者 一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,Unity的协程实在每帧结束之后去检测yield的条件是否满足. 二:Unity3d中的碰撞器和触发器的区别? 碰撞器是触发器的载体,而触发器只是碰撞器身上的一个

Unity3D面试题整合

第一部分 1. 请简述值类型与引用类型的区别答:区别:1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存单元中存放的是堆中存放的地址.2.值类型存取快,引用类型存取慢.3.值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针和引用.4.栈的内存是自动释放的,堆内存是.NET中会由GC来自动释放.5.值类型继承自System.ValueType,引用类型继承自System.Object.可参考http://www.cnblogs.com/JimmyZhang/archive/2

unity 面试题(答案)

一.什么是渲染管道?是指在显示器上为了显示出图像而经过的一系列必要操作.渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去.主要步骤有:本地坐标->视图坐标->背面裁剪->光照->裁剪->投影->视图变换->光栅化. 二.如何优化内存?有很多种方式,例如1.压缩自带类库:2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉:3.释放AssetBundle占用的资源:4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小:

像素迷踪,当Unity的Frame Debugger力不从心时

http://www.manew.com/thread-92382-1-1.html 从版本5开始,Unity包含了一个全新的可视化帧调试工具,Frame Debugger.该工具能帮你解决很多图形方面的问题,Z-fighting,GPU状态不正常,渲染队列错误.混合操作错误,过多的draw call,效率低下等等.相比游戏视图中的状态列表,它提供了更加详尽的信息,通过与渲染事件/步骤的交互和检查,你也能学习到大量GPU管线的相关知识.真地,每个开发人员都应该了解这个工具. 本期内容中,我会简要

unity, GetComponent&lt;MeshRenderer&gt;().sharedMaterial 与 GetComponent&lt;MeshRenderer&gt;().material

我多个物体用的是同一个material,当我用gameObject.GetComponent<MeshRenderer>().sharedMaterial.SetColor("_Color",newColor)改变其中一个物体的颜色时,其余物体的颜色也跟着变了. 要想其余物体颜色不跟着变,应该用gameObject.GetComponent<MeshRenderer>().material.SetColor("_Color",newColor

Unity --- sharedMaterial 、material

sharedMaterial: 无论如何更新材质的属性,内存中只会存在一份. material: 每次更新材质属性的时候,内存中都会重新new一份material作用于它,直到 Application.LoadLevel() 或者 Resources.UnloadUnusedAssets() 的时候才会施放内存. 所以material就有可能会造成内存泄漏. 原文地址:https://www.cnblogs.com/luguoshuai/p/10505633.html