zoukankan      html  css  js  c++  java
  • 关于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 }
    复制代码
    随意耕种,只为自己!
  • 相关阅读:
    django 日志窜打问题
    获取f5 应用并发数情况返回JSON
    埋在 MySQL 数据库应用中的17个关键问题!
    python 模拟发送JSON数据
    python 模拟 curx -u
    分区表和全局索引
    Oracle 普通表转分区表
    阿里云吕漫漪:深度解析国内首个云原生数据库POLARDB的“王者荣耀”
    哪些顾虑会影响企业采用云桌面?
    哪些顾虑会影响企业采用云桌面?
  • 原文地址:https://www.cnblogs.com/huilixieqi/p/6473568.html
Copyright © 2011-2022 走看看