事件监听器
事件类型
public enum BaseHEventType { GAME_OVER, GAME_WIN, PAUSE, ENERGY_EMEPTy, GAME_DATA }
事件基类
public class BaseHEvent { protected Hashtable m_arguments; protected BaseHEventType m_type; protected Object m_Sender; public IDictionary Params { get { return this.m_arguments; } set { this.m_arguments = (value as Hashtable); } } public BaseHEventType Type {//事件类型 构造函数会给Type 和Sender赋值 get { return this.m_type; } set { this.m_type = value; } } public Object Sender {//物体 get { return this.m_Sender; } set { this.m_Sender = value; } } public override string ToString() { return this.m_type + "[" + ((this.m_Sender == null) ? "null" : this.m_Sender.ToString()) + "]"; } /// <summary> /// 构造函数 /// </summary> /// <param name="type"> 事件类型 </param> /// <param name="sender"> 物体 </param> public BaseHEvent(BaseHEventType type, Object sender) { this.Type = type; Sender = sender; if (this.m_arguments == null) { this.m_arguments = new Hashtable(); Debug.LogError("this.m_arguments" + this.m_arguments.Count); } } public BaseHEvent (BaseHEventType type,Hashtable args,Object sender) { this.Type = type; this.m_arguments = args; Sender = sender; if (this.m_arguments == null) { this.m_arguments = new Hashtable(); } } public BaseHEvent Clone() { return new BaseHEvent(this.m_type, this.m_arguments, Sender); } }
事件机制
public delegate void HEventListenerDelegate(BaseHEvent hEvent);//定义委托用于传事件基类 public class HEventDispatcher { static HEventDispatcher Instance; public static HEventDispatcher GetInstance()//单利 { if (Instance == null) { Instance = new HEventDispatcher(); } return Instance; } private Hashtable listeners = new Hashtable(); //掌控所有类型的委托事件 public void AddEventListener(BaseHEventType type,HEventListenerDelegate listener) { HEventListenerDelegate hEventListenerDelegate = this.listeners[type] as HEventListenerDelegate;//获得之前这个类型的委托 如果第一次等于Null hEventListenerDelegate = (HEventListenerDelegate) Delegate.Combine(hEventListenerDelegate, listener);//将两个委托的调用列表连接在一起,成为一个新的委托 this.listeners[type] = hEventListenerDelegate;//赋值给哈希表中的这个类型 } public void RemoveEventListener(BaseHEventType type, HEventListenerDelegate listener) { HEventListenerDelegate hEventListener = this.listeners[type] as HEventListenerDelegate;//获得之前这个类型的委托 如果第一次等于Null if (hEventListener != null) { hEventListener =(HEventListenerDelegate)Delegate.Remove(hEventListener, listener);//从hEventListener的调用列表中移除listener this.listeners[type] = hEventListener;//赋值给哈希表中的这个类型 } } public void DispatchEvent(BaseHEvent baseH) { HEventListenerDelegate hEventListener = this.listeners[baseH.Type] as HEventListenerDelegate; if (hEventListener != null) { try { hEventListener(baseH);//执行委托 } catch (Exception e) { throw new System.Exception(string.Concat(new string[] { "Error Dispatch event", baseH.Type.ToString(), ":", e.Message, " ", e.StackTrace }), e); } } } public void RemoveAll() { this.listeners.Clear(); } }
调用方法 下面是我在Unity当中调用的
//注册/添加事件 void Start() { HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA,StartHEvent); HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA, StartDataEvent); HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_WIN,StopHEvent); } //事件分发 void Update() { if (Input.GetKeyDown(KeyCode.A)) { HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_DATA, this)); } if (Input.GetKeyDown(KeyCode.S)) { HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_WIN, this)); } } //事件移除 private void OnDestroy() { HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_DATA, StartHEvent); HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_WIN, StopHEvent); } //添加事件方法 void StartDataEvent(BaseHEvent hEvent) { Debug.Log("Doule" +hEvent.ToString()); } void StartHEvent(BaseHEvent hEvent) { Debug.Log("StartHEvent + HEvent" + hEvent.ToString()); } void StopHEvent(BaseHEvent hEvent) { Debug.Log("StopHEvent + HEvent" + hEvent.ToString()); }
来源:https://www.cnblogs.com/Aaron-Han/p/12017711.html