通過C#使用Advanced CSharp Messenger

轉載:雨鬆MOMO 2013年03月25日 於 雨鬆MOMO程序研究院 發表

Advanced CSharp Messenger 屬於C#事件的一種。 維基百科中由詳細的說明http://wiki.unity3d.com/index.php?title=Advanced_CSharp_Messenger 上週的一天剛巧有朋友問到我這一塊的知識,那麼我研究出來將它貼在博客中,幫助了他也幫助我自己!哇咔咔。

Advanced CSharp Messenger的特點可以將遊戲對象做爲參數發送。到底Advanced CSharp Messenger有什麼用呢?先創建一個立方體對象,然後把Script腳本綁定在這個對象中。腳本中有一個方法叫DoSomething()。寫一段簡單的代碼,通常我們在調用方法的時候需要這樣來寫。

 

代碼比較簡單,我就不註釋了。 原理就是先獲取遊戲對象,接着獲取腳本組件對象,最後通過腳本組件對象去調用對應腳本中的方法,這樣的調用方法我們稱之爲直接調用。

這個例子中我只調用了一個對象的方法,如果說有成千上萬個對象,那麼這樣調用是不是感覺自己的代碼非常的醜?因爲你需要一個一個的獲取對象然後獲取腳本組件然後在調用方法。。。。。 (想想都恐怖!!)

下面我們在用Advanced CSharp Messenger來實現事件的調用。按照維基百科中首先把Message.cs 和Callback.cs拷貝在你的工程中。

CallBack.cs

 Message.cs

 然後就可以開始使用了,Messager.Broadcast()這樣就好比我們發送了一條廣播。

 在需要這條廣播的類中來接受它,同樣是剛剛說的Script類。接受廣播的標誌是 Messager.AddListener()參數1表示廣播的名稱,參數2表示廣播所調用的方法。

 這樣一來,只要發送名稱爲”Send”的方法,就可以在別的類中接收它了。

我們在說說如何通過廣播來傳遞參數,這也是那天那個哥們主要問我的問題。(其實是維基百科上寫的不是特別特別的清楚,那哥們誤解了)在Callback中可以看出參數最多可以是三個,參數的類型是任意類型,也就是說我們不僅能傳遞 int float bool 還能傳遞gameObject類型。

如下所示,發送廣播的時候傳遞了兩個參數,參數1是一個遊戲對象,參數2是一個int數值。

 然後是接受的地方 參數用<>存在一起。遊戲對象也可以完美的傳遞。

 

如果傳遞一個參數<T>

兩個參數<T,T>

三個參數<T,T,T>   

怎麼樣使用起來還是挺簡單的吧?

我覺得項目中最好不要大量的使用代理事件這類的方法(根據需求而定),雖然可以讓你的代碼非常的簡潔,但是它的效率不高大概比直接調用慢5-倍左右吧,就好比美好的東西一定都有瑕疵一樣。 還記得Unity自身也提供了一種發送消息的方法嗎?,用過的都知道效率也非常低下,雖然我們看不到它具體實現的源碼是如何實現的,但是我覺得原理可能也是這樣的。 歡迎和大家一起討論與學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章