博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity3d网格合并2
阅读量:5843 次
发布时间:2019-06-18

本文共 2903 字,大约阅读时间需要 9 分钟。

几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化。

在Unity3d中构建临时场景如下:建一C#名为"CombineMeshes",挂在Cube上。

CombineMeshes.cs内容如下:

using UnityEngine;using System.Collections;public  CombineMeshes : MonoBehaviour{    void Start()    {        MeshFilter[] meshFilters = GetComponentsInChildren
(); //获取自身和所有子物体中所有MeshFilter组件 CombineInstance[] combine = new CombineInstance[meshFilters.Length]; //新建CombineInstance数组 for (int i = 0; i < meshFilters.Length; i++) { combine[i].mesh = meshFilters[i].sharedMesh; combine[i].transform = meshFilters[i].transform.localToWorldMatrix; meshFilters[i].gameObject.SetActive(false); } transform.GetComponent
().mesh = new Mesh(); transform.GetComponent
().mesh.CombineMeshes(combine); //合并 transform.gameObject.SetActive(true); }}

 

保存后执行,结果如图:

观察原本的两个子物体已经变为隐藏状态,观察Cube的网格,已经变为如图中3个物体合并后的网格:

 

接着想一想,如果3个物体分别赋了不同的材质球,合并后会是呢?

那么,接下来,试试我们的想法。修改场景,为3个物体赋上不同的材质球,如下图:

如果还是用这段代码,将会是如下结果:

很明显,网格虽然是合并了,但是我们在合并的过程中,并没有代码是处理材质球的,因此,合并后的网格统一赋上了Cube的材质球。

那么,如果我们既要合并网格,又要保持3个部分保持原来各自的材质球,能否实现呢?答案是肯定的。

将"CombineMeshes.cs"中的代码进行如下修改:

using UnityEngine;using System.Collections;public class CombineMeshes : MonoBehaviour{    void Start()    {        MeshFilter[] meshFilters = GetComponentsInChildren
(); CombineInstance[] combine = new CombineInstance[meshFilters.Length]; MeshRenderer[] meshRenderer = GetComponentsInChildren
(); //获取自身和所有子物体中所有MeshRenderer组件 Material[] mats = new Material[meshRenderer.Length]; //新建材质球数组 for (int i = 0; i < meshFilters.Length; i++) { mats[i] = meshRenderer[i].sharedMaterial; //获取材质球列表 combine[i].mesh = meshFilters[i].sharedMesh; combine[i].transform = meshFilters[i].transform.localToWorldMatrix; meshFilters[i].gameObject.SetActive(false); } transform.GetComponent
().mesh = new Mesh(); transform.GetComponent
().mesh.CombineMeshes(combine, false);//为mesh.CombineMeshes添加一个 false 参数,表示并不是合并为一个网格,而是一个子网格列表 transform.GetComponent
().sharedMaterials = mats; //为合并后的GameObject指定材质 transform.gameObject.SetActive(true); }}

再一次运行后,如图:

达到目的。

还可以进而在脚本中做相应修改,以满足更复杂一些的需求。主要在于,了网格合并的原理,即可灵活运用。比如,在中,将

meshFilters[i].gameObject.SetActive(false);

替换为

if (meshFilters[i].gameObject.name != gameObject.name){    Destroy(meshFilters[i].gameObject);}

即可合并后更洁癖一些。有兴趣的话,可以试试将这三个模型,放在一个空物体下,看看怎样修改代码才能合并明白:)

晚些时候,我会添加上合并角色骨骼模型的,即合并含有<SkinnedMeshRenderer>这个组件的,记得初次接触官网那个换装的了好久。

附上主要语句的中文手册地址:http://game.ceeger.com/Script/Mesh/Mesh.CombineMeshes.html

转载于:https://www.cnblogs.com/muyouking/p/6649193.html

你可能感兴趣的文章
[js高手之路]设计模式系列课程-委托模式实战微博发布功能
查看>>
Android5.0免Root截屏,录屏
查看>>
Zabbix中文使用手册
查看>>
MyBatis基础:MyBatis缓存(5)
查看>>
Go常用功能总结一阶段
查看>>
互联网架构为什么要做服务化?
查看>>
centos安装gitlab
查看>>
SpringBoot的搭建
查看>>
Html 让文字显示在图片的上面
查看>>
【转&参考】MySQL利用frm和ibd文件进行数据恢复
查看>>
vs2013密钥
查看>>
iOS开发中的火星坐标系及各种坐标系转换算法
查看>>
PHP面试题:HTTP中POST、GET、PUT、DELETE方式的区别
查看>>
【Python】导入类
查看>>
sensenet的编译调试
查看>>
关于领域模型与技术架构的关系的思考
查看>>
13.生成规格文件
查看>>
流计算技术实战 - CEP
查看>>
[INet] WebSocket 数据收发的详细过程
查看>>
dojo Quick Start/dojo入门手册--xmlhttp dojo.xhrGet
查看>>