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 }