前陣子因為新工作需要,所以都在研究PHP跟NOSQL,現在比較有空了,再來寫一些東西。
很多使用Unity的朋友,應該都有用過NGUI這個套件,用它來做UI介面相當方便,但各位朋友是否曾好奇過NGUI怎麼把它的物件顯示出來的?我們今天就來研究這個問題。
上圖是NGUI的一個場景,我們可以看到在Panel這個物件上,有一個UIPanel的script,而所有的UI物件都是它的子物件。那我把UIPanel這個script關掉,看會發生什麼事
由上圖可以看到UI物件不顯示,顯然NGUI的物件顯示是UIPanel在管理的。再來開啟UIPanel這個script看看裡面的程式碼
Fill()這個方主要的工作就是把要繪製的物件頂點,材質, 貼圖, Shader, 丟給UIDrawCall這個script去做顯示。我們再打開UIDrawCall這個script
由上圖我們可以發現,在UNITY_EDITOR的模式裡時,用
UnityEditor.EditorUtility.CreateGameObjectWithHideFlags這個方法產生了一個物件,而在非UNITY_EDITOR模式中時,用一般的方式來產生物件,最後這兩個方法產生的物件都會附加上UIDrawCall這個script,那我們現在把程式碼改一下
然後再回到Unity裡看看有什麼變化
你會發現場景上多了一個名叫SciFi Atlas的物件,而且它就已經包含了整個UI的幾何圖形,看到這裡,你應該已經了解NGUI是如何把DrawCall減到那麼少了吧?因為它把用相同Atlas的幾何圖形合併成一個了,然後它身上也有一般模型所需要的Mesh Filter跟Mesh Renderer這兩個component,所以NGUI並不是不需要這兩個component去顯示物件而是把它藏起來了。
在了解這些底層原理後,對你使用NGUI在優化上會很大幫助,所以把它學起來吧。