[UGUI] 用腳本給UI綁定事件(對比手動綁定)

注:此文內容所使用Unity版本爲5.1.1f1,在較早的版本中,代碼可能略有不同,最後一行代碼trigger.triggers.Add(…) 可能爲 trigger.delegates.Add(…)

一直覺得用腳本給UGUI綁定事件過程很繁瑣,不易記。最近發現如果對比着手動綁定事件的過程,是非常容易記住的,因爲兩者的過程幾乎是一致的,下面對比一下:

一、先來看看手動綁定的過程:

  1. EventTrigger提供了很多事件,我們可以手動給任何UI元素添加一個EventTrigger(如圖1),在EventTrigger中可以手動爲UI添加鼠標劃入、鼠標點擊、鼠標劃出等一系列非常豐富的事件。

圖1
2. 手動添加方法很簡單直白,在EventTrigger組件中點擊”Add New Event Type”,(如圖2)在菜單中選擇需要的事件即可添加事件。一個組件可以添加多個事件(圖3即爲Image對象添加了鼠標進入、鼠標劃出兩個事件)。
圖2

圖3
3. 添加好事件以後,在每個事件下通過點擊下方的”+”按鈕,爲事件綁定一個偵聽函數,過程很簡單不再贅述。每個事件當然也可以綁定多個偵聽函數(圖4中我們分別爲PointerEnter和PointerExit各自添加了兩個偵聽函數)。需要注意的是,偵聽函數的參數必須是BaseEventData類型,因爲它接受的是“基礎的事件數據”。

這裏寫圖片描述

二、看腳本綁定過程之前先看一下相關的幾個類,他們都是包含在UnityEngine.EventSystem命名空間下:

  1. UnityEngine.EventSystem.EventTrigger
    事件觸發器,就是手動綁定裏第一步我們添加的EvnetTrigger組件,提供了豐富的交互事件

  2. UnityEngine.EventSystem.BaseEventData
    所有新事件系統的事件類型的父類

  3. UnityEngine.EventSystem.EventTrigger.Entry
    一個Entry就是一個事件類型入口,即圖2中添加的一個元素。圖3中包含了兩個Entry。
    Entry保存了事件類型信息(EventID,是EventTriggerType枚舉類型)以及一個要調用的事件列表(callback,是TriggerEvent類型,需要初始化),該列表可以通過AddListener來添加多個偵聽函數

  4. UnityEngine.EventSystem.TriggerEvent
    一個TriggerEvent是一個可以通知多個函數的委託(通過AddListener來添加)圖4中PointerEnter 這個Entry下包含的兩個處理函數就是被TriggerEvent通知的兩個函數,手動添加的第三步即可以對應爲這裏的AddListener()

三、下面看看用腳本綁定的過程:

  1. 創建一個C#腳本/類,名稱隨意,這裏叫EventHandler。包含EvnetSystem命名空間,Using UnityEngine.EventSystem由於偵聽事件必須依賴事件觸發器EventTrigger組件,所以在類上方寫上

    [RequireComponent(typeof(UnityEngine.EventSystems.EventTrigger))]
    
  2. 獲取EventTrigger引用

    EventTrigger trigger = GetComponent();
    
  3. 聲明2個Entry並設置其事件類型,一個設置爲鼠標劃入,一個設置爲鼠標劃出。

    EventTrigger.Entry mouseInEntry = new EventTrigger.Entry();
    mouseInEntry.eventID = EventTriggerType.PointerEnter;
    EventTrigger.Entry mouseOutEntry = new EventTrigger.Entry();
    mouseOutEntry.eventID = EventTriggerType.PointerExit;
    
  4. 初始化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);
    
  5. 最後,向trigger的triggers中添加上述兩個Entry,結合第3步,對應手動操作的第三步-”Add New Event Type”。

        Trigger.triggers.Add(mouseInEntry);
        Trigger.triggers.Add(mouseOutEntry);
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章