在Unity3D中组合多个网格并保留材质

我有三个网格A,B和C.每个网格都有自己的材质,由单个subMesh组成。 现在,我想创建一个新的网格,其中包含例如每个(A,B和C)网格的10个实例,它将包含3个子网格,即每个类型的所有元素的一个子网格。

我为此目的使用“Mesh.CombineMeshes(…)”,但它将所有网格组合成一个subMesh或为每个元素创建subMesh(在我的例子中为30个subMeshes)。 这两个结果对我来说都是不可接受的。

您可以先将类型A的所有网格组合到网格1,将所有类型为B的网格组合为网格2,将所有类型为C的网格组合为网格3,并使用mergeSubMeshes = true

然后你只需将网格1,2和3组合成单个网格,其中mergeSubMeshes = false ,得到一个带有3个子网格的单个网格,每个子网格由单个类型的网格构建,如你所愿。

MeshFilter.sharedMesh可用于按类型对网格进行分组。

这是代码:

 Mesh CombineMeshes(MeshFilter[] meshes) { // Key: shared mesh instance ID, Value: arguments to combine meshes var helper = new Dictionary>(); // Build combine instances for each type of mesh foreach (var m in meshes) { List tmp; if (!helper.TryGetValue(m.sharedMesh.GetInstanceID(), out tmp)) { tmp = new List(); helper.Add(m.sharedMesh.GetInstanceID(), tmp); } var ci = new CombineInstance(); ci.mesh = m.sharedMesh; ci.transform = m.transform.localToWorldMatrix; tmp.Add(ci); } // Combine meshes and build combine instance for combined meshes var list = new List(); foreach (var e in helper) { var m = new Mesh(); m.CombineMeshes(e.Value.ToArray()); var ci = new CombineInstance(); ci.mesh = m; list.Add(ci); } // And now combine everything var result = new Mesh(); result.CombineMeshes(list.ToArray(), false, false); // It is a good idea to clean unused meshes now foreach (var m in list) { Destroy(m.mesh); } return result; }