U3D實現簡單的網格合併
/// <summary>
/// 網格合併
/// </summary>
/// <param name="tr"></param>
void CombineMesh(Transform tr)
{
MeshFilter[] meshFilters = tr.GetComponentsInChildren<MeshFilter>();//儲存Meshfilters
MeshRenderer[] meshRenderers = tr.GetComponentsInChildren<MeshRenderer>();//儲存meshRenderers
CombineInstance[] combineInstances = new CombineInstance[meshFilters.Length];//建立要儲存網格的陣列
Material[] materials = new Material[meshRenderers.Length];//建立要儲存材質的陣列
for (int i = 0; i < meshFilters.Length; i++)
{
combineInstances[i].mesh = meshFilters[i].sharedMesh;//儲存網格
materials[i] = meshRenderers[i].sharedMaterial;//儲存材質
combineInstances[i].transform = tr.worldToLocalMatrix * meshFilters[i].transform.localToWorldMatrix;//變換矩陣的問題,要保持相對位置不變,要轉換為父節點的本地座標,
//刪除已經合併的原物體
if (meshFilters[i].gameObject.name != tr.gameObject.name)
{
Destroy(meshFilters[i].gameObject);
}
}
//構建新的網格
tr.GetComponent<MeshFilter>().mesh = new Mesh();
//傳遞儲存下來的網格
tr.GetComponent<MeshFilter>().mesh.CombineMeshes(combineInstances,false);
//傳遞已經儲存下來的材質
tr.GetComponent<MeshRenderer>().sharedMaterials = materials;
}