Unity-消息系統(tǒng)
新的 UI 系統(tǒng)使用一種消息系統(tǒng)來取代 SendMessage。該系統(tǒng)是純 C# 系統(tǒng),旨在解決 SendMessage 存在的一些問題。該系統(tǒng)使用可在 MonoBehaviour 上實(shí)現(xiàn)的自定義接口來指示組件能夠從消息系統(tǒng)接收回調(diào)。調(diào)用時(shí)會(huì)指定目標(biāo)游戲?qū)ο螅辉撜{(diào)用將在游戲?qū)ο蟮乃校▽?shí)現(xiàn)了指定接口以據(jù)此發(fā)出該調(diào)用的)組件上發(fā)出。借助消息系統(tǒng)可傳遞自定義用戶數(shù)據(jù),并可指定事件應(yīng)在游戲?qū)ο髮蛹?jí)視圖中傳播的距離:應(yīng)該僅為指定的游戲?qū)ο髨?zhí)行,還是應(yīng)該在子對(duì)象和父對(duì)象上也執(zhí)行。除此之外,消息框架還提供 helper 函數(shù)來搜索和查找實(shí)現(xiàn)了給定消息接口的游戲?qū)ο蟆?/p>
消息系統(tǒng)是通用型系統(tǒng),不僅可用于 UI 系統(tǒng),還可用于一般游戲代碼。添加自定義消息事件相對(duì)簡(jiǎn)單,借助 UI 系統(tǒng)用于所有事件處理的相同框架即可實(shí)現(xiàn)。
如何定義自定義消息?
如果希望定義自定義消息,此過程相對(duì)簡(jiǎn)單。在 UnityEngine.EventSystems 命名空間中,有一個(gè)名為“IEventSystemHandler”的基本接口。從此接口擴(kuò)展的任何內(nèi)容都可以視為通過消息系統(tǒng)接收事件的目標(biāo)。
一旦定義了此接口,即可由 MonoBehaviour 實(shí)現(xiàn)。此接口實(shí)現(xiàn)后,定義了在針對(duì)此 MonoBehaviour 游戲?qū)ο蟀l(fā)出指定消息時(shí)將會(huì)執(zhí)行的函數(shù)。
現(xiàn)在有了可接收消息的腳本之后,我們需要發(fā)出消息。通常,此消息用于響應(yīng)發(fā)生的某個(gè)松散耦合事件。例如,在 UI 系統(tǒng)中,我們?yōu)?PointerEnter 和 PointerExit 等事件發(fā)出事件,還有為了響應(yīng)用戶在應(yīng)用程序中的輸入而發(fā)生的各種其他事件。
要發(fā)送消息,可使用一個(gè)靜態(tài) helper 類來執(zhí)行此操作。在參數(shù)方面,需要消息的目標(biāo)對(duì)象、一些特定于用戶的數(shù)據(jù)以及一個(gè)映射到所需目標(biāo)消息接口中特定函數(shù)的仿函數(shù) (functor)。
此代碼將在游戲?qū)ο竽繕?biāo)上實(shí)現(xiàn)了 ICustomMessageTarget 接口的所有組件上執(zhí)行 Message1 函數(shù)。ExecuteEvents 類的腳本文檔中介紹了執(zhí)行函數(shù)的其他形式,例如在子對(duì)象或父對(duì)象中執(zhí)行。