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在沒有收到廣播的情況下,一直阻塞,導...