unity中的合并网格CombineMesh
介绍到CombineMesh之前,需要先了解一下mesh和sharedMesh
mesh:mesh改变的话,会新建一个mesh出来,再进行赋值,原mesh不会被改变,这使得内存增加。
SharedMesh:sharedMesh改变的话,原的mesh也会被改变,但不会使得内存增加
SharedMesh是公用的,是引用传递,而mesh是值传递,是各自拥有的实例,sharedMesh改变,则所有的使用到此mesh的都会改变,mesh消耗更多的内存,各有各的优点
CombineMeshes合并网格:
unity的场景视图中,选取一个物体作为父对象,将其他两个对象作为它的的子对象
并且新建一个脚本,添加到父对象上,脚本如下:
...
public class CombineMesh:Monobehaviour
{
void Start()
{
MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>(); // 获取自身和所有子物体的所有meshFilter
MeshRenderer[] meshRenderer = GetComponentsInChildren<MeshRenderer>();获取自身何所有子物体的所有meshRenderer
CombineInstance[] combine = new CombineInstance[meshFilters.Length];创建并合并实例
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(); //新建一个mesh赋值给它
transform.GetComponent<MeshFilter>().mesh.CombineMeshes(Combine,false);//为mesh.CombineMeshes添加一个false参数,表示并不是合并为一个网格,而是一个子网格列表
transform.GetComponent<MeshRenderer>().sharedMaterials = mats; //为合并后的GameObject指定材质
transform.gameObject.SetActive(true);
}
}
运行后,你会发现,场景视图层级下,子物体已经被隐藏了,父物体显示的时候,会连带将子物体的mesh一起显示出来,这是三个物体已经被合并成了一个物体了,因为网格被合并了