ドローコール削減のため、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 がセットされることでしょう。
コメント