메쉬를 묶는 이유는 Batch를 줄이기 위함입니다.
CombineMesh함수를 이용하지 않고 MeshBaker 에셋을 이용해서 줄이는 방법도 있지만, 이번 시간에는 CombineMesh함수를 이용한 방법에 대해 알아보고자 합니다.
사용방법
using System.Collections.Generic;
using UnityEngine;
public class MeshCombiner : MonoBehaviour
{
public GameObject Parent;
public Material Material;
public bool DeactivateParentAfterMerge = true;
public bool DestroyParentAfterMerge = false;
[ContextMenu("Merge")]
public void MergeMeshes()
{
MeshFilter[] meshFilters = Parent.GetComponentsInChildren<MeshFilter>();
List<CombineInstance> combineList = new List<CombineInstance>();
for (int i = 0; i < meshFilters.Length; i++)
{
if (meshFilters[i].sharedMesh != null)
{
CombineInstance combineInstance = new CombineInstance
{
mesh = meshFilters[i].sharedMesh,
transform = meshFilters[i].transform.localToWorldMatrix
};
combineList.Add(combineInstance);
}
}
GameObject combinedObject = new GameObject("Combined Mesh");
combinedObject.AddComponent<MeshFilter>();
combinedObject.AddComponent<MeshRenderer>();
combinedObject.GetComponent<MeshFilter>().sharedMesh = new Mesh();
combinedObject.GetComponent<MeshFilter>().sharedMesh.CombineMeshes(combineList.ToArray());
combinedObject.GetComponent<MeshRenderer>().material = Material;
if (DeactivateParentAfterMerge)
{
Parent.SetActive(false);
}
if (DestroyParentAfterMerge)
{
Destroy(Parent);
}
}
}
코드를 복사해서 스크립트를 하나 생성해줍니다.
하나의 Mesh로 묶을 오브젝트들을 그룹화해줍니다. 그 후 상위 오브젝트에 방금 만들어둔 컴포넌트를 붙여줍니다.
컴포넌트 우클릭 후 Merge을 클릭해주면 메쉬가 하나로 합쳐지는 것을 확인할 수 있습니다.
메쉬를 하나로 묶어주고 Batch수를 확인한 결과 24가 줄어든 것을 볼 수 있습니다.
오브젝트들이 개별 렌더링 되던 것이 한 번에 렌더링되었기 때문에 Batch가 줄어들게 됩니다.