1. 程式人生 > >Unity 5 全域光照使用小技巧

Unity 5 全域光照使用小技巧



那既然LightingData檔儲存著lightmapIndex與lightmapScaleOffset,是否只要保證LightingData檔最終能被呼叫不就沒問題了嗎?理論上是,如果我們只需要更換不同燈光條件下的lightmap,場景本身沒有更改的話,那麼多套lightmap對於場景中的靜態物體Renderer而言也只需要同一套lightmapIndex與lightmapScaleOffset資訊而已。

所以這時只要保證lighting視窗的Ligtmaps頁面中Light Data Asset裡選了正確的LightingData檔即可(因為很多開發者習慣性刪除掉這個檔,因此也就遺失了lightmapIndex與lightmapScaleOffset資訊)。

簡單的情況下使用LightingData檔即可。但是還有一種情況,如果場景本身也有所改變怎辦?

例如:我需要原始的場景lightmap與一個被炸彈炸過的場景lightmap,由於場景中的靜態物件改變了,這時兩次烘焙會產生兩個資料不同LightingData檔,無法簡單使用其中一個。 可惜的是現在Unity還不能在執行階段時切換LightingData檔,設計的時候僅僅作為Editor使用。

要解決這問題,我們需要自己記錄每個Renderer上的lightmapIndex與lightmapScaleOffset資訊,然後在更換lightmap的時候把這個資訊還原回去。

總結:具體做法有很多種,基本原理都是把lightmapIndex與lightmapScaleOffset序列化起來。比如說我們可以給每個靜態物件掛一個指令碼,在裡面定義一個包含Render,lightmapIndex與lightmapScaleOffset的結構,然後一個Save函式用來在每次烘焙lightmap之後把lightmapIndex與lightmapScaleOffset序列化進結構中,一個Load函式用來在切換lightmap時還原每個Renderer的lightmapIndex與lightmapScaleOffset資訊。這樣問題就解決了。