
在上一篇,我們接觸了單例,使用單例解決了我們腳本之間通路的問題。
腳本之間通路其實有更好的方式。
我們先分下腳本通路腳本的幾種形式。
第一種,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
菜單執行結果如下
哈哈哈,報錯啦,不過我們發現,第一次消息發送成功了,但是第二次發送的時候報錯了。是因為消息進行登出了,也就是字典裡沒有消息名了,這時候直接從字典裡取值當然會報錯。
這個問題我們留在下一篇解決,在下一篇,我們要講解關于這個消息機制的完善。
第十二個示例還沒有完成。
今天的内容就這些,我們下一篇再見,拜拜~
轉載請注明位址:涼鞋的筆記:liangxiegame.com
更多内容
- QFramework 位址:https://github.com/liangxiegame/QFramework
- QQ 交流群:623597263
- Unity 進階小班 :
- 主要訓練内容:
- 架構搭建訓練(第一年)
- 跟着案例學 Shader(第一年)
- 副業的孵化(第二年、第三年)
- 權益、授課形式等具體詳情請檢視《小班産品手冊》:https://liangxiegame.com/master/intro
- 主要訓練内容:
- 關注公衆号:liangxiegame 擷取第一時間更新通知及更多的免費内容。