【Unity3D遊戲開發】material與sharedMaterial的區別 (三八)
阿新 • • 發佈:2018-12-26
如果你需要修改模型材質的顏色,或者是修改材質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的時候根據平臺而定。
舉個簡單的例子,修改顏色或者直接更換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的時候根據平臺而定。