應一些讀者和用戶的要求,小姐姐特此撰寫本文,並通過實例演示Unity3d預制體(Prefab)的最新烘焙方法,以幫助很多人解決預制體烘焙之后,在運行時光影圖丟失的問題。
為了簡化問題,小姐姐導入一個模型,構造下圖所示的簡單場景。
下面創建一盞點光源(pointlight),燈光顏色設為橙色、模式為baked,其他參數如下圖所示。
接下來按Ctrl+D,復制剛創建的那盞點光源,然后移動至另一邊,將燈光顏色修改為粉色,其他參數如下圖所示。
關閉系統默認創建的平行光(Directional Light),然后創建一盞聚光燈(Spotlight),參數如下圖所示,如果兩盞點光源太暗,可適當調整燈光強度和位置。
接下來創建一個空物體,並命名為“lights”,將剛才創建的三盞燈拖到其下打組,如下圖所示。
這里小姐姐需要說明一下,Unity通過創建空物體來對物體的打組(或稱編組),其圖標與普通物體的圖標相同,如下圖中的“Lights”編組,因為空物體本身就是物體,其他物體拖入其下構成的編組,其圖標與普通物體圖標相同就不難理解了,這種編組中的物體不僅可以刪除、還可以重排序,也可以移出該編組,而且可以向該編組中添加物體或其他編組。但同為編組,建模軟件中的打組(為了不造成混亂,暫且稱其為建模軟件中的打組),導入Unity后,其圖標與Unity的編組卻大不相同,如下圖中的“xiangzi”打組,這種圖標代表該打組來自模型構建軟件,這種編組中的物體不能單獨刪除(除非刪除整個編組),不能重排序(除非在建模軟件中操作后重新導入),但可以向該編組中添加物體或編組,所不同的是,在該編組中添加的物體或編組,其圖標會帶一個“+”圖標,以示這些物體或編組不是該編組的原始物體,如下第二張圖所示。
下面我們選中“xiangzi”編組,如下圖所示勾選inspector面板右上角的“Static”,將其設為靜態,然后點擊彈出對話框中的“yes,change children(是的,同時改變其下的所有物體)”。
接下來展開Static后面向下的箭頭,在其下拉菜單中取消“batching Static(批量靜態化)選項的勾選,然后點擊彈出對話框中的“是的,改變其下的所有物體”按鈕。
再創建一個空物體,將其命名為“baibaoxiang”,然后將前面的“xiangzi”和“Lights”編組選中拖入其下,構成新的編組,形成編組的嵌套,如下圖所示。
選中“baibaoxiang”編組,然后將“PrefabLMData.cs”腳本拖至該編組的Inspector面板中,這個腳本就與該編組關聯起來了。
在assets下或其下的某個文件夾中創建一個文件夾,命名為“Prefabs”,用於存儲預制體(Prefab),如下圖所示。
打開剛創建的“Prefabs”文件夾,選中“baibaoxiang”群組,將其拖至"Prefabs"文件夾中,此時“Prefabs”文件夾中就會生成一個預制體“baibaoxiang”,同時層級面板中的“baibaoxiang”群組的圖標變成了藍色,並且這個群組變成了預制體的子,預制體成了這個群組的父,雖然預制體由這個群組生成,但這個群組與預制體的輩分發生了對調。另外,當這個群組生成預制體后,就不能再稱其為群組了,而應稱其為預制體的實例(也就是預制體的子),如下圖所示。
下面我們就來烘焙預制體,首先按下圖所示的光照參數進行設置。
接下來選中層級面板中預制體的實例“baibaoxiang”,然后點擊Unity “Assets”菜單下的“Bake Prefab Lightmaps(烘焙預制體光照貼圖)”命令,對預制體的實例進行烘焙,對預制體實例的烘焙會反饋到預制體中,因此對預制體實例的烘焙也稱為預制體的烘焙。
在預制體烘焙時,如果不注意,有的人會以為沒有反應,因為預制體烘焙進度不像unity場景的烘焙一樣會出現在右下角的狀態欄上,而是顯示在任務欄的Unity圖標上,如下圖所示。
預制體烘焙制后的結果如下圖所示。
預制體的實例由預制體生成,所以我們現在刪除層級面板中預制體的實例,然后將預制體拖至層級面板或場景視圖,如下圖所示,但我們發現,場景中的預制體實例沒有光影圖。
場景中的預制體實例沒有光影圖,問題出在哪兒呢?我們應該明白,預制體是在實時運行時加載的,所以應該在播放狀態下來測試預制體,而不是直接將預制體拖至場景中。現在按下播放按鈕,然后將預制體拖向場景視圖,此時我們發現,預制體實例的光影圖被正確載入,如下圖所示。
預制體可以在運行時在同一場景中加載或重復加載,也可以在不同場景中加載,下面我們來測試在不同場景中的加載。新建一場景,然后將剛才的預制體拖入(今天太晚了,改天再續...)