【Unity3D遊戲開發】material與sharedMaterial的區別 (三八)

如果你需要修改模型材質的顏色,或者是修改材質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#] view plain copy
  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<Renderer>();
    }
    void Update() {
        float offset = Time.time * scrollSpeed;
        rend.material.mainTextureOffset = new Vector2(offset, 0);
    }
}


發佈了106 篇原創文章 · 獲贊 24 · 訪問量 132萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章