http://www.javashuo.com/article/p-kakgrzne-hc.htmlide
處理與管理點擊、鍵盤輸入、觸摸等事件this
EventSystem源碼聲明瞭spa
private List<BaseInputModule> m_SystemInputModules = new List<BaseInputModule>(); private BaseInputModule m_CurrentInputModule;
BaseInputModule是抽象類
PointerInputModule繼承自BaseInputModule,也是抽象類
StandaloneInputModule繼承自PointerInputModule,面向PC/Mac/Linux standalone平臺的輸入模塊
TouchInputModule繼承自PointerInputModule,面向Android/iOS等移動平臺的輸入模塊.net
EventSystem在每一幀都會處理這些輸入模塊 -- 調用TickModules(),更新每個InputModule
遍歷m_SystemInputModules,判斷這些module是否支持當前平臺且可用
1. 如有符合條件的module,便賦值給m_CurrentInputModule並break;
2. 若沒有符合條件的module,便選取第一個支持當前平臺的module做爲m_CurrentInputModule
若m_CurrentInputModule的值發生變化,且m_CurrentInputModule!=null,便調用m_CurrentInputModule.Process()
該方法會將各類輸入事件傳遞給EventSystem當前選中的GameObject(m_CurrentSelected)
m_CurrentSelected大部分狀況是Selectable組件
(在設置m_CurrentSelected時,會經過ExecuteEvents類對以前選中的對象執行一個被取消事件OnDeselect(),
對新選中的對象執行一個被選中事件OnSelect())code
EventSystem的RaycastAll()方法,使用射線從相機到某個點(設爲點E)照射在UI上
而後對被照射到的全部對象進行排序,大體是遠近排序。對象
IsPointerOverGameObject()方法用於判斷是否點擊在UI上blog
EventSystem的public static EventSystem current { get; set; } 屬性
當一個EventSystem組件OnEnable()時會將該對象賦值給current;
OnDisable()時,若current==this,則會將current賦值爲null
這也是在UnityEditor中有多個EventSystem時會報警告的緣由
排序
http://www.javashuo.com/article/p-qlrxdpag-cx.html繼承
EventSystem中事件的執行 -- 涉及到EventInterface接口和ExecuteEvents類接口
EventInterface聲明瞭一系列接口,好比IPointerEnterHandler
一個組件添加IPointerEnterHandler的繼承後,並實現OnPointerEnter()方法,即可在鼠標進入對象時,觸發回調OnPointerEnter()方法。
這些接口所有繼承自IEventSystemHandler,而IEventSystemHandler也是聲明在EventInterface中的接口
這些接口都會在ExecuteEvents中被調用。
ExecuteEvents是一個靜態類,聲明瞭一個delegate EventFunction,這是一個泛型委託,能夠是不一樣類型的handler
好比
private static readonly EventFunction<IPointerEnterHandler> s_PointerEnterHandler = Execute; private static void Execute(IPointerEnterHandler handler, BaseEventData eventData) { handler.OnPointerEnter(ValidateEventData<PointerEventData>(eventData)); }