天天看點

Unity中分層控制模型的顯示和隐藏透明以及恢複

主要是利用camera顯示的層不同 來實作.

Unity中分層控制模型的顯示和隐藏透明以及恢複

如圖 就是顯示的時候隻顯示ui層和3DBody 層,

Unity中分層控制模型的顯示和隐藏透明以及恢複

在layer中點開可以添加新的層,如圖在layer11添加hide隐藏層這個數字11就是 我們在腳本中控制的模型層級。

Unity中分層控制模型的顯示和隐藏透明以及恢複
//隐藏按鈕對應的點選操作
    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);