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

Tut*_*men 3 c# unity-game-engine

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

为此,我使用“Mesh.CombineMeshes(...)”,但它将所有网格体组合成一个子网格体或为每个元素创建子网格体(即在我的情况下为 30 个子网格体)。这两个结果对我来说都是无法接受的。

Yur*_*man 5

您可以首先将 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)