天天看点

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);