如果你需要修改模型材质的颜色,或者是修改材质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的时候根据平台而定。
1 2 3 4 5 6 7 8 9 10 |
public static Material GetMaterial(Renderer render) { #if UNITY_EDITOR return render.material; #else return render.sharedMaterial; #endif } |
这样就不用担心本地文件变化了。
- 本文固定链接: https://www.xuanyusong.com/archives/2530
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
巧妙用法
谢谢。。
路过,赞一个
这后面的材质获取函数,在Editor模式下,材质还是会泄漏啊,怎么办?
用sharedMaterial的另一个问题是,如果我有两个人物用的同一个贴图,现在要对其中一个变化,会同时改到另一个人物。有没有不泄露也不会改动到其他相同贴图的办法呢?
sharedMaterial 是共享的。 两个人用同一个材质的话, 那么变了一个 另外一个也会变。。
如果使用Destory(renderer.gameObject),那么 render.material会被自动释放吗?
当然不会。。。
将一个材质赋予一个plane对象,用代码改变这个材质的图片(加个水印什么的,文件名不变),plane对象的贴图没有改变。除非鼠标点击别的地方,再次进入unity中,plane的贴图才会改变。请问楼主遇到过这样的问题不?
已经解决!!!
请问怎么解决的,我也遇到了这样的问题
顺便问下楼主,一个关于Unity3D在Android中打开WebView的问题,请问楼主你在创建那个android工程时是建的静态工程还是动态工程呢,我两个都试了很多遍,但导在Unity中就是打不开网页。。求高手指教。我仔细核对了XML中的配置,感觉都没错,不知哪里出问题了。
恩,好东西,感谢楼主分享,赞!
自己沙发。。。