注:此文內容所使用Unity版本爲5.1.1f1,在較早的版本中,代碼可能略有不同,最後一行代碼trigger.triggers.Add(…) 可能爲 trigger.delegates.Add(…)
一直覺得用腳本給UGUI綁定事件過程很繁瑣,不易記。最近發現如果對比着手動綁定事件的過程,是非常容易記住的,因爲兩者的過程幾乎是一致的,下面對比一下:
一、先來看看手動綁定的過程:
- EventTrigger提供了很多事件,我們可以手動給任何UI元素添加一個EventTrigger(如圖1),在EventTrigger中可以手動爲UI添加鼠標劃入、鼠標點擊、鼠標劃出等一系列非常豐富的事件。
2. 手動添加方法很簡單直白,在EventTrigger組件中點擊”Add New Event Type”,(如圖2)在菜單中選擇需要的事件即可添加事件。一個組件可以添加多個事件(圖3即爲Image對象添加了鼠標進入、鼠標劃出兩個事件)。
3. 添加好事件以後,在每個事件下通過點擊下方的”+”按鈕,爲事件綁定一個偵聽函數,過程很簡單不再贅述。每個事件當然也可以綁定多個偵聽函數(圖4中我們分別爲PointerEnter和PointerExit各自添加了兩個偵聽函數)。需要注意的是,偵聽函數的參數必須是BaseEventData類型,因爲它接受的是“基礎的事件數據”。
二、看腳本綁定過程之前先看一下相關的幾個類,他們都是包含在UnityEngine.EventSystem命名空間下:
UnityEngine.EventSystem.EventTrigger
事件觸發器,就是手動綁定裏第一步我們添加的EvnetTrigger組件,提供了豐富的交互事件UnityEngine.EventSystem.BaseEventData
所有新事件系統的事件類型的父類UnityEngine.EventSystem.EventTrigger.Entry
一個Entry就是一個事件類型入口,即圖2中添加的一個元素。圖3中包含了兩個Entry。
Entry保存了事件類型信息(EventID,是EventTriggerType枚舉類型)以及一個要調用的事件列表(callback,是TriggerEvent類型,需要初始化),該列表可以通過AddListener來添加多個偵聽函數UnityEngine.EventSystem.TriggerEvent
一個TriggerEvent是一個可以通知多個函數的委託(通過AddListener來添加)圖4中PointerEnter 這個Entry下包含的兩個處理函數就是被TriggerEvent通知的兩個函數,手動添加的第三步即可以對應爲這裏的AddListener()
三、下面看看用腳本綁定的過程:
創建一個C#腳本/類,名稱隨意,這裏叫EventHandler。包含EvnetSystem命名空間,Using UnityEngine.EventSystem由於偵聽事件必須依賴事件觸發器EventTrigger組件,所以在類上方寫上
[RequireComponent(typeof(UnityEngine.EventSystems.EventTrigger))]
獲取EventTrigger引用
EventTrigger trigger = GetComponent();
聲明2個Entry並設置其事件類型,一個設置爲鼠標劃入,一個設置爲鼠標劃出。
EventTrigger.Entry mouseInEntry = new EventTrigger.Entry(); mouseInEntry.eventID = EventTriggerType.PointerEnter; EventTrigger.Entry mouseOutEntry = new EventTrigger.Entry(); mouseOutEntry.eventID = EventTriggerType.PointerExit;
初始化Entry的callback,並分別向其中添加兩個處理函數(對應手動操作是第三步,在每個事件下方點”+”添加函數。處理函數的參數是BaseEventData 類型,具體內容就略過不表)
mouseInEntry.callback = new EventTrigger.TriggerEvent(); mouseInEntry.callback.AddListener(OnMouseEnter1); mouseInEntry.callback.AddListener(OnMouseEnter2); mouseOutEntry.callback = new EventTrigger.TriggerEvent(); mouseOutEntry.callback.AddListener(OnMouseOut1); mouseOutEntry.callback.AddListener(OnMouseOut2);
最後,向trigger的triggers中添加上述兩個Entry,結合第3步,對應手動操作的第三步-”Add New Event Type”。
Trigger.triggers.Add(mouseInEntry); Trigger.triggers.Add(mouseOutEntry);