天天看點

Unity程式基礎架構(三)事件中心公共子產品

------------恢複内容開始------------

本篇文章隻是用來記錄學習的筆記,老師上課教授,筆記内容有複制拷貝網上的資料、筆記。

知識點: dictionary,委托,觀察者模式

作用:降低程式耦合性,減小程式複雜度

Unity程式基礎架構(三)事件中心公共子產品
Unity程式基礎架構(三)事件中心公共子產品

按照這張圖來建立4個腳本以及對象

Unity程式基礎架構(三)事件中心公共子產品

monster

player

task

other

将腳本挂載到對應的對象上

運作結果如下:

Unity程式基礎架構(三)事件中心公共子產品

問題:怪物死亡後,觸發另外三個腳本。如果還需要其他很多事件都在monster類中寫的話耦合性會很高(關聯性高,如果獎勵、任務、或者是怪物死亡腳本沒有寫好,就會互相影響到)

解決方法:引入事件中心的概念,由事件中心來處理收發事件。 之前在monster裡面,要調用各個不同腳本中的方法時,需要分别通路,而有了事件中心的時候,就隻需要通路事件中心的eventtrigger

Unity程式基礎架構(三)事件中心公共子產品
Unity程式基礎架構(三)事件中心公共子產品

事件中心代碼eventcenter

問題:在例如比如玩家死亡,怪物在玩家之後死亡,他仍要執行玩家裡的那個方法,這是不對的,是以玩家死亡的時候在記憶體裡不會真正消失,因為怪物跟玩家有所關聯,這就可能造成記憶體洩漏,應該怎麼做呢?

解答:要在destroy中移除事件

當對象銷毀時回執行ondestory生命周期函數,移除監聽事件。

某些時候忘記添加移除事件的函數,或者場景切換時出現問題時,監聽事件沒有移除幹淨,這時候就需要清空事件中心。

現在還有一個問題:當有多種怪物死亡時(多種觸發條件)無法具體判斷是哪種怪物進而導緻事件的混亂,

方法:為了解決這個問題,使用泛型委托。所有對象都是繼承于object,用object可以代替很多類型變量。雖然會有拆箱裝箱的消耗,但是這樣就可以通用。

eventcenter

問題:如果一個類沒有繼承monobehaviour 是沒有update函數的,但是如果這個類有一些事件需要每幀都執行,應該怎麼辦?

(unity中inspector面闆中的每一項都稱為元件,包括建立的腳本),該腳本是必須要繼承monobehaviour,否則無法添加為元件。

解決方案:

幀更新

​​單例模式基類​​

調用函數需要接口是以再建立一個供外部函數調用的類,繼承單例模式基類。

monomger管理monocontroller裡面的代碼

monomgr.cs

繼續閱讀