簡介
在介紹實作之前想必大家都聽過Unity中的一個名詞,叫做「Batch」, 來引用網路上的好資料來解釋之。
Batch
Unity為了在螢幕上繪製物件,它需要向圖形API發起一次“繪製”命令,就是一次“Draw Call”。但在發起命令之前,Unity還需要為繪製的物件設定所需的GPU狀態:網格、著色器、貼圖、混合設定以及一些其他的著色器屬性。而狀態改變命令再加上一個或多個繪製命令就稱為一次批次處理(a Batch)。
而我們這篇為了要節省場景中的Batch數,挑了Mesh Baker這個套件,那以下就提出幾個Baker的概念與做法。
範例前置作業
這邊我們在介紹這套件前,來準備好要料理的素材,建立不同的模型,而每個模型也擁有著各自的材質,並且來重複複製多個物件,來看看在場景中的Batch數字是多少 = 45 ,看來不是很明顯,我們來複製6份,Batch達到272 (為了做實驗要誇大一點)。
接著匯入Mesh Baker的套件,如本篇的Banner圖片,在Asset Store看到這圖案請下載Free版本,我這有付費版本,可以分享給大家。
同模型+同材質球
我歸納了一下Baker的規則 :
1.同模型+同材質球 = 1個模型 + 1顆材質球 (Batch降很多)
2.不同模型+不同材質球 = 1個模型 + 多個材質球 (不會降Batch)
3.不同模型+不同材質球 = 多個模型 + 1個材質球 (Batch降很多,但某些物件會失真)
而這篇我們先來講述第一點跟第二點,在同模型+同材質球做動之前的Batch是32。

首先先新增一個MeshBaker物件,請至GameObject→Create Other→Mesh Baker→Mesh Baker,會在Hierachy多出一個MeshBaker物件且會掛載了默認元件程式。如下圖。

我們可以看到Object To Be Combined的Custom List Of Objects To Be Combined – Size設定你要合成Bake物件原始數量(其實加入合併物件有兩種方法,這段先使用此方法)。這邊我們輸入6個陣列位置,將物件拖曳至陣列中。
在Output區可以將結合的檔案輸出到場景中、Prefab中、Mesh Asset,而這段我們合併在場景中。而Setting主要是在控制模型的材質,這邊我們先用預設的設定,之後有機會在述說。
最後都設定好之後就按下下方有一個比較特殊顏色的Bake按鈕,系統會新增一個物件在Hierarchy,如下圖。


可以看到用此方法將多模型合併之後,系統只需要耗5Batch,相較於合併前的32Batch節省了許多,可想而知假如整個場景有上萬個物件,有用上MeshBaker想必會省超多的資源。但似乎使用本段的作法可能比較慢,在下方的實驗作法會越來越簡易且可以處理更多的物件。
不同模型+不同材質球

這段來用多模型做實驗,可看到Batch是45,如前言處有張圖顯示。而我們可以將要Bake的物件建立一個父物件來裝載之,而這邊除了上一段新增要Bake的陣列方法外,其實有一個更快的方法,就是將裝載好的父物件直接拖進Combined區,程式會自動新增Enable的檔案。

可以看到上圖,該單一模型擁有所有的材質球,看似節省了Batch數字也節省了Hierachy數量,但事實上是沒變的,我們為了要解決這問題必須要把所有材質球整合成單一一顆,我們在下一段來實作吧。
不同模型+不同材質球+合成材質球與貼圖

大家一樣建立一個MeshBaker檔案,一樣是看到Objects To Be Combined→Open Tools For Adding Objects,可以開啟箭頭處視窗。我們要先在Asset中創建一個Bake資料夾,用意是把Bake出來的Mesh所需要的Texture,Material合併成個別的單一檔案。接著在上圖標示1.的按鈕就是指定你新創的資料夾。標示2.的按鈕按下後程式會掃瞄出場景中所有(Enable)物件,所以你可以把當下要群組Bake的物件Enable其他都Disable。

當按下List Shaders In Scene按下後會產生程式掃描後的Enable物件列在下方,上圖標示的1.啟動物件Bake按鈕,2.選取掃描到該欄位的物件在Hierachy區。這邊請按下1.按鈕,在Hierachy會新增兩個MeshBake物件,請靶子物件刪除。


接著點選其中一個物件並看到Inspector中,如上圖所示,請將Consider Mesh UVs打勾,接著按下Bake Materials Into Combined Material,這邊的用意是把材質球與材質整合成單一檔案,請將兩個物件做此動作。

接著我們來處理將多物件來作物件的Bake,請先至MB3_Mesh Bake Group程式員件中,如上圖,Cluster Type請選擇Grid,設定Cell Size符合所有物件的範圍,可以在Scene視窗中看見Grid示意。都設定好之後請按下Generate Mesh Bakers。

接著請繼續看到上圖程式元件,剛剛上一動的用意是要先把Mesh空物件產出,接續此動步驟才可以批次Bake出物件,這邊看到LightMapping UVs選擇Generate_New_UV2_LayOut,並按下Bake All Child MeshBakers。

可以看到Bake出來的物件通通都吃同一個MeshBaker Texture,但物件會有跟Bake前相同數量,這時候只要去做本文第一段動作,把所有物件都Bake在一起,成為一個物件,就完成多物件+多材質的Baker動作。可以看到下圖Batch從43變成7而已。

小結
本篇其實有三個實驗,但是主要歸納出兩個重點與實作,當你要MeshBaker場景時,首先要考慮你是要Baker同材質或不同材質,而最主要的目的都是會將許多物件組合成一個Mesh檔案,只要從材質面出發你就可以選擇本實驗的1或是3來著手了。而在下一篇會講解如何將MeshBaker過的組合物件加入個別的Collider。