UGUI使用了新的event機制,咱們以前在NGUI中,爲了處理ui的交互,一般是在ui組件掛載的mono上寫onclick(),onpress()這些函數,換到ugui後,unity使用了新的event 機制。可是unity的文檔解釋的很亂,這裏整理一下。canvas
這裏面有個主要的模塊:編輯器
EventSystem,全局須要有一個,咱們建立一個ui會自動生成一個,這是整個事件系統的管理器,一般不須要特殊設置它的參數函數
InputModule,他是用來管理輸入設備的輸入事件,提供一個抽象層,默認在建立ui時會生成一個StandartInputModule,這是針對鼠標鍵盤的輸入管理,若是要支持觸控的移動設備,咱們須要再加一個TouchInputModule,能夠同時加幾個input module,EventSystem會根據設備自動選擇。ui
RayCaster,他等因而一個事件的檢測器,由於ugui也是3Dui,全部的觸碰選擇都涉及到射線cast,因此在每一個canvas上要放置一個CanvasRayCast,這個canvas上的ui就能夠進行事件檢測,以發出事件,注意ui自己是不須要加入包圍盒組件的(NGUI的作法)spa
而後就是事件的產生和處理,ugui的方式有些相似QT,他有一個事件event,一個事件的處理器handler,event加入handler進行listen,當event發生時,handler就會執行,這樣event和handler就鏈接在了一塊兒,component
事件的定義繼承
event的類型是是UnityEngine.EventSystem.EventtriggerType,咱們看下全部支持的event接口
這裏有不少的pointer事件,所謂了pointer就是對鼠標和觸控的統一抽象,在鼠標下鼠標,在觸控下是觸控,如pointerdrag,是鼠標或者觸屏的拖拽。事件
事件的產生文檔
unity的事件是系統負責產生的,咱們不能本身模擬,好比當一個按鈕上觸發了一個click,unity會自動發出來自這個按鈕的click事件
事件和handler的鏈接觸發方式
1對於某些ui組件,能夠直接設置其對本身產生的事件的handler,如button的onpointerclick
2.對於任何ui組件,均可以使用eventtrigger這個component,這個trigger放置在產生事件的UI組件上,裏面包含了一個事件的類型,以及這個類型關聯的處理函數,處理函數可使用兩種函數參數,一種是使用int string簡單類型,一種是使用BaseEventData類型,由於當event發生時,會跟隨者把這個事件包裝成一個PointerEventData類型的參數送進來,裏面包含ui事件的詳細信息,包括鼠標在哪,而對於前一種簡單類型,在編輯器上能夠填寫當事件發生時傳什麼參數,這就比如qt的signal和slot鏈接。
3.強制讓某個事件發生在某個handler上(也就是強制某個handler執行):調用ExecuteEvents.Execute<ICustomMessageTarget>(target, null, (x,y)=>x.Message1());
這個調用將執行target身上全部繼承 了ICustomMessageTarget接口的mono的Message1函數,我的認爲這個和給target發送Message1 的sendmessage沒什麼區別,多是我尚未當即好這個接口。
以上就是在ugui中使用新的event系統進行ui的交互的原理和作法。