/// <summary> /// 注册消息,必须实现接口IMsgReceiver /// </summary> public static void RegisterLogicMsg(this IMsgReceiver self, int msgName, Action <IMsgParam> callback = null) { if (msgName == 0) { return; } if (!mMsgHandlerDict.ContainsKey(msgName)) { mMsgHandlerDict[msgName] = new List <LogicMsgHandler>(); } List <LogicMsgHandler> handlers = mMsgHandlerDict[msgName]; int handlerCount = handlers.Count; // 防止重复注册 for (int i = 0; i < handlerCount; i++) { LogicMsgHandler handler = handlers[i]; if (handler.Receiver == self && handler.Callback == callback) { return; } } handlers.Add(new LogicMsgHandler(self, callback)); }
/// <summary> /// 发送消息,必须实现接口IMsgSender /// </summary> public static void SendLogicMsg(this IMsgSender sender, int msgName, IMsgParam paramList) { if (msgName == 0) { return; } if (!mMsgHandlerDict.ContainsKey(msgName)) { return; } List <LogicMsgHandler> handlers = mMsgHandlerDict[msgName]; int handlerCount = handlers.Count; // 之所以是从后向前遍历,是因为从前向后遍历删除后索引值会不断变化 for (int i = handlerCount - 1; i >= 0; i--) { LogicMsgHandler handler = handlers[i]; if (handler.Receiver != null) { handler.Callback(paramList); } else { handlers.Remove(handler); } } }
/// <summary> /// 注销消息,必须实现接口IMsgReceiver /// </summary> public static void UnRegisterLogicMsg(this IMsgReceiver self, int msgName, Action <IMsgParam> callback) { if (msgName == 0) { return; } List <LogicMsgHandler> handlers = mMsgHandlerDict[msgName]; for (int i = handlers.Count - 1; i >= 0; i--) { LogicMsgHandler handler = handlers[i]; if (handler.Receiver == self && handler.Callback == callback) { handlers.Remove(handler); break; } } }
/// <summary>注销消息 第三个参数 false = 只注销当前实例的注册 true = 注销全部实例注册的这个消息名称列表</summary> public static void CancelLogicMsg(this IMsgReceiver self, string msgName, bool isAll = false) { if (string.IsNullOrEmpty(msgName)) { Debug.Log("消息系统 【注销】:" + msgName + " is Null or Empty"); return; } if (!mMsgHandlerDict.ContainsKey(msgName)) { //QPrint.FrameworkWarn("SendMsg is UnRegister"); Debug.Log("消息系统 【注销】:" + msgName + " 此消息没有注册!"); return; } if (isAll == false) { if (mMsgHandlerDict.ContainsKey(msgName)) { var handlers = mMsgHandlerDict [msgName]; LogicMsgHandler mLogicMsgHandler = handlers.Find(s => s.receiver == self); if (mLogicMsgHandler != null) { handlers.Remove(mLogicMsgHandler); } else { Debug.Log("消息系统 【注销】:此消息没有找到 ==" + msgName); } } } else { if (mMsgHandlerDict.ContainsKey(msgName)) { mMsgHandlerDict.Remove(msgName); } } }