// ------ 分发事件入口 public void dispatchEnqueue(MBaseEvent e) { lock (dispatchQueue) { dispatchQueue.Enqueue(e); } }
// ------ 每一帧都进行分发 void Update() { if (isDispatching) { MBaseEvent dispatchEvent = dispatchDequeue(); if (dispatchEvent != null) { // 队列为空时不分发 if (dispatchEvent.isBroadcast) { // 广播事件不需要考虑目标 foreach (List <BaseEventObject> dispatch in dispatchTable.Values) { foreach (BaseEventObject obj in dispatch) { if (obj.gameObject.activeSelf) { obj.EnqueueEvent(dispatchEvent); } } } } else { // 非广播事件需要取到目标对象表 //List<BaseEventObject> dispatch = dispatchTable.TryGetValue(dispatchEvent.dispatchTarget, out ); List <BaseEventObject> dispatch = dispatchTable[dispatchEvent.dispatchTarget]; if (dispatch != null) { foreach (BaseEventObject obj in dispatch) { obj.EnqueueEvent(dispatchEvent); } } } } } }
protected EventCenter eventCenter; // 事件分发中心引用 // ------ 事件进入缓冲队列 public void EnqueueEvent(MBaseEvent e) { lock (eventQueue) { eventQueue.Enqueue(e); if (e.needWakeUp && !gameObject.activeSelf) { setActive(true); } } }
// ------ 从缓冲队列中取事件 protected MBaseEvent DequeueEvent() { MBaseEvent result = null; lock (eventQueue) { if (eventQueue.Count > 0) { result = eventQueue.Dequeue(); } } return(result); }
// ------ 取分发事件出队 private MBaseEvent dispatchDequeue() { MBaseEvent result = null; lock (dispatchQueue) { if (dispatchQueue.Count > 0) { result = dispatchQueue.Dequeue(); } } return(result); }
void Update() { try { execute(); // 子类实现更新调用 MBaseEvent e = DequeueEvent(); // 取出一个待处理事件 if (e != null) { handleEvent(e); } } catch (Exception e) { Debug.LogError(e.StackTrace); } }
protected override void handleEvent(MBaseEvent e) { Debug.Log("1------收到方法,处理中...."); }
public abstract string getTagName(); // 获取当前子类对应的事件分发表键名 protected abstract void handleEvent(MBaseEvent e); // 事件处理方法,子类实现