當前位置:網站首頁>基於Unity3d SendMessage實現事件管理器
基於Unity3d SendMessage實現事件管理器
2022-01-27 22:15:21 【蝦米神探】
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Game
{
public string name;
public GameObject listener;
public string func;
}
// 事件派發器
public class EventDispatcher : MonoBehaviour
{
private Hashtable _listeners = new Hashtable();
public static EventDispatcher Instance;
void Awake()
{
Instance = this;
}
void OnDestroy()
{
Instance = null;
_listeners.Clear();
}
//檢查事件類型是否添加
private bool checkForEvent(string eventType)
{
if (_listeners.ContainsKey(eventType))
{
return true;
}
return false;
}
//檢查監聽者
private bool checkForListener(string eventType, GameObject listener,string func)
{
if (!checkForEvent(eventType))
{
recordEvent(eventType);
}
ArrayList listenerList = _listeners[eventType] as ArrayList;
foreach (EventListener callback in listenerList)
{
if (string.Equals(callback.name, (listener.GetInstanceID().ToString() + "_" + func)))
return true;
}
return false;
}
//添加事件
private bool recordEvent(string eventType)
{
if (!checkForEvent(eventType))
{
_listeners.Add(eventType, new ArrayList());
}
return true;
}
// 添加監聽者(保存名字為監聽者_func)
private bool recordListener(string eventType, GameObject listener, string func)
{
if (!checkForListener(eventType, listener, func))
{
ArrayList listenerList = _listeners[eventType] as ArrayList;
EventListener callback = new EventListener();
callback.name = listener.GetInstanceID().ToString() + "_" + func;
callback.listener = listener;
callback.func = func;
listenerList.Add(callback);
return true;
}
else
{
return false;
}
}
public bool AddListener(string eventType,GameObject listener,string func)
{
if (listener == null && eventType == null)
{
return false;
}
return recordListener(eventType, listener, func);
}
public bool RemoveListener(string eventType, GameObject listener, string func = null)
{
if (func == null)
{
return removeEventListener(eventType, listener);
}
else
{
return removeEventListener(eventType, listener, func);
}
}
public void RemoveAllListener(GameObject listener)
{
removeAllEventListeners(listener);
}
//發送事件
public void SendEvent(EventBase ev)
{
string eventType = ev.type;
if (!checkForEvent(eventType))
{
return;
}
ArrayList listenerList = _listeners[eventType] as ArrayList;
for (int i = 0; i < listenerList.Count; ++i)
{
EventListener callback = GetEventListener(eventType, i);
if (callback != null)
{
if (callback.listener && callback.listener.activeSelf)
{
callback.listener.SendMessage(callback.func, ev, SendMessageOptions.DontRequireReceiver);
}
}
}
}
//
private bool removeEventListener(string eventType, GameObject listener)
{
if (!checkForEvent(eventType)) return false;
ArrayList listenerList = _listeners[eventType] as ArrayList;
foreach (EventListener callback in listenerList)
{
if (string.Equals(callback.name,listener.GetInstanceID().ToString()))
{
listenerList.Remove(callback);
return true;
}
}
return false;
}
// 移除事件監聽器
private bool removeEventListener(string eventType, GameObject listener, string func)
{
if (!checkForEvent(eventType)) return false;
ArrayList listenerList = _listeners[eventType] as ArrayList;
foreach (EventListener callback in listenerList)
{
if (string.Equals(callback.name,(listener.GetInstanceID().ToString() + "_" + func)))
{
listenerList.Remove(callback);
return true;
}
}
return false;
}
// 移除所有事件監聽器
private void removeAllEventListeners(GameObject listener)
{
foreach (EventListener callback in _listeners)
{
if (string.Equals(callback.listener.GetInstanceID().ToString(),listener.GetInstanceID().ToString()))
{
_listeners.Remove(callback);
}
}
}
private EventListener GetEventListener(string _EventType,int _index)
{
ArrayList listenerList = _listeners[_EventType] as ArrayList;
for (int i = 0; i < listenerList.Count; ++i)
{
if (i == _index)
{
return (EventListener)listenerList[i];
}
}
return null;
}
//測試;
public void Update()
{
if (Input.GetMouseButtonDown(1))
{
TestEvent e = new TestEvent();
e.type = "test";
e.test = "test99999";
Instance.SendEvent(e);
Debug.Log("test");
}
}
public void Start()
{
Test();
}
public void Test()
{
Instance.AddListener("test",this.gameObject, "CallBack");
}
public void CallBack(EventBase e)
{
//Debug.Log("CallBack1");
TestEvent t = (TestEvent)e;
Debug.Log("CallBack1 = " + t.test);
//Instance.removeEventListener("test", this.gameObject, "CallBack2");
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Game
{
//事件監聽管理器
internal class EventListener{
public string name;
public GameObject listener;
public string func;
}
// 事件派發器
public class EventDispatcher : MonoBehaviour
{
private Hashtable _listeners = new Hashtable();
public static EventDispatcher Instance;
void Awake()
{
Instance = this;
}
void OnDestroy()
{
Instance = null;
_listeners.Clear();
}
//檢查事件類型是否添加
private bool checkForEvent(string eventType)
{
if (_listeners.ContainsKey(eventType))
{
return true;
}
return false;
}
//檢查監聽者
private bool checkForListener(string eventType, GameObject listener,string func)
{
if (!checkForEvent(eventType))
{
recordEvent(eventType);
}
ArrayList listenerList = _listeners[eventType] as ArrayList;
foreach (EventListener callback in listenerList)
{
if (string.Equals(callback.name, (listener.GetInstanceID().ToString() + "_" + func)))
return true;
}
return false;
}
//添加事件
private bool recordEvent(string eventType)
{
if (!checkForEvent(eventType))
{
_listeners.Add(eventType, new ArrayList());
}
return true;
}
// 添加監聽者(保存名字為監聽者_func)
private bool recordListener(string eventType, GameObject listener, string func)
{
if (!checkForListener(eventType, listener, func))
{
ArrayList listenerList = _listeners[eventType] as ArrayList;
EventListener callback = new EventListener();
callback.name = listener.GetInstanceID().ToString() + "_" + func;
callback.listener = listener;
callback.func = func;
listenerList.Add(callback);
return true;
}
else
{
return false;
}
}
public bool AddListener(string eventType,GameObject listener,string func)
{
if (listener == null && eventType == null)
{
return false;
}
return recordListener(eventType, listener, func);
}
public bool RemoveListener(string eventType, GameObject listener, string func = null)
{
if (func == null)
{
return removeEventListener(eventType, listener);
}
else
{
return removeEventListener(eventType, listener, func);
}
}
public void RemoveAllListener(GameObject listener)
{
removeAllEventListeners(listener);
}
//發送事件
public void SendEvent(EventBase ev)
{
string eventType = ev.type;
if (!checkForEvent(eventType))
{
return;
}
ArrayList listenerList = _listeners[eventType] as ArrayList;
for (int i = 0; i < listenerList.Count; ++i)
{
EventListener callback = GetEventListener(eventType, i);
if (callback != null)
{
if (callback.listener && callback.listener.activeSelf)
{
callback.listener.SendMessage(callback.func, ev, SendMessageOptions.DontRequireReceiver);
}
}
}
}
//
private bool removeEventListener(string eventType, GameObject listener)
{
if (!checkForEvent(eventType)) return false;
ArrayList listenerList = _listeners[eventType] as ArrayList;
foreach (EventListener callback in listenerList)
{
if (string.Equals(callback.name,listener.GetInstanceID().ToString()))
{
listenerList.Remove(callback);
return true;
}
}
return false;
}
// 移除事件監聽器
private bool removeEventListener(string eventType, GameObject listener, string func)
{
if (!checkForEvent(eventType)) return false;
ArrayList listenerList = _listeners[eventType] as ArrayList;
foreach (EventListener callback in listenerList)
{
if (string.Equals(callback.name,(listener.GetInstanceID().ToString() + "_" + func)))
{
listenerList.Remove(callback);
return true;
}
}
return false;
}
// 移除所有事件監聽器
private void removeAllEventListeners(GameObject listener)
{
foreach (EventListener callback in _listeners)
{
if (string.Equals(callback.listener.GetInstanceID().ToString(),listener.GetInstanceID().ToString()))
{
_listeners.Remove(callback);
}
}
}
private EventListener GetEventListener(string _EventType,int _index)
{
ArrayList listenerList = _listeners[_EventType] as ArrayList;
for (int i = 0; i < listenerList.Count; ++i)
{
if (i == _index)
{
return (EventListener)listenerList[i];
}
}
return null;
}
//測試;
public void Update()
{
if (Input.GetMouseButtonDown(1))
{
TestEvent e = new TestEvent();
e.type = "test";
e.test = "test99999";
Instance.SendEvent(e);
Debug.Log("test");
}
}
public void Start()
{
Test();
}
public void Test()
{
Instance.AddListener("test",this.gameObject, "CallBack");
}
public void CallBack(EventBase e)
{
//Debug.Log("CallBack1");
TestEvent t = (TestEvent)e;
Debug.Log("CallBack1 = " + t.test);
//Instance.removeEventListener("test", this.gameObject, "CallBack2");
}
}
}
版權聲明
本文為[蝦米神探]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201272215209012.html
邊欄推薦
猜你喜歡
-
ScheduledExecutorService scheduleAtFixedRate、scheduleWithFixedDelay以及創建定時心跳
-
LVS負載均衡集群(NAT模式)
-
常見消費電子設備接口總結
-
軟件測試周刊(第47期):要愛具體的人,不要愛抽象的人;要愛生活,不要愛生活的意義。
-
73.網絡安全滲透測試—[SQL注入篇12]—[SQLSEVER+ASP-視圖查詢報錯注入]
-
Openstack實驗之nova服務的安裝與配置
-
win7系統上將電腦變為熱點的辦法
-
Jedis連接阿裏雲redis
-
APP違法使用個人信息?不用怕,華為雲VSS為你保駕護航
-
基於STL的演講比賽流程管理系統
隨機推薦
- 藍橋杯第三講--二分【習題】
- 地址的地址?
- 百度地圖開發-搭建基礎脚手架 01
- Qt給靜態屏保加上粒子特效
- php獲取gmt時間及時區修改
- lnmp 三之haproxy的使用
- Alink & FlinkMLlib 文章匯總
- cesium導入旋轉動畫
- QGC雜記
- NoNodeAvailableException[None of the configured nodes are available: [{#transport#-1}····
- CISP——關於網絡安全法(分享筆記)
- 通過ReentrantLock源碼看AQS源碼實現
- 記錄在appA裏面打開appB進行登錄,再次點擊桌面圖標appB避免再次重新啟動程序的解决辦法
- 自建Kubernetes的LoadBalancer類型服務方案-MetalLB
- 解决延遲有 Wi-Fi 6 就够了!(家裏的 Wi)
- JS中的forEach()和map()方法介紹
- 【Unity Shader】HDRP下Amplify Shader Editor透明物體排序不正確
- yum -bash: /usr/bin/yum: /usr/bin/: bad interpreter: Permission denied
- 惡意軟件分析實戰20-內核級軟件逆向Lab10-2
- 百度BML-飛槳服務器以及Jetson nano部署實戰案例(下)
- 220121--測試用例
- 北京大學2022年對元宇宙的全球研究報告
- 網上期貨開戶安全麼?期貨開戶准備什麼資料?
- [渝粵教育] 華中農業大學 經濟學原理 參考 資料
- 查看多臺jps的脚本
- #全網寒假最火特輯# 【第一章】 C語言之牛客網刷題筆記 【點進來保證讓知識充實你一整個寒假】
- 雲演 CTF Web題型 lfi 文件包含
- 【leectode 2022.1.22】批量處理任務
- IC驗證中的force/release 學習整理(4)後門訪問機制成與敗(續)
- 數學建模-模糊綜合評價法(評價模型)
- Vulnhub靶機recon: 1滲透
- DWR异常:org.xml.sax.SAXException
- 亞線性的近似最小支撐樹
- JDBC編碼六步走
- ZZULIOJ 1173: 密碼解密(指針專題)
- 143. 重排鏈錶
- 掃雷初階版
- [渝粵教育] 東南大學 工程熱力學 參考 資料
- 如何將PDF轉換成Word文檔?試試這款PDF轉Word工具—PDF to Word OCR
- Redis 是如何處理命令的(客戶端)