Tut*_*men 3 c# unity-game-engine
我有三个网格 A、B 和 C。每个网格都有自己的材质并由单个子网格组成。现在,我想创建一个新的网格,例如,每个网格(A、B 和 C)包含 10 个实例,并且它将由 3 个子网格组成,即每个类型的所有元素都有一个子网格。
为此,我使用“Mesh.CombineMeshes(...)”,但它将所有网格体组合成一个子网格体或为每个元素创建子网格体(即在我的情况下为 30 个子网格体)。这两个结果对我来说都是无法接受的。
您可以首先将 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<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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7300 次 |
| 最近记录: |