Unity中物体半透明显示——e.g.让指定的构件从所有构件中脱颖而地展示自我

本文主要是介绍Unity中物体半透明显示——e.g.让指定的构件从所有构件中脱颖而地展示自我,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、要达到的效果

用户点击【走廊】菜单的时候,其他部件穿透显示,只有走廊正常显示,并高亮闪烁。
请添加图片描述

二、思路

  • 1、读取材质信息:读取各个部件的材质信息并存储,恢复材质的时候用
  • 2、设置物体为透明:把物体原来的材质换成透明材质
  • 3、取消物体的透明:把物体的透明材质换成原来的材质

三、关键步骤的代码

  • 只列了关键的方法

1、提取物体的材质生成一个字典

    /// <summary>/// 给定一个设备(3d物体root),遍历该物体的所有子部件(子部件的root名字包含[#],命名格式如【#部件名字】),读取子部件物体的材质信息,返回一个字典:/// Dictionary<string-部件的物体名字, List<(GameObject, Material[])-物体和它的材质数组>>/// key用物体名字是用来快速提取某个子部件的材质信息,用于更换材质或者恢复材质/// /// 层级关系及命名/// root///     #部件1///        gameobject1///        gameobject2///        ...///        gameobjectn///     ...///     #部件n/// /// </summary>/// <param name="root">3d物体——部件的root</param>/// <returns> Dictionary<string-子部件名字, List<(GameObject -- 子部件的子物体, Material[] -- 物体对应的材质数组)>>  </returns>static Dictionary<string, List<(GameObject, Material[])>> GetMaterialsDict(GameObject root){//提前生成空的返回值var partsMaterialDict = new Dictionary<string, List<(GameObject, Material[])>>();//获取所有的零件var parts = root.GetComponentsInChildren<Transform>(true).Where(x => x.name.Contains('$')).ToList();Debug.Log(parts.Count);Debug.Log(parts.Select(x => x.name.Split('$')[1]).First());parts.ForEach(x => Debug.Log(x.name.Split('$')[1]));//每个零件获取它的子物体的材质信息parts.ForEach(part =>{var partName = part.name.Split('$')[1];List<(GameObject, Material[])> goMatList = new List<(GameObject, Material[])>();part.GetComponentsInChildren<Transform>().ToList().ForEach(p =>{//Debug.Log(p.GetComponent<Renderer>());if (p.GetComponent<Renderer>() != null){goMatList.Add((p.gameObject, p.GetComponent<Renderer>().materials));}});partsMaterialDict[partName] = goMatList;});partsMaterialDict.Keys.ToList().ForEach(x =>{Debug.Log($"======{x}====== {partsMaterialDict[x].Count}");});return partsMaterialDict;}

2、其它物体设置成半透明

var partsMaterialDict = GetMaterialsDict(root);  //设备零部件的的父节点
 partsMaterialDict.ToList().Where(x => x.Key != name)   //给定的名字.SelectMany(x => x.Value).ToList().ForEach(x =>{//x.Item1.GetComponent<MeshRenderer>().sharedMaterials = new Material[] { transMat }; //此处有bug,数量要做一致x.Item1.GetComponent<MeshRenderer>().sharedMaterials = x.Item1.GetComponent<MeshRenderer>().sharedMaterials.Select(x => transMat).ToArray();//生成对数量的透明材质数组}); 

3、所有物体设置为正常材质

partsMaterialDict.ToList().SelectMany(x => x.Value).ToList()   //展开成1d数组.ForEach(x => x.Item1.GetComponent<MeshRenderer>().sharedMaterials = x.Item2);

4、展示一个部件

  • 1、显示全貌
  • 2、等待1秒
  • 3、其它半透明显示,自己正常显示,且高亮
 /// <summary>/// 显示指定的构件/// 指定构件从所有构件中脱颖而出(其他的透明显示,自己正常显示),高亮显示自己。/// 1、显示全貌/// 2、其它半透明显示,自己正常显示,且高亮/// </summary>/// <param name="name">部件名字</param>/// <param name="partsMaterialDict">部件的【物体】【材质信息】字典</param>/// <param name="transMat">透明材质</param>/// <param name="partsInfos">部件信息表</param>/// <returns>UniTask</returns>public static async UniTask Show(string name, Dictionary<string, List<(GameObject, Material[])>> partsMaterialDict, Material transMat, List<PartsInfo> partsInfos){//【1】显示所有【还原材质】partsMaterialDict.ToList().SelectMany(x => x.Value).ToList().ForEach(x => x.Item1.GetComponent<MeshRenderer>().sharedMaterials = x.Item2);//【2】关闭所有的高亮partsInfos.ForEach(x => x.part3D.GetComponent<Highlighter>().tween = false);await UniTask.Delay(TimeSpan.FromSeconds(1));//【3】其它半透明partsMaterialDict.ToList().Where(x => x.Key != name).SelectMany(x => x.Value).ToList().ForEach(x =>{//x.Item1.GetComponent<MeshRenderer>().sharedMaterials = new Material[] { transMat }; //此处有bug,数量要做一致x.Item1.GetComponent<MeshRenderer>().sharedMaterials = x.Item1.GetComponent<MeshRenderer>().sharedMaterials.Select(x => transMat).ToArray();//生成对数量的透明材质数组});//【4】自己高亮显示        partsInfos.Where(x => x.name == name).First().part3D.GetComponent<Highlighter>().tween = true;}

5、其它用到的数据结构

   /// <summary>/// 构件信息/// </summary>[Serializable]public class PartsInfo{/// <summary>/// 构件名字/// </summary>[Header("构件名字")][SerializeField]public string name;/// <summary>/// 菜单button/// </summary>[Header("菜单button")][SerializeField]public Button button;/// <summary>/// 构件的3D物体/// </summary>[Header("构件的3D物体")][SerializeField]public GameObject part3D;/// <summary>/// 是否学习过/// </summary>[Header("是否学习过")][SerializeField]public bool hasStudied;}/// <summary>/// 部件信息表/// </summary>[Header("部件信息表")][SerializeField]public List<PartsInfo> partsInfos = new List<PartsInfo>();

这篇关于Unity中物体半透明显示——e.g.让指定的构件从所有构件中脱颖而地展示自我的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/653199

相关文章

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

idea中project的显示问题及解决

《idea中project的显示问题及解决》:本文主要介绍idea中project的显示问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录idea中project的显示问题清除配置重China编程新生成配置总结idea中project的显示问题新建空的pr

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o

Python如何调用指定路径的模块

《Python如何调用指定路径的模块》要在Python中调用指定路径的模块,可以使用sys.path.append,importlib.util.spec_from_file_location和exe... 目录一、sys.path.append() 方法1. 方法简介2. 使用示例3. 注意事项二、imp

Pandas利用主表更新子表指定列小技巧

《Pandas利用主表更新子表指定列小技巧》本文主要介绍了Pandas利用主表更新子表指定列小技巧,通过创建主表和子表的DataFrame对象,并使用映射字典进行数据关联和更新,实现了从主表到子表的同... 目录一、前言二、基本案例1. 创建主表数据2. 创建映射字典3. 创建子表数据4. 更新子表的 zb

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解