Example #1
0
        public void UnregisterAllHandlersBelongToModule(MessageProcessUnitBase module)
        {
            if (module != null)
            {
                if (moduleMessageRegisterTable != null)
                {
                    Dictionary <Type, MessageHandler> handlerTable;
                    if (moduleMessageRegisterTable.TryGetValue(module, out handlerTable))
                    {
                        if (messageHandlerTable != null)
                        {
                            foreach (KeyValuePair <Type, MessageHandler> handlerKV in handlerTable)
                            {
                                if (!messageHandlerTableLocked)
                                {
                                    CollectionUtil.RemoveFromTable(handlerKV.Key, handlerKV.Value, messageHandlerTable);
#if UNITY_EDITOR
                                    if (LogUtil.ShowDebug != null)
                                    {
                                        LogUtil.ShowDebug(string.Format("[本地消息中心]2.注销消息处理器:来自[{0}] 消息类型[{1}] 处理回调[{2}]", module.GetType().Name, handlerKV.Key.Name, StringUtility.ToString(handlerKV.Value.Handler)));
                                    }
#endif
                                }
                                else
                                {
                                    RegisterModifier modifier = pool.Aquire();
                                    modifier.isUnregister   = true;
                                    modifier.messageType    = handlerKV.Key;
                                    modifier.messageHandler = handlerKV.Value;
                                    modifier.module         = module;
                                    if (messageHandlerRegisterChangeCache == null)
                                    {
                                        messageHandlerRegisterChangeCache = new List <RegisterModifier>();
                                    }
                                    messageHandlerRegisterChangeCache.Add(modifier);
                                }
                            }
                        }
                        moduleMessageRegisterTable.Remove(module);
                    }
                }
            }
#if UNITY_EDITOR
            else
            {
                if (LogUtil.ShowError != null)
                {
                    LogUtil.ShowError(string.Format("注销消息处理器时传递的参数有[null]值:模块[{0}]", StringUtility.ToString(module)));
                }
            }
#endif
        }
Example #2
0
 public void Return(RegisterModifier item)
 {
     if (item == null)
     {
         return;
     }
     if (queue == null)
     {
         queue = new Queue <RegisterModifier>();
     }
     item.isUnregister   = false;
     item.messageType    = null;
     item.messageHandler = null;
     item.module         = null;
     queue.Enqueue(item);
 }
Example #3
0
        public void RegisterHandler(MessageProcessUnitBase module, MessageHandlerDelegate handler, Type msgType)
        {
            if (!typeof(IMessage).IsAssignableFrom(msgType))
            {
                if (LogUtil.ShowError != null)
                {
                    LogUtil.ShowError(string.Format("消息结构体[{0}]没有实现IMessage接口", msgType.Name));
                }
                return;
            }
#endif
#if UNITY_EDITOR
            if (!msgType.IsValueType)
            {
                if (LogUtil.ShowError != null)
                {
                    LogUtil.ShowError(string.Format("消息结构体[{0}]必须定义为值类型(struct)", msgType.Name));
                }
                return;
            }
            object[] fieldsDefined = msgType.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            if (fieldsDefined.Length <= 0)
            {
                if (LogUtil.ShowError != null)
                {
                    LogUtil.ShowError(string.Format("消息结构体[{0}]中没有定义任何成员,如果不需要向外通知任何参数的话,使用Notification", msgType.Name));
                }
                return;
            }
#endif
            if (module != null && handler != null)
            {
                MessageHandler messageHandler = new MessageHandler(msgType, handler);
                if (!messageHandlerTableLocked)
                {
                    if (messageHandlerTable == null)
                    {
                        messageHandlerTable = new Dictionary <Type, List <MessageHandler> >();
                    }
                    CollectionUtil.AddIntoTable(msgType, messageHandler, messageHandlerTable);
#if UNITY_EDITOR
                    if (LogUtil.ShowDebug != null)
                    {
                        LogUtil.ShowDebug(string.Format("[本地消息中心]1.注册消息处理器:来自[{0}] 消息类型[{1}] 处理回调[{2}]", module.GetType().Name, msgType.Name, StringUtility.ToString(handler)));
                    }
#endif
                }
                else
                {
                    RegisterModifier modifier = pool.Aquire();
                    modifier.isUnregister   = false;
                    modifier.messageType    = msgType;
                    modifier.messageHandler = messageHandler;
                    modifier.module         = module;
                    if (messageHandlerRegisterChangeCache == null)
                    {
                        messageHandlerRegisterChangeCache = new List <RegisterModifier>();
                    }
                    messageHandlerRegisterChangeCache.Add(modifier);
                }
                if (moduleMessageRegisterTable == null)
                {
                    moduleMessageRegisterTable = new Dictionary <MessageProcessUnitBase, Dictionary <Type, MessageHandler> >();
                }
                CollectionUtil.AddIntoTable(module, msgType, messageHandler, moduleMessageRegisterTable);
            }
#if UNITY_EDITOR
            else
            {
                if (LogUtil.ShowError != null)
                {
                    LogUtil.ShowError(string.Format("注册消息处理器时传递的参数有[null]值:消息类型[{0}] 模块[{1}] 处理回调[{2}]",
                                                    msgType.Name, StringUtility.ToString(module), StringUtility.ToString(handler)));
                }
            }
#endif
        }
Example #4
0
        public void DeliverMessage(IMessage msg)
#endif
        {
            if (msg != null)
            {
                //msg.TimeStamp = DateTimeUtil.NowMillisecond;
                if (messageHandlerTable != null)
                {
                    messageHandlerTableLocked = true;
                    List <MessageHandler> handlers;
                    if (messageHandlerTable.TryGetValue(msg.GetType(), out handlers))
                    {
                        foreach (MessageHandler handler in handlers)
                        {
                            Invoke(handler, msg);
                        }
                    }
                    messageHandlerTableLocked = false;
                    // 如果在消息处理的过程中有生成新的消息处理器或者销毁老的处理器,那么这些操作都被挂起并缓存到了列表里,下面要对这个缓存列表做处理
                    if (messageHandlerRegisterChangeCache != null && messageHandlerRegisterChangeCache.Count > 0)
                    {
                        for (int i = 0; i < messageHandlerRegisterChangeCache.Count; ++i)
                        {
                            RegisterModifier modifier = messageHandlerRegisterChangeCache[i];
                            if (modifier.isUnregister)
                            {
                                CollectionUtil.RemoveFromTable(modifier.messageType, modifier.messageHandler, messageHandlerTable);
#if UNITY_EDITOR
                                if (LogUtil.ShowDebug != null)
                                {
                                    LogUtil.ShowDebug(string.Format("[本地消息中心]2.注销消息处理器:来自[{0}] 消息类型[{1}] 处理回调[{2}]", modifier.module.GetType().Name, modifier.messageType.Name, StringUtility.ToString(modifier.messageHandler.Handler)));
                                }
#endif
                            }
                            else
                            {
                                if (messageHandlerTable == null)
                                {
                                    messageHandlerTable = new Dictionary <Type, List <MessageHandler> >();
                                }
                                CollectionUtil.AddIntoTable(modifier.messageType, modifier.messageHandler, messageHandlerTable);
#if UNITY_EDITOR
                                if (LogUtil.ShowDebug != null)
                                {
                                    LogUtil.ShowDebug(string.Format("[本地消息中心]1.注册消息处理器:来自[{0}] 消息类型[{1}] 处理回调[{2}]", modifier.module.GetType().Name, modifier.messageType.Name, StringUtility.ToString(modifier.messageHandler.Handler)));
                                }
#endif
                            }
                            pool.Return(modifier);
                        }
                        messageHandlerRegisterChangeCache.Clear();
                    }
                }
            }
#if UNITY_EDITOR
            else
            {
                if (LogUtil.ShowError != null)
                {
                    LogUtil.ShowError(string.Format("发送消息时传递的参数有[null]值:消息[{0}]", StringUtility.ToString(msg)));
                }
            }
#endif
        }