Unity控制物体透明度的改变

效果图

在这里插入图片描述
请添加图片描述

代码

注意:在控制全部的模型进行透视时,已经隐藏的子物体仍然要处理。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class FadeModel {
 
    private GameObject model;//传入的模型
    private float fadeTime = 2f;//默认淡入时间为2s
    private List<Material> materials = new List<Material>();
    private float touMingDu = 0.02f;//透明度


    public FadeModel(GameObject model,float fadeTime=1f,float touMingDu=0.02f)
    {
        this.model = model;
        this.fadeTime = fadeTime;
        this.touMingDu = touMingDu;

        materials.Clear();

        Dictionary<string, MeshRenderer> dic = FindInactiveChildrenRecursive(model.transform);
        foreach (KeyValuePair<string, MeshRenderer> item in dic)
        {
            Material[] materals = item.Value.materials;
            foreach (Material m in materals)
            {
                if (!materials.Contains(m))
                {
                    materials.Add(m);
                }
            }

        }





        //MeshRenderer[] meshRenderers = model.GetComponentsInChildren<MeshRenderer>();
        //foreach (MeshRenderer mr in meshRenderers)
        //{
        //    Material[] materals = mr.materials;
        //    foreach (Material m in materals)
        //    {
        //        if (!materials.Contains(m))
        //        {
        //            materials.Add(m);
        //        }
        //    }

        //    Debug.Log(mr.gameObject.name);
        //}





    }



    //这里新增修改,递归查询所有子物体,孙物体。
     Dictionary<string,MeshRenderer> FindInactiveChildrenRecursive(Transform parent)
    {

        Dictionary<string, MeshRenderer> mrdic = new Dictionary<string, MeshRenderer>();




        MeshRenderer mrp = parent.GetComponent<MeshRenderer>();
        if (mrp != null)
        {
            mrdic.Add(parent.name, mrp);
        }




        int childCount = parent.childCount;
        for (int i = 0; i < childCount; i++)
        {
            Transform child = parent.GetChild(i);

            MeshRenderer mr = child.GetComponent<MeshRenderer>();
            if (mr !=null)
            {
                mrdic.Add(child.name, mr);
            }


            if (child.childCount > 0)
            {
                FindInactiveChildrenRecursive(child);
            }
        }

        return mrdic;
    }



    //隐藏模型的淡隐效果
    public void HideModel()
    {
        for(int i=0;i< materials.Count;i++)
        {
            Material m = materials[i];
            Color color = m.color;
            m.color = new Color(color.r, color.g, color.b, 1);//这里一定要重新设置下Fade模式下的color a值 为1  不然 经过一次显示他会一直显示为0
            setMaterialRenderingMode(m,RenderingMode.Transparent);
            m.DOColor(new Color(color.r, color.g, color.b, touMingDu), fadeTime);
        }
    }
    //当我们隐藏完后还需要设置回来 不然他下次显示使用就是透明状态
    public void ShowModel()
    {
        for (int i = 0; i < materials.Count; i++)
        {
            Material m = materials[i];
            Color color = m.color;
            m.DOColor(new Color(color.r, color.g, color.b, 1), fadeTime).OnComplete(()=> { setMaterialRenderingMode(m, RenderingMode.Opaque); });
        }
    }



    public enum RenderingMode
    {
        Opaque,
        Cutout,
        Fade,
        Transparent
    }
    //设置材质的渲染模式
    private void setMaterialRenderingMode(Material material, RenderingMode renderingMode)
    {


        switch (renderingMode)
        {
            case RenderingMode.Opaque:
                material.SetOverrideTag("RenderType", "");
                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.SetOverrideTag("RenderType", "TransparentCutout");
                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 = (int)UnityEngine.Rendering.RenderQueue.AlphaTest;
                break;
            case RenderingMode.Fade:
                material.SetOverrideTag("RenderType", "Transparent");
                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 = (int)UnityEngine.Rendering.RenderQueue.Transparent;
                break;
            case RenderingMode.Transparent:
                material.SetOverrideTag("RenderType", "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 = (int)UnityEngine.Rendering.RenderQueue.Transparent;
                break;
        }



        //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;
        //        //material.SetFloat("" _Mode & quot;", 2);  
        //        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;
        //}
    }
 
 
}

调用

foreach (Transform item in DiZhiKuai.transform)
{
   //需要传入变化的时间,以及透明度
    FadeModel fm = new FadeModel(item.gameObject, 0.5f, toumingdu);
    if (DiZhiTouShi.isOn)
    {
        fm.ShowModel();
    }
    else
    {
        fm.HideModel();
    }
}

注意事项

经过测试,在电脑Pc端,手机apk完全没问题,但是一旦发布webgl网页端后,效果就失效了,当时也是查了好多办法,各种改属性参数就行不行,还好最后找到办法,那就是提前将模型的材质球的Rendering Mode先改成Transparent就可以。
请添加图片描述

这里是井队,天高任鸟飞,海阔凭鱼跃,点个关注不迷路,我们下期再见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

井队Tell

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值