我有三个网格 A、B 和 C。每个网格都有自己的 Material 并由单个子网格组成。现在,我想创建一个新的网格,例如,每个网格(A、B 和 C)包含 10 个实例,并且它将由 3 个子网格组成,即每个类型的所有元素都有一个子网格。
我使用“Mesh.CombineMeshes(...)”来达到此目的,但它将所有网格体组合成一个子网格体或为每个元素创建子网格体(即在我的例子中为 30 个子网格体)。这两个结果对我来说都是无法接受的。
最佳答案
您可以首先使用 mergeSubMeshes = true
将所有类型 A 的网格合并到网格 1,将所有类型 B 的网格合并到网格 2,将所有类型 C 的网格合并到网格 3。
然后,您只需使用 mergeSubMeshes = false
将网格 1、2 和 3 组合成单个网格,从而得到具有 3 个子网格的单个网格,每个子网格均由单一类型的网格构建,如你所愿。
MeshFilter.sharedMesh 可用于按类型对网格进行分组。
这是代码:
Mesh CombineMeshes(MeshFilter[] meshes) {
// Key: shared mesh instance ID, Value: arguments to combine meshes
var helper = new Dictionary<int, List<CombineInstance>>();
// Build combine instances for each type of mesh
foreach (var m in meshes) {
List<CombineInstance> tmp;
if (!helper.TryGetValue(m.sharedMesh.GetInstanceID(), out tmp)) {
tmp = new List<CombineInstance>();
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<CombineInstance>();
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;
}
关于c# - 在 Unity3D 中组合多个网格并保留 Material ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33968485/