我们用一个柜门的模型做例子,这个模型一共有8个材质,正常思路是通过获取模型的Meshenderer组件下的Materials中的材质,然后将这些材质替换成图片中cube的红色材质

using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System;public class Test : MonoBehaviour
{public Transform obj;public Material tmMat; //透明材质void Start(){//获取全部材质for (int i = 0; i < obj.GetComponent<MeshRenderer>().materials.Length; i++){obj.GetComponent<MeshRenderer>().materials[i] = tmMat; //一个一个替换成透明材质}}
}

运行后发现效果并没有改变:

为什么呢?因为材质替换是通过传递一个材质数组进行计算的,所以一个一个替换无法完成效果

Note that like all arrays returned by Unity, this returns a copy of materials array. If you want to change some materials in it, get the value, change an entry and set materials back.

知道原因了,我们在来修改一下代码

using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System;public class Test : MonoBehaviour
{public Transform obj;public Material tmMat; //透明材质Material[] newTmMatArray;//透明材质数组void Start(){newTmMatArray = new Material[obj.GetComponent<MeshRenderer>().materials.Length];//数组初始化长度//获取全部材质for (int i = 0; i < newTmMatArray.Length; i++){newTmMatArray[i] = tmMat;}obj.GetComponent<MeshRenderer>().materials = newTmMatArray;//将透明数组赋给模型材质}
}

效果:哈哈 成功。

接下来优化一下,一个机柜由 前后柜门和柜体组成,按下J键让模型透明,按下K键让模型复原,

思路:

1.创建一个 TMObj类,该类用来存储单个模型 和 这个模型的原材质数组,并且在新建类的时候通过构造给两个字段赋值

//透明模型 数据
public class TMObj
{public Transform obj;//模型public Material[] objMatArray;//模型原材质(用于还原透明)public TMObj(Transform _obj){obj = _obj;objMatArray = new Material[obj.GetComponent<MeshRenderer>().materials.Length];for (int i = 0; i < obj.GetComponent<MeshRenderer>().materials.Length; i++){objMatArray[i] = obj.GetComponent<MeshRenderer>().materials[i];}}
}

2.添加List<TransForm> objList 和List<TMObj> tmObjList字段.objList存储机柜的 前后柜门和柜体,开始时遍历这个list字段列表,将TMObj这个类充当数据用,添加到tmObjList中

using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System;public class Test : MonoBehaviour
{public Material tmMat; //透明材质public List<Transform> objList;public List<TMObj> tmObjList;Material[] newTmMatArray;//透明材质数组void Start(){tmObjList = new List<TMObj>();for (int i = 0; i < objList.Count; i++){TMObj tmObj = new TMObj(objList[i]);tmObjList.Add(tmObj);}}
}

3.在Update中设置按下J键透明,K键还原

using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using System;public class Test : MonoBehaviour
{public Material tmMat; //透明材质public List<Transform> objList;public List<TMObj> tmObjList;Material[] newTmMatArray;//透明材质数组void Start(){tmObjList = new List<TMObj>();for (int i = 0; i < objList.Count; i++){TMObj tmObj = new TMObj(objList[i]);tmObjList.Add(tmObj);}}void Update(){if (Input.GetKeyDown(KeyCode.J)){Debug.Log("透明");for (int i = 0; i < tmObjList.Count; i++){newTmMatArray = new Material[tmObjList[i].obj.GetComponent<MeshRenderer>().materials.Length];for (int j = 0; j < tmObjList[i].obj.GetComponent<MeshRenderer>().materials.Length; j++){newTmMatArray[j] = tmMat;}tmObjList[i].obj.GetComponent<MeshRenderer>().materials = newTmMatArray;}}if (Input.GetKeyDown(KeyCode.K)){Debug.Log("不透明");for (int i = 0; i < tmObjList.Count; i++){tmObjList[i].obj.GetComponent<MeshRenderer>().materials = tmObjList[i].objMatArray;}}}
}

效果:

效果完成。

unity替换模型材质相关推荐

  1. unity3d 批量替换模型材质的脚本 一键替换模型及子物体材质

    没什么好说的,特殊需求特殊实现.批量替换模型及其所属子物体所有材质的脚本. 实现原理,, 这玩意有啥原理,循环遍历目标物体下的所有子物体,每次遍历都执行替换预先指定的材质. 让我想起前些天面试,面试官 ...

  2. Unity之对模型材质球进行处理

    需求:点击模型,使其半透明/透明/带边框/变色等. 分析:条件成立的时候对模型的材质球做相应处理. 重点是shader参数的修改及某些时候自行编写(寻找)shader~ 一.得到材质球 1.必须得到所 ...

  3. Unity给模型添加逼真效果材质

    一.给模型添加多维材质 1.使用maya导入模型. 2.打开Hypershade窗口 3.新建材质 4.选中材质,右键选择重命名,输入材质名. 5.在模型中选中面. 6.选中材质,点击[为当前选择指定 ...

  4. Unity实现动态修改模型材质球

    一.定义需要替换的材质球(且加载该材质球) private Material _HighLightMat; //实现闪烁高亮效果材质球 _HighLightMat = Resources.Load(& ...

  5. Unity导入模型和材质丢失问题处理(大批量操作)

    在unity资源商店买的模型包,导入unity后,全部材质丢失,稀里哗啦乱成一片 在网上搜了下材质丢失的办法,结果都是一个一个手动操作 窝草,资源包里接近两万个资产,手动不是要撸的灰飞烟灭 遂自制自动 ...

  6. 3DMAX模型导出到Unity之中如何确保材质不丢失

    3DMAX模型导出到Unity之中如何确保材质不丢失 解决方法 3dsMax中模型和贴图采用统一命名,贴图文件拷贝到Unity项目中,然后再导入fbx,就会为自动创建的材质找到对应贴图了.

  7. Unity 3D模型展示之模型透明效果

    效果展示 1.透明效果实现思路 简单点就是将模型的材质替换成透明材质.需要注意:1.指定范围内的模型进行透明化.2.一个模型会有多个材质,都需要进行透明化.3.还能将模型的材质恢复最初的效果.4.选中 ...

  8. Unity 3D模型展示之webGL平台展现

    在之前的项目基础上我们已经打包后在PC端进行展示了.这篇文章主要介绍在切换到webGL上时效果展示不出来需要进行调整,特此记录一下. 1.平台切换 选择WebGL平台切换,没有的可以进行安装,安装之后 ...

  9. unity模型导入android背景透明,Unity导入模型一面有贴图另一面透明的解决方案

    出现这种情况是因为模型用了双面材质,而Unity不支持双面材质.故导入模型到Unity中,会出现一面有贴图,另一面透明的情况. 解决方法: 1.自定义一个双面材质Shader,代码如下: Shader ...

最新文章

  1. python字典用法(创建、添加、删除(del()、clear()、pop()、popitem())、修改、查找(get()、keys()、values()、items())、更新update、遍历)
  2. SQLServer · 最佳实践 · RDS for SQL Server 2012 权限限制的提升与改善
  3. spring 的MAVEN配置
  4. 这也太狠了吧!500套Java实用代码,不论工作学习都能用到!
  5. c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)
  6. SAP Spartacus table cell如何通过cxOutlet在运行时动态注入组件
  7. 贪心算法之活动选择问题
  8. 美团回应整改;贾跃亭卷土重来;乐视再度换帅| CSDN极客头条
  9. redisdemo php,一个简单的用redis做秒杀支撑的demo (PHP版)
  10. java中输入输出总结
  11. Canonical通过Flutter启用Linux桌面应用程序支持
  12. 单周期CPU实验之学习之旅
  13. java ligerui_[Java教程]jQuery LigerUI 使用教程入门篇_星空网
  14. 华容道 java_华容道 ( java)
  15. IME输入法编程 第一章
  16. 系统安装,UltraISO制作U盘系统安装盘
  17. android 强制打开gps定位_Android判断GPS是否开启和强制帮用户打开GPS
  18. 豆瓣电台WP7客户端 开发记录7
  19. Python入门到实践(上)(牛客网题库)day2
  20. 只因小黑子的HTML入土过程第五章

热门文章

  1. Eclipse启动失败,提示查看.metadata文件夹下的.log文件
  2. ping 命令的实现
  3. 2023年品牌惊蛰节气海报赏析
  4. 不知道如何选用笔记本电脑的快来看看
  5. VCS2018 linux 安装
  6. Actor模型与传统模型
  7. ch01: 初识数据库
  8. Roman to Integer/Integer to Roman
  9. “PaaS+云管”双剑合璧,BoCloud博云的进阶之路
  10. php解决时间2038问题,PHP实例:关于PHP转换超过2038年日期出错的问题解决