在Unity中,有些少數情況下我們需要用代碼來創建材質。比如說在材質非常多,而僅僅是紋理不一樣的時候。
而用代碼創建的材質是沒有對應的資源文件的,我們也就無法使用Inspector來設置它的Rendering Mode。
關於Rendering Mode,許我稍作介紹:
材質(Material)的屬性檢視面板(Inspector)里的第一項為渲染模式(RenderingMode)。
渲染模式總共有四種:
渲染模式 |
意思 |
適用對象舉例 |
說明 |
Opaque |
不透明 |
石頭 |
適用於所有的不透明的物體 |
Cutout |
鏤空 |
破布 |
透明度不是0%就是100%,不存在半透明的區域。 |
Fade |
隱現 |
物體隱去 |
與Transparent的區別為高光反射會隨着透明度而消失。 |
Transparent |
透明 |
玻璃 |
適用於像彩色玻璃一樣的半透明物體,高光反射不會隨透明而消失。 |
有時候我們需要在程序代碼(Script)中設置材質的渲染模式,這時候我們該怎么做呢?這時候可以通過添加以下代碼來實現。
public enum RenderingMode { Opaque, Cutout, Fade, Transparent, } public static void SetMaterialRenderingMode (Material material, RenderingMode renderingMode) { switch (renderingMode) { case RenderingMode.Opaque: material.SetInt ("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt ("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt ("_ZWrite", 1); material.DisableKeyword ("_ALPHATEST_ON"); material.DisableKeyword ("_ALPHABLEND_ON"); material.DisableKeyword ("_ALPHAPREMULTIPLY_ON"); material.renderQueue = -1; break; case RenderingMode.Cutout: material.SetInt ("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt ("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero); material.SetInt ("_ZWrite", 1); material.EnableKeyword ("_ALPHATEST_ON"); material.DisableKeyword ("_ALPHABLEND_ON"); material.DisableKeyword ("_ALPHAPREMULTIPLY_ON"); material.renderQueue = 2450; break; case RenderingMode.Fade: material.SetInt ("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); material.SetInt ("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); material.SetInt ("_ZWrite", 0); material.DisableKeyword ("_ALPHATEST_ON"); material.EnableKeyword ("_ALPHABLEND_ON"); material.DisableKeyword ("_ALPHAPREMULTIPLY_ON"); material.renderQueue = 3000; break; case RenderingMode.Transparent: material.SetInt ("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); material.SetInt ("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); material.SetInt ("_ZWrite", 0); material.DisableKeyword ("_ALPHATEST_ON"); material.DisableKeyword ("_ALPHABLEND_ON"); material.EnableKeyword ("_ALPHAPREMULTIPLY_ON"); material.renderQueue = 3000; break; } }
使用方法:
void Start () { // 設置材質的顏色為半透明的顏色才能看到效果,如果材質有貼圖,那么貼圖也必須是半透明的 GetComponent<MeshRenderer> ().material.color = new Color (1, 0, 0, 0.5f); SetMaterialRenderingMode (GetComponent<MeshRenderer> ().material, RenderingMode.Transparent); }
注意:測試前先在目標物體后放置一個其他物體,如果未添加代碼前不可以看到后面物體,而添加之后可以了,那么就表示此代碼設置RenderingMode成功。
成功和不成功的結果是這樣的:
【End】