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

C# 组合多个网格并在Unity3D中保留材质,c#,unity3d,C#,Unity3d,我有三个网格A、B和C。每个网格都有自己的材质,由单个子网格组成。现在,我想创建一个新的网格,它将包含,例如,每个(a、B和C)网格的10个实例,它将由3个子网格组成,即每个类型的所有元素都有一个子网格 为此,我使用了“Mesh.combinemesh(…)”,但它将所有网格合并到一个子网格中,或者为每个元素创建子网格(在我的示例中为30个子网格)。这两个结果我都不能接受 首先可以将所有类型A的网格合并到网格1,将所有类型B的网格合并到网格2,将所有类型C的网格合并到网格3,并使用mergesu

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


为此,我使用了“Mesh.combinemesh(…)”,但它将所有网格合并到一个子网格中,或者为每个元素创建子网格(在我的示例中为30个子网格)。这两个结果我都不能接受

首先可以将所有类型A的网格合并到网格1,将所有类型B的网格合并到网格2,将所有类型C的网格合并到网格3,并使用
mergesubsheys=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;

}
网格组合网格(MeshFilter[]网格){
//键:共享网格实例ID,值:组合网格的参数
var helper=newdictionary();
//为每种类型的网格生成合并实例
foreach(网格中的var m){
列出tmp;
if(!helper.TryGetValue(m.sharedMesh.GetInstanceID(),out tmp)){
tmp=新列表();
Add(m.sharedMesh.GetInstanceID(),tmp);
}
var ci=新组合实例();
ci.mesh=m.sharedMesh;
ci.transform=m.transform.localToWorldMatrix;
tmp.Add(ci);
}
//组合网格并为组合网格构建组合实例
var list=新列表();
foreach(助手中的变量e){
var m=新网格();
m、 组合元素(如Value.ToArray());
var ci=新组合实例();
ci.mesh=m;
列表。添加(ci);
}
//现在把一切结合起来
var result=新网格();
result.combinemesh(list.ToArray(),false,false);
//现在清理未使用的网格是个好主意
foreach(列表中的var m){
破坏(m.mesh);
}
返回结果;
}

谢谢!糟糕的是,这是一个显而易见的解决方案:)