主要是利用camera顯示的層不同 來實作.
如圖 就是顯示的時候隻顯示ui層和3DBody 層,
在layer中點開可以添加新的層,如圖在layer11添加hide隐藏層這個數字11就是 我們在腳本中控制的模型層級。
//隐藏按鈕對應的點選操作
public void OnHideClick()
{
if (obj.layer == 11)
{ //若之前是隐藏的則 進行顯示
obj.layer = 9;
obj.SetActive(true);
HideList.Remove(obj);
HideButtonText.text = "隐藏所選";
}
else
{
//若之前是顯示的則 進行隐藏
obj.layer = 11;
obj.SetActive(false);
HideList.Add(obj);
HideButtonText.text = "顯示所選";
}
}
//恢複按鈕對應的點選操作
public void OnResumeClick()
{
foreach (GameObject gb in HideList)
{
gb.layer = 9;
gb.SetActive(true);
}
HideList.Clear();
HideButtonText.text = "隐藏所選";
}
透明是通過改變shader來實作的。shader的mode改為transparent預設的Opaque是不支援顯示shader的alpha,自己寫一個腳本來實作更改shader的模式。
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;
}
}
用法:透明模型
obj.GetComponent<MeshRenderer>().material.SetColor("_Color", new Color(0, 0, 1, 0.4f));
SetMaterialRenderingMode(obj.GetComponent<MeshRenderer>().material, RenderingMode.Transparent);
改為不透明:
child.Key.GetComponent<MeshRenderer>().material.color = Color.blue;
SetMaterialRenderingMode(obj.GetComponent<MeshRenderer>().material, RenderingMode.Opaque);