2019独角兽企业重金招聘Python工程师标准>>>

写在前面:

从优化角度,Mesh需要合并。

从换装的角度(这里指的是换形状、换组成部件的换装,而不是挂点型的换装),都需要网格合并、材质合并。如果是人物的换装,那么需要合并SkinnedMeshRenderer,并重刷对应的骨骼列表。

示例:

1,新建两个Cube,和一个Cylinder。分别作为坦克的底盘(Cube_chassis)、炮塔(Cube_turret)、炮管(Cylinder_gun)。如下图所示。

2,为了测试换装,我们加入三个材质球,调整一下颜色,然后分别赋给底盘(Cube_chassis)、炮塔(Cube_turret)、炮管(Cylinder_gun)。

3,把炮塔(Cube_turret)和炮管(Cylinder_gun),变成底盘(Cube_chassis)的子物体。也就是说,新的模型,是以底盘为基础的。

4,用CombineMeshes方法,合并mesh。并且用代码把【材质】也一起“合并”了。把下面的Combine_Test.cs文件,拖拽到底盘(Cube_chassis)上,之后运行。

[csharp] view plain copy

  1. using UnityEngine;
  2. using System.Collections;
  3. public class Combine_Test : MonoBehaviour {
  4. // Use this for initialization
  5. void Start ()
  6. {
  7. //---------------- 先获取材质 -------------------------
  8. //获取自身和所有子物体中所有MeshRenderer组件
  9. MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();
  10. //新建材质球数组
  11. Material[] mats = new Material[meshRenderers.Length];
  12. for (int i = 0; i < meshRenderers.Length; i++) {
  13. //生成材质球数组
  14. mats[i] = meshRenderers[i].sharedMaterial;
  15. }
  16. //---------------- 合并 Mesh -------------------------
  17. //获取自身和所有子物体中所有MeshFilter组件
  18. MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
  19. CombineInstance[] combine = new CombineInstance[meshFilters.Length];
  20. for (int i = 0; i < meshFilters.Length; i++) {
  21. combine[i].mesh = meshFilters[i].sharedMesh;
  22. //矩阵(Matrix)自身空间坐标的点转换成世界空间坐标的点
  23. combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
  24. meshFilters[i].gameObject.SetActive(false);
  25. }
  26. //为新的整体新建一个mesh
  27. transform.GetComponent<MeshFilter>().mesh = new Mesh();
  28. //合并Mesh. 第二个false参数, 表示并不合并为一个网格, 而是一个子网格列表
  29. transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine, false);
  30. transform.gameObject.SetActive(true);
  31. //为合并后的新Mesh指定材质 ------------------------------
  32. transform.GetComponent<MeshRenderer>().sharedMaterials = mats;
  33. }
  34. // Update is called once per frame
  35. void Update () {
  36. }
  37. }

5,运行效果如下。可以看到,Mesh和材质,都很好的得到了合并。坦克已经由零件,变成一个整体了!

但是,大家会发现这个模型,产生了一些变形!难道是这样不对,或者是bug么?不,其实不用担心。这是因为前面用的Cube、Cylinder 等模拟底盘炮塔,手动调节了他们的缩放比例放造成的。如果以某个组件为根物体,那么它的缩放比例,直接影响合并后生成的新物体。各个部件的缩放比都会按它走!。

也就是说,如果你想合并后不变形,就不要更改根物体的缩放比例。

参考:

关键函数,就是下面这个合并网格的函数了:

CombineMeshes(CombineInstance[]combine, boolmergeSubMeshes = true, booluseMatrices = true);

Unity官网,关于网格合并的例子:

http://docs.unity3d.com/ScriptReference/Mesh.CombineMeshes.html

程序员俱乐部-Unity3d网格合并:

http://www.cxyclub.cn/n/54078/

转载于:https://my.oschina.net/u/2874878/blog/736632

Unity网格合并_材质合并相关推荐

  1. Unity网格合并_材质合并[转]

    http://blog.csdn.net/chenggong2dm/article/details/41699029 转载于:https://www.cnblogs.com/donghua/p/500 ...

  2. 怎么将两个datatable 合并_视频音频合并大师免费版-视频音频合并大师2020版下载(附使用方法) v2020.02.08...

    视频音频合并大师免费版 是一款好用的视频合并软件,包括视频合并和音频合并,可以一次性将多个视频格式文件或音频文件合并成一个单独的视频文件,进行转换合并成你想要的视频,并且有多种自适应屏幕尺寸可以选择, ...

  3. cxgrid中纵横单元格合并_被合并单元格折磨疯的我,真后悔没早点知道这个Excel技巧!...

    在大家日常的工作中,经常会用到Excel合并单元格,然而合并单元格其实只是美化了表格,它会使我们后续的统计工作遇到很多麻烦,今天就给大家提供两个解决这个问题的思路. 01 合并单元格的基本操作方法 在 ...

  4. githua 账号合并_如何合并他人的分支 github

    Github开源代码库以及版本控制系统,可以托管各种git库,并提供web访问界面.很多朋友喜欢喜欢将个人Blog或小型项目托管到github,这样既方便又简单. 下面介绍如何将本地文件上传到gith ...

  5. [Unity] GPU动画实现(三)——材质合并

    实现合批的必要条件是只有一个material,因此将多texture对象合并成一张texture是必要的.无论是SkinnedMeshRenderer或是MeshRenderer,其合并材质的原理都是 ...

  6. unity两个项目合并 同名_表格合并,你还在复制粘贴?教你一键合并,超简单!...

    当我们有多个表格的内容需要合并到一个表格中,很多人会采取复制粘贴的方式. 表格数量少时可能影响不大,数量多了,[表格合并]功能就会大显神威. 下面教大家如何快速完成多表格合并. 温馨提示:如果图片用手 ...

  7. python调用ffmpeg合并_用ffmpeg命令处理mp4剪切与合并

    1. 剪切: ./ffmpeg -ss 00:00:06 -t 00:00:12 -i input.mp4 -vcodec copy -acodec copy output.mp4 意思是从截取从6秒 ...

  8. VBA小程序_对于选中的单元格进行取消合并_选择空值向上填充

    Sub VBA小程序_对于选中的单元格进行取消合并_选择空值向上填充()Dim a As RangeSet a = Selection '定义变量为最初选择的区域,不忘初心Selection.UnMe ...

  9. c++两个vector合并_这才是真正的 Git:分支合并

    公众号关注 "GitHubDaily"设为 "星标",每天带你逛 GitHub! 本文作者:lzaneli,腾讯 TEG 前端开发工程师 "合并前文件 ...

最新文章

  1. python tkinter 下拉框_python中tkinter入门之Menu创建顶级菜单、下拉菜单和弹出菜单。...
  2. java中多线程编程案例_Java中多线程编程实战的实现线程_Java编程_Java程序员_课课家...
  3. 使用SPANN方式将Spring&Quartz与自定义注释集成
  4. HadoopHA集群搭建
  5. CSS3边框图片、边框阴影、文本阴影
  6. 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)
  7. 如何判断两物体加速度相等_高中物理知识点总结解题技巧:关联物体问题的求解方法...
  8. 列生成(Column Generation)算法
  9. 数学分析对计算机有帮助吗,计算机辅助数学分析教学的好处
  10. java对接paypal支付应用实例 (v2)
  11. 【贪玩巴斯】带你一起攻克英语语法长难句—— 第三章——名词(短语)和名词性从句{主语、宾语、表语和同位语}全解 ——2022年2月6日-16日
  12. python实战应用讲解-【numpy科学计算】scikits-statsmodels模块(附python示例代码)
  13. Activity的生存期
  14. linux 主流浏览器,各主流浏览器(PC、移动端)userAgent属性信息介绍
  15. 小米 android 8.1手机,小米又一款手机获得安卓8.1系统更新!
  16. 淘宝店铺如何做补单计划?
  17. [转]一个IT人才的精彩故事
  18. linux之ssh命令详解
  19. matlab-数学运算
  20. 小米红米3(全网通/免解锁)解BL锁教程申请BootLoader解锁教程

热门文章

  1. 04机器学习实战之朴素贝叶斯
  2. OpenCV图像缩放resize各种插值方式的比较
  3. 安装使用Frida在Android上进行hook
  4. SDNU 1423.入学考试(01背包)
  5. java求两个集合的交集和并集,比较器
  6. 文件与文件夹课后作业
  7. Mybatis-数据插入
  8. [LeetCode] 169. Majority Element 多数元素
  9. Alpha冲刺博客集
  10. SharePoint Framework 企业向导(九)