unity 反射實現簡易廣播系統 指令碼通訊

2021-08-17 02:38:59 字數 2209 閱讀 8285

unity自帶訊息通訊功能sendmessage效率比較低(當場景中的物件和指令碼元件比較多的時候),在幀裡面呼叫更是災難的.

試了c#的各種delegate, invoke,效果不好.

最終通過c#反射的方式寫了乙個訂閱廣播訊息系統.下面講解一下原理

1.反射:

看這裡 

2.觀察者模式:

看這裡 

執行流程

1.通過反射的方式獲取到物件的methodinfo

2.將物件和methodinfo封裝成observer整潔點,打包到list中,再放到乙個dictionary中備用

3.傳送訊息的時候從dictionary獲取到observer列表,反射呼叫即可,相信dictionary的查詢效率應該很高

在幾個小專案裡面試了一下,效果還不錯,對於不怎麼使用puremvc和ecs,喜歡簡單的同學來說還是比較適合的,直接上**吧

using system;

using system.collections;

using system.collections.generic;

using system.reflection;

using unityengine;

public class minibroadcast

methodinfo method = instance.gettype().getmethod(method_name, bindingflags.nonpublic | bindingflags.public | bindingflags.instance);

observer _observer = new observer();

_observer.method = method;

_observer.instance = instance;

m_method_info[key].add(_observer);

"regist observer success: instance:" + instance + " method:" + method);

}/**

* 註冊觀察者

* 靜態

*/ public void registlistener(string key, string method_name, type type)

methodinfo method = type.getmethod(method_name, bindingflags.nonpublic | bindingflags.public | bindingflags.static);

observer _observer = new observer();

_observer.method = method;

_observer.instance = null;

m_method_info[key].add(_observer);

}/**

* p_params:不定引數

*/public void breadcast(string key,params object p_params)

//反射呼叫(包括靜態方法)

list_list = new list();

//深度複製乙份,避免在反射執行過程中刪除觀察者出現錯誤

foreach (observer o in this.m_method_info[key])

foreach (observer o in _list)

}public void removelistener(string key, string method_name, object instance)

}if (_list.count == 0)

this.m_method_info.remove(key);

}public void cleanall()

private class observer

}

使用方法很簡單

1.直接放到專案下面

2.minibroadcast.instance.registlistener訂閱訊息

3. minibroadcast.instance.breadcast廣播訊息

4. minibroadcast.instance.removelistener取消訂閱

5. minibroadcast.instance.cleanall清除所有訂閱

後續還會放出attribute版本的,用法上面更加簡易,不需要主動訂閱

簡易oj系統實現

一 題目 某次考試一共八道題 a,b,c,d,e,f,g,h 每個人做的題都在對應的題號下有個數量標記,負數表示該學生在該題上有過的錯誤提交次數但到現在還沒有ac,正數表示ac所耗的時間,如果正數a跟上了一對括號,裡面有個正數b,則表示該學生ac了這道題,耗去了時間a,同時曾經錯誤提交了b次。例子可...

Php實現簡易購物商城系統

1 系統功能模組包括 1 登陸註冊模組 包括驗證碼 找回密碼。註冊模組中要使用ajax判斷使用者名稱是否已經存在,使用正規表示式判斷電子郵件 手機號和使用者密碼的格式是否合法。2 使用者管理模組 遊客 普通使用者和管理員 管理員多了新增 刪除 更改商品 更改訂單狀態的功能 3 分頁顯示商品資訊 能夠...

Unity中運用UDP廣播伺服器IP實現區域網聯機

這斷時間,涉及到區域網聯機遊戲,4臺遊戲機實現聯機,運用到了udp廣播功能。本來自己對這個完全沒接觸,不知道可以用udp,是同事有做過這個,在他的指導下,算是可以用了。只是執行後會卡死機器,網上查資料,加上自己的研究,總算是解決了,原因就是接收的udpclient在沒有收到廣播的情況下,一直阻塞,導...