博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Unity3D游戏开发】material与sharedMaterial的区别 (三八)
阅读量:4197 次
发布时间:2019-05-26

本文共 1256 字,大约阅读时间需要 4 分钟。

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

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

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

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

Renderer render;

render.material;

render.sharedMaterial;

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

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


[c#] 
 
  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. }  


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

附带上简单的UV纹理动画

using UnityEngine;using System.Collections;public class ExampleClass : MonoBehaviour {    public float scrollSpeed = 0.5F;    public Renderer rend;    void Start() {        rend = GetComponent
(); } void Update() { float offset = Time.time * scrollSpeed; rend.material.mainTextureOffset = new Vector2(offset, 0); }}

转载地址:http://zfyli.baihongyu.com/

你可能感兴趣的文章
MySQL Memory 存储引擎
查看>>
Postman - REST测试利器
查看>>
javax.servlet获取
查看>>
Spring4搭建+REST在Spring上搭建
查看>>
Kafka的配置要点
查看>>
http 连接池
查看>>
REST实现(Spring下实现+JDK6机制实现)
查看>>
高并发分布式事务解决之道-Actor模型(附Akka与Reactor比较)
查看>>
ZooKeeper 安装、配置
查看>>
HTTP报文详解
查看>>
同步等待异步模型
查看>>
Java - zookeeper 服务注册发现
查看>>
ClassLoader类加载机制
查看>>
风控相关
查看>>
rxJava例子
查看>>
Java适合用于ETL?
查看>>
日志分析方法概述
查看>>
简单安装Mysql(linux centos)
查看>>
hive安装 (hive1.2.1+hadoop2.7+mysql)
查看>>
配置spark令其支持hive
查看>>