mesh和sharedMesh的区别
因为下面要用到sharedMesh,所以我们先来了解一下mesh和sharedMesh有什么区别。
mesh:mesh改变的话,会新建一个mesh出来,再进行赋值,原mesh不会被改变,这使得内存增加。
sharedMesh:sharedMesh改变的话,原mesh也会被改变,但不会使得内存增加。
sharedMesh是公用的,是引用传递。而mesh是值传递,是各自拥有的实例。sharedMesh改变,则所有的使用到此mesh的都改变。mesh消耗更多的内存,各有各的优点。
CombineMeshes合并网格
我们选取图中某个对象做为父对象,将其他两个对象作为它的子对象。
并新建一个脚本,添加到父对象上。脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//[RequireComponent(typeof(MeshRenderer), typeof(MeshFilter))]
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);
//Destroy(meshFilters[1].gameObject);
//Destroy(meshFilters[2].gameObject);
}
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 Filter和Mesh Menderer都改变了。
效果图如下:
我们可以看到,三个物体已经合并成一个物体了,因为网格合并了。