Unity3d開發(十七)UGUI 事件體系分析

width="150" height="210" frameborder="0" scrolling="no" src="http://widget.weibo.com/relationship/bulkfollow.php?language=zh_cn&uids=2080045857&wide=1&color=FFFFFF,FFFFFF,0082CB,666666&showtitle=0&showinfo=1&sense=0&verified=1&count=1&refer=http%3A%2F%2Fwww.himigame.com%2Fandroid-game%2F1521.html&dpc=1" style="font-size: 14px; font-weight: bold; border-width: 0px; margin: 0px; padding: 0px; font-family: arial, helvetica, clean, sans-serif; line-height: 16px;">


文章作者:松陽

本文出自 阿修羅道,禁止用於商業用途,轉載請註明出處。  

原文鏈接:http://blog.csdn.net/fansongy/article/details/52778862







很多Unity3D項目都使用了UGUI,但並不是所有人都研究過它的內部結構。由於準備定製自己的UI,不弄明白它內部的機制有點說不過去呢。這篇文章主要分析一下它的事件體系結構,以及點擊事件的邏輯流程。本篇文章依託於UGUI的源碼,如何獲取UGUI的源碼可以參考Unity3d(十六) 重寫UGUI組件

事件體系

事件體系總體上說由四部分組成,分別是:監測器,派發器,採集器,響應器。

監測器指的是EventSystem類,它重寫了MonoBehavior的Update方法,會在每一幀更新掛載在同一個GameObject上的BaseInputModule組件狀態,並判斷是否應該激活Module,如果是,則去調用各個Module的Process。

派發器指的就是BaseInputModule,最常用的是它的子類StandaloneInputMoudle。它完成了實際的事件生成。包括且不限於:事件類型的確定,事件數據的收集,派發對象的過濾。其中對派發對象的獲取需要藉助採集器,但需要通過監測器來獲取,這種設計可以帶來效率上的優勢,雖然實現時並沒有相關的代碼。

採集器是指BaseRaycaster,在UGUI中使用的是其子類GraphicRaycaster。當事件發生時,會由Module請求一個射線點觸,返回所有能點到的物體並返回,交由派發器進行過濾。它有一個內部的管理類RaycasterManager,用來做鏈接採集器和監測器的單向橋樑。

響應器是指IEventSystemHandler及其子類,例如最常用的IPointerClickHandler,它處理的是點擊事件。通過ExecuteEvents類,可以將發生事件的對象上所有的響應器都獲取到並調用其響應邏輯。以點擊爲例,事件最終會被派發到OnClick的代理上。完成邏輯的執行。

這四個模塊大致的依賴關係如下: 


類圖

類有好多,但相比於流程要簡單不少。類分兩部分,一部分是功能類,一部分是編輯器類。

功能類按照上一節的事件體系可以清晰的找到重要的基類,UML圖如下:



這個圖只是和點擊相關的部分,當然還有很多其他的功能例如拖拽,滑動等等。但如果能找到這些重點,其他分支邏輯相信大家分分鐘都能看懂了。

另一類是編輯器類,這個比較簡單,我就沒單獨梳理類圖,直接用VS自動生成的類圖就夠用了:



你若是覺得這些編輯器類沒什麼用,那你一定是對編輯器代碼理解還不深。UGUI的編輯器界面還算獲得了廣泛的好評,當需要自定義Inspector界面時,一些功能一定用得上,如果有空我也準備深入研究一下。

點擊的邏輯流程

下面基於事件體系的劃分,針對一次按鈕點擊梳理一下調用邏輯,流程圖如下:



總結

“動手改之前,要先弄明白別人的程序邏輯”。說起來很簡單,但又有幾個人能堅持做好呢?雖然我也是在外層包裝了各種控件之後,才下決心重寫UGUI 。 看到現在這種程度可真心花了不少時間,整理出來希望對大家有幫助

如果你覺得這篇文章對你有幫助,可以順手點個,不但不會喜當爹,還能讓更多人能看到它... 

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