天天看點

unity menuitem_Unity 遊戲架構搭建 2019 (四十六) 簡易消息機制

unity menuitem_Unity 遊戲架構搭建 2019 (四十六) 簡易消息機制

在上一篇,我們接觸了單例,使用單例解決了我們腳本之間通路的問題。

腳本之間通路其實有更好的方式。

我們先分下腳本通路腳本的幾種形式。

第一種,A GameObject 是 B GameObject 的 Parent,或者是中間隔着幾個層級的 Parent。

那這種情況下,如果 A 腳本想調用 B 腳本的方法,直接通過 transform.Find(“XXX/YYY/ZZZ”).GetComponent<B>().DoSomething() 就可以了。

但是如果是 B 腳本想調用 A 腳本的方法,比較好的方式呢,是在 B 腳本中聲明委托,然後在 A 中注冊特定方法。當 B 想調用 A 腳本的方法的時候,通過委托通知就好。

除了使用委托,也可以使用消息機制,Unity 本身實作了一套消息機制,比如在 B 腳本中可以使用, this.SendMessageUpward(“MethedName”) 這樣的方式。不過這種方式由于是使用字元串,并且可能用到了反射,是以網上大部分部落格都不太推薦使用,但是也算是個不錯的方式。

第二種情況呢是,A GameObject 和 B GameObject 是同級的,比如他們有共同的 Parent。這種情況下,筆者還是推薦用消息機制,不過不是 Unity 自帶的消息機制,而是自己實作的消息機制。

第三種情況是,A GameObject 和 B GameObject 不在同一個 GameObject 樹下。那麼這種情況很可能就是跨子產品通信了,這種情況下,還是推薦用消息機制。

是以,我們可以試試使用消息機制來解決我們的問題。

可是我們目前手裡沒有消息機制…

那就造一個吧。

消息機制要用到的知識: 1. List 或 LinkedList 或者自己實作的連結清單。 2. Dictionary 3. 委托

關于第一條,我們選擇 List 就好了,不過為了有更高的效率,我們最後會更新成連結清單。第三條,我們選擇 Action,因為這是我們接觸過的,以後也是用的比較多的。

而一般的消息機制會提供三個 API。 1. 注冊事件 2. 登出事件 3. 發送事件

我們先試着設計一下,假如我們想這樣使用我們的 API

MsgDispatcher
           

首先事件名,是一個字元串類型的,而事件名要對應一個委托。我們聲明一個靜态的字典變量就好了。

private 
           

為什麼是靜态的呢?因為,我們的消息機制呢不需要建立執行個體,而消息是要在整個項目内之間通信的,也就是全局的消息。全局的消息就需要放在唯一容器裡注冊。而這個容器就是我們的這個字典變量。

我們先實作注冊事件功能。

public 
           

非常簡單。

我們再實作登出功能。

public 
           

也非常簡單。

再實作發送功能。

public 
           

非常簡單。

第十二個示例代碼如下:

using 
           

菜單執行結果如下

unity menuitem_Unity 遊戲架構搭建 2019 (四十六) 簡易消息機制

哈哈哈,報錯啦,不過我們發現,第一次消息發送成功了,但是第二次發送的時候報錯了。是因為消息進行登出了,也就是字典裡沒有消息名了,這時候直接從字典裡取值當然會報錯。

這個問題我們留在下一篇解決,在下一篇,我們要講解關于這個消息機制的完善。

第十二個示例還沒有完成。

今天的内容就這些,我們下一篇再見,拜拜~

轉載請注明位址:涼鞋的筆記:liangxiegame.com

更多内容

  • QFramework 位址:https://github.com/liangxiegame/QFramework
  • QQ 交流群:623597263
  • Unity 進階小班
    • 主要訓練内容:
      • 架構搭建訓練(第一年)
      • 跟着案例學 Shader(第一年)
      • 副業的孵化(第二年、第三年)
    • 權益、授課形式等具體詳情請檢視《小班産品手冊》:https://liangxiegame.com/master/intro
  • 關注公衆号:liangxiegame 擷取第一時間更新通知及更多的免費内容。
unity menuitem_Unity 遊戲架構搭建 2019 (四十六) 簡易消息機制