Пример #1
0
    public static void CombineChildMeshes(this GameObject gameObject)
    {
        MeshFilter[]    meshFilters = gameObject.GetComponentsInChildren <MeshFilter>();
        List <MeshList> meshLists   = new List <MeshList>();
        //List<Material> materials = new List<Material>();

        Matrix4x4 goMatrix = gameObject.transform.worldToLocalMatrix;

        for (int i = 0; i < meshFilters.Length; i++)
        {
            var mr = meshFilters[i].GetComponent <MeshRenderer>();

            MeshList ml;

            int vertexCount = meshFilters[i].sharedMesh.vertexCount;

            bool done = false;

            for (int mlindex = 0; mlindex < meshLists.Count; mlindex++)
            {
                if (meshLists[mlindex].material == mr.sharedMaterial &&
                    meshLists[mlindex].totalVertices + vertexCount < MAX_INDICES)
                {
                    meshLists[mlindex].AddInstance(meshFilters[i], goMatrix);

                    Object.Destroy(mr);
                    Object.Destroy(meshFilters[i]);

                    done = true;
                    break;
                }
            }

            if (done)
            {
                continue;
            }

            ml          = new MeshList();
            ml.material = mr.sharedMaterial;
            ml.AddInstance(meshFilters[i], goMatrix);
            meshLists.Add(ml);

            //meshFilters[i].gameObject.SetActive(false);
            Object.Destroy(mr);
            Object.Destroy(meshFilters[i]);
        }

        // combine meshes
        for (int i = 0; i < meshLists.Count; i++)
        {
            var          go = gameObject.CreateChild();
            MeshFilter   mf = go.AddComponent <MeshFilter>();
            MeshRenderer mr = go.AddComponent <MeshRenderer>();

            Mesh m = new Mesh();
            m.CombineMeshes(meshLists[i].instances.ToArray());
            mf.sharedMesh     = m;
            mr.sharedMaterial = meshLists[i].material;
        }
    }