几个不一样的物体,在Unity3d中能够将网格合并在一块儿,用于优化。html
在Unity3d中构建临时场景以下:建一C#脚本名为"CombineMeshes",挂在Cube上。数组
CombineMeshes.cs内容以下:优化
using UnityEngine; using System.Collections; public class CombineMeshes : MonoBehaviour { void Start() { MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); //获取自身和全部子物体中全部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<MeshFilter>().mesh = new Mesh(); transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine); //合并 transform.gameObject.SetActive(true); } }
保存后执行,结果如图:3d
观察本来的两个子物体已经变为隐藏状态,观察Cube的网格,已经变为如图中3个物体合并后的网格:orm
接着想想,若是3个物体分别赋了不一样的材质球,合并后会是什么样呢?htm
那么,接下来,试试咱们的想法。修改场景,为3个物体赋上不一样的材质球,以下图:blog
若是仍是用这段代码,将会是以下结果:ip
很明显,网格虽然是合并了,可是咱们在合并的过程当中,并无代码是处理材质球的,所以,合并后的网格统一赋上了Cube的材质球。get
那么,若是咱们既要合并网格,又要保持3个部分保持原来各自的材质球,可否实现呢?答案是确定的。it
将"CombineMeshes.cs"中的代码进行以下修改:
using UnityEngine; using System.Collections; public class CombineMeshes : MonoBehaviour { void Start() { MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); CombineInstance[] combine = new CombineInstance[meshFilters.Length]; MeshRenderer[] meshRenderer = GetComponentsInChildren<MeshRenderer>(); //获取自身和全部子物体中全部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<MeshFilter>().mesh = new Mesh(); transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine, false);//为mesh.CombineMeshes添加一个 false 参数,表示并非合并为一个网格,而是一个子网格列表 transform.GetComponent<MeshRenderer>().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