NGUI學習筆記(四):動態加載UI和NGUI事件


動態加載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腳本,使其可以支持按下、移入、移出等事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM