Unity中的單例模式、回調函數、消息分發的使用區別?

Unity中的單例模式、回調函數、消息分發在使用上該如何選擇,什麼情況下會使用單例,什麼情況下使用回調函數,什麼情況下使用消息分發,他們各自的優點是什麼???


單例模式:我可能在任何地方都需要用到你,你能隨時出現,並且我只需要一個你。(如用戶數據)

函數回調:我明確地知道你什麼時候會調用(補充:也知道你是怎麼調用的),我要在那個時候做一些事情。(如按鈕點擊回調事件)

消息派發/訂閱/分發等:我不知道這個消息會什麼時候出現(補充:也不需要知道是誰發出的),但我需要在它出現的時候做一些事情。(比如某個玩家登錄了,比如某個怪物死掉了)

這是他們三者簡單的區分,至於優勢的話,我覺得,好像沒有什麼可比性?畢竟使用的場合不一樣。


看淺墨的《遊戲編程模式》筆記


一點經驗分享吧。

單例模式很好理解也很好用,但是適用範圍其實很窄,因為全局只有一個。如果不做好許可權劃分以及介面封裝很容易導致多個地方改同一個變數。出的 bug 都很難改,尤其是快速反覆修改的情況。如果拿單例去做一些數據緩存或者 Buffer,也得做讀寫的鎖。比較合適的還是存放全局的只讀數據或者工具方法。之後想到再補充

我個人理解的回調是消息的簡化版。如果把這兩種都理解為「當事件 A 發生的時候觸發 X 」,那麼回調中的 X 就是特定功能的不需要擴展的事件 B,而消息則是用於需要觸發的事件數量與目的不定的一個事件組。前者便於調試(只有一個分支),而後者便於擴展(新增監聽與消息的發送者部分無關),優點反過來就是對方的缺點。

既然題主把單例和後兩個放在一起問,估計是有「當事件 A 發生的時候調用方法 Func 」 的需求。我的建議是,如果 Func 是個通用的方法,與特定功能無關,就直接用 instance 調用。如果是其他對象的成員函數,就按上一段說的,根據你實際的需求側重來權衡就好。不要怕錯,多試試就知道了。積極重構保證可讀性就行。

祝好運。


又不是unity的東西,建議看看c#的那堆東西了解一下。

個人使用單例是玩家角色數據管理,ui之類的。

回調用於非同步行為,如UI功能回調。

事件也用於非同步,但少用,常見於監聽某些行為,如玩家被殺死,則周圍的怪物,以及其他物體應該被通知,並且停止部分邏輯更新,如防止對主角鞭屍。


推薦閱讀:

TAG:Unity遊戲引擎 | unity |