유니티 CombineMesh함수를 이용하여 여러개의 메쉬를 하나의 메쉬로 묶어보자!

메쉬를 묶는 이유는 Batch를 줄이기 위함입니다.

 

CombineMesh함수를 이용하지 않고 MeshBaker 에셋을 이용해서 줄이는 방법도 있지만, 이번 시간에는 CombineMesh함수를 이용한 방법에 대해 알아보고자 합니다.

 

유니티 MeshBaker

MeshBaker란? 여러 개의 메시를 하나의 큰 메시로 결합하고 해당 오브젝트의 텍스처를 텍스처 아틀라스 및 텍스처 배열로 만드는 데 있어 도움을 주는 툴(Tool)입니다. 텍스쳐 아틀라스를 사용하지

wlsdn629.tistory.com

 


사용방법

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);
        }
    
    }

}

 

코드를 복사해서 스크립트를 하나 생성해줍니다.

그룹화 / Merge

 

하나의 Mesh로 묶을 오브젝트들을 그룹화해줍니다. 그 후 상위 오브젝트에 방금 만들어둔 컴포넌트를 붙여줍니다.

컴포넌트 우클릭 후 Merge을 클릭해주면 메쉬가 하나로 합쳐지는 것을 확인할 수 있습니다.

 

Batch수가 24나 줄어들었다

 

메쉬를 하나로 묶어주고 Batch수를 확인한 결과 24가 줄어든 것을 볼 수 있습니다.

오브젝트들이 개별 렌더링 되던 것이 한 번에 렌더링되었기 때문에 Batch가 줄어들게 됩니다.