c# - 在 Unity3D 中组合多个网格并保留 Material

标签 c# unity-game-engine

我有三个网格 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/

相关文章:

c# - Unity Lerp 和 Slerp 移动不流畅

c# - SelectedIndexChanged 事件未针对 1 个列表项触发

unity-game-engine - Unity3D - 在真实设备上部署时图像数量较少

c# - 按键触摸和屏幕触摸的区别

c# - 从四元数中读取特定值

c# - 如何将文件/目录上传到存储桶中的文件夹?

c# - 在 C# UWP 应用程序中的何处粘贴 API 调用

c# - 如何使用检查器在单击按钮时设置 PlayerPrefs 以切换场景?

c# - Unity 中是否有 "Singletons"(持久游戏对象)的最佳实践?

c# - MVC 表单模型为复杂对象集合返回 null