動態加載UI
我們進入一個場景后,如果將這個場景所有可能用到的UI都直接放在場景中做好,由於要在進入場景時就部署好所有的UI對象,那么當UI對象較多時會碰到的問題是:1.初始化場景會產生非常明顯的卡頓、2.所有UI都在場景中導致占用大量的內存。
所以我們需要對UI組件進行動態加載和銷毀,當需要打開指定的UI時,動態的創建出這個UI對象,而當關閉這個UI對象之后,可以對其進行銷毀從而釋放出內存。
將UI制作成一個預制件
我們可以在場景中制作好一個UI,然后將其保存成一個預制件后從場景中移除,然后我們使用這個UI就可以和使用Unity中任意的預制件一樣了。
特別需要注意的是,當存在重復的UI時都要將其作為一個預制件來使用,比如背包的格子或各種列表的列表項。
我們直接看一個簡單的例子:
1 using UnityEngine; 2 using System.Collections; 3 4 public class LoadUI : MonoBehaviour 5 { 6 //加載的 UI 的父對象 7 public GameObject uiParent; 8 9 //加載后創建的 UI 對象 10 public GameObject ui; 11 12 void Start() 13 { 14 //加載制作好的 UI 的預制件 15 GameObject go = Resources.Load<GameObject>("UI/BagPlane"); 16 17 //添加到 uiParent 的第一種方法 18 GameObject uiGO = Instantiate(go, uiParent.transform.position, uiParent.transform.rotation) as GameObject; 19 uiGO.transform.SetParent(uiParent.transform); 20 21 //添加到 uiParent 的第二種方法, 其實就是 NGUI 中對於第一種方法的封裝 22 GameObject uiGO = NGUITools.AddChild(uiParent, go); 23 24 ui = uiGO; 25 } 26 27 void Destroy() 28 { 29 //銷毀 UI 對象 30 Destroy(ui); 31 } 32 }
NGUI事件
EventDelegate
NGUI在3.x版本里對底層的事件進行了一次大的修改,其中最重要的就是將老版本的SendMessage修改為了EventDelegate(事件委托)。
事件委托負責調用NGUI中的所有交互事件的回調,我們具體看下下面的例子:
1 using UnityEngine; 2 using System.Collections; 3 4 public class LoadUI : MonoBehaviour 5 { 6 //按鈕組件 7 public UIButton button; 8 9 void Start() 10 { 11 //第一種寫法 12 EventDelegate eventDelegate = new EventDelegate(this, "ButtonClickHandler"); 13 //第二種寫法 14 EventDelegate eventDelegate = new EventDelegate(ButtonClickHandler); 15 16 //第一種添加回調的寫法 17 EventDelegate.Add(button.onClick, eventDelegate); 18 //第二種添加回調的寫法 19 button.onClick.Add(eventDelegate); 20 } 21 22 public void ButtonClickHandler() 23 { 24 Debug.Log("我被點了!"); 25 } 26 }
而onClick其實是一個List.<EventDelegate>,我們對其進行增加和移除就可以管理所有的回調了。
NGUI中的所有事件都是同樣的寫法。
EventTrigger
EventTrigger是一個組件,可以添加到任意UI上,其目的就是擴展該UI對象的事件類型,比如按鈕中只有onClick的事件,這顯然不能滿足所有的需求,所以我們可以給該UI對象添加一個EventTrigger腳本,使其可以支持按下、移入、移出等事件。