ドローコール削減のため、static Object の mesh を 1 つにまとめたいと考え、検索していたところ、いくつかその方法が見つかりましたが、自分のユースケースにマッチするコードはこれでした。

https://answers.unity.com/questions/10249/combining-meshes-with-submeshes.html


        GameObject gameObject = new GameObject();
        gameObject.transform.parent = targetPearentObject.transform;
        gameObject.name = "CombinedObject";
        gameObject.AddComponent<MeshFilter> ();
        gameObject.AddComponent<MeshRenderer> ();
        
        Component[] meshFilters = targetPearentObject.GetComponentsInChildren<MeshFilter>(true);
        List<CombineInstance> combine = new List<CombineInstance> ();

        for (int i = 0; i < meshFilters.Length; i++)
        {
            // skip the empty parent GO
            if (meshFilters[i].GetComponent<MeshFilter>().sharedMesh == null)
                continue;

            // combine submeshes
            for (int j = 0; j < meshFilters[i].GetComponent<MeshFilter>().sharedMesh.subMeshCount; j++)
            {
                CombineInstance ci = new CombineInstance ();

                ci.mesh = meshFilters[i].GetComponent<MeshFilter>().sharedMesh;
                ci.subMeshIndex = j;
                ci.transform = meshFilters[i].transform.localToWorldMatrix;

                combine.Add (ci);
            }                
        }

        MeshFilter filter = gameObject.GetComponent<MeshFilter> ();
        filter.sharedMesh = new Mesh ();
        filter.sharedMesh.CombineMeshes (combine.ToArray (), false);

ただし、この方法だと submesh がマージされず、必要となる material size が、合成したオブジェクトの数に比例して増加していくので、負荷が変わらない可能性があります。

ベストなのは、material ごとに Game Object を分割し、1 Game Object に対して、1 つのmaterial がセットされることでしょう。

スポンサーリンク

Twitterでフォローしよう