首页 > 其他分享 >Unity控制物体透明度的改变

Unity控制物体透明度的改变

时间:2024-10-31 14:19:28浏览次数:5  
标签:UnityEngine DisableKeyword int 物体 material 透明度 SetInt Rendering 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就可以。
请添加图片描述

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

标签:UnityEngine,DisableKeyword,int,物体,material,透明度,SetInt,Rendering,Unity
From: https://blog.csdn.net/JingDuiTell/article/details/143395550

相关文章

  • 自动驾驶热成像物体检测- YOLOv9 - YOLOv8 - YOLOv5 - YOLOv7
    标签-物体检测filadataset-模型在这里插入图片描述类别(4)-自行车-汽车-狗-人在这里插入图片描述度量指标-平均精度均值(mAP):88.8%-准确率(Precision):92.0%-召回率(Recall):78.9%尝试此模型-上传一张图片或者从您的设备中选择在这里插......
  • 【Unity】UGUI模拟NGUI的UISprite-->LImage
    UGUI本没有像NGUI方便使用图集的组件,之前也写过继承Image,加入SpriteAtlas作图集,切换图片显示的组件,现在弄一个3.0版本的这个组件的诞生源于上一篇:【Unity】Addressables下的图集(SpriteAtlas)内存优化==========================================================================......
  • 物体检测、图像分割技术概述
        物体检测、图像分割是CV领域的两大任务,尤其是物体检测,其在各个领域和AI比赛中,更是占有举足轻重的位置。1、概述图1描述了起源于图像分类的主要计算机视觉类任务。图1发源于图像分类的计算机视觉任务     为什么如此划分?因为在更早的时候,AI圈还停留......
  • Unity项目Native Crash问题修复原理
    背景相信大家公司有crash的收集途径的工具,肯定会看到大量的一种错误类型SIGSEVG(SEGV_MAPERR),这个crash其实并不属于恶性crash,对游戏体验不会造成严重的影响;另外,这个crash也只会在某些特定机型和系统上才会出现,非所有设备都会出现,其它细节也暂不明确,所以我们大部分情况是不......
  • Unity的SkinnedMeshRenderer性能优化
    Unity支持两种主要的Skinning技术在Unity中,Skinning主要指的是角色的蒙皮过程,这是3D动画中的一个关键步骤,用于将3D模型的网格(皮肤)附着到骨骼上,使得模型可以根据骨骼的动作进行逼真的变形。Unity支持两种主要的Skinning技术:CPUSkinning和GPUSkinning。1.CPUSkinning......
  • 【Unity】Addressables下的图集(SpriteAtlas)内存优化
    前言:资源管理系统:AddressablesUI:模拟NGUI图集Sprite,在UGUI下继承Image增加UIImage组件,实现将SpriteAtlas组件拖拽到属性面板上,切换选择里面的小图问题:在检查项目内存占用过高问题时,发现直接拖拽上去的资源不受Addressables系统的自动引用管理,导致部分资源虽然没有引用,但是未被释放......
  • 掌控物体运动艺术:图扑 Easing 函数实践应用
    现如今,前端开发除了构建功能性的网站和应用程序外,还需要创建具有吸引力且尤为流畅交互的用户界面,其中动画技术在其中发挥着至关重要的作用。在数字孪生领域,动画的应用显得尤为重要。数字孪生技术通过精确模拟现实世界中的对象、过程和系统,对动画的需求远远超过传统前端开发。在......
  • CommunityToolkit.Mvvm中的Ioc
    什么是Ioc在软件工程中,控制反转(IoC)是一种设计原则,其中计算机程序的自定义编写部分从外部源(例如框架)接收控制流。术语“反转”是历史性的:与过程式编程相比,具有这种设计的软件架构“反转”了控制。在过程式编程中,程序的自定义代码调用可重用库来处理通用任务,但在控制反转的情况下,是......
  • 【Unity休闲风格UI资源】GUI - Casual Fantasy
    GUI-CasualFantasy是Unity的一款用户界面(GUI)插件,专为休闲幻想类游戏设计,提供了一套完整的UI资源和工具。该插件能帮助开发者快速搭建符合幻想风格的用户界面,适合各种类型的游戏,特别是带有轻松、卡通风格的RPG、冒险、策略等游戏项目。以下是它的主要功能和特点:1......
  • YOLO11改进 | 卷积模块 | 无卷积步长用于低分辨率图像和小物体的新 CNN 模块SPD-Conv
    秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转......