Unity_Renderer 中(sharedMaterial 和Miaterial)

Wesley13
• 阅读 708

sharedMaterial 和Miaterial 简介:

我们在使用unity引擎的时候 ,有时候需要去修改某个物体上的material,在Unity的Renderer类里,提供了两个方法接口供我们使用。

Renderer,material 和 Renderer.sharedMaterial

如果你需要修改模型材质的颜色,或者是修改材质shader的一些属性,通常情况是用获取模型的Renderer组件,然后获取他的material属性。

举一个简单的例子,然后修改颜色或者直接更换shader

1 material.color = Color.red;
2 material.shader = Resources.Load(“Shader/Alpha-Diffuse”, typeof(Shader)) as Shader;

     Render可以使用material或者是sharedMaterial两个属性。

1 Renderer render;
3 render.material;
5 render.sharedMaterial;

     这两个属性的用法是一样的,但是从效率上来说最好用sharedMaterial ,他是共享材质,无论如何操作材质的属性(如更换颜色或更换shader),内存中智慧占用一份。但是如果要是用material的话,每次更换属性的时候unity就会自动new一份新的material 作用于它。他直到application.loadLevel()或者Resources.UnLoadUnuseAssets()的时候才会释放内存,所以material就有可能会造成内存泄漏,那么我们干脆就不要使用它。

但是在代码中直接使用render.sharedMaterial的话,你会发现在编辑器开发模式下,运行一会游戏本地的 .material文件凡是修改了的都变化了,如果这些文件都在SVN管理中心,那么他们都会变成红色感叹号了,表示文件以及被修改。那样就危险了,一不小心 上传了怎么办。为了解决这个问题,可以用一个简单方法,每次获取material的时候根据平台而定。

1  public static Material GetMaterial(Renderer render)  
2 {  
3     #if UNITY_EDITOR  
4         return render.material;  
5     #else  
6         return render.sharedMaterial;  
7     #endif  
8 }

这样 就不会担心本地文件变化了。

总结 :

    sharedMaterial 和Miaterial 这二者的区别主要在内存管理上,当然主要情况还是要因平台或编程环境而定。

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    附 带上简单的UV纹理动画

 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class ExampleClass : MonoBehaviour {
 5     public float scrollSpeed = 0.5F;
 6     public Renderer rend;
 7     void Start() {
 8         rend = GetComponent<Renderer>();
 9     }
10     void Update() {
11         float offset = Time.time * scrollSpeed;
12         rend.material.mainTextureOffset = new Vector2(offset, 0);
13     }
14 }
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这