查看: 1518|回复: 1
打印 上一主题 下一主题

[其他] 消息机制相关代码地址

[复制链接]

63

主题

0

听众

1539

积分

助理设计师

自定义头衔

Rank: 4

纳金币
149
精华
0

优秀版主 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2016-8-22 15:52:22 |只看该作者 |倒序浏览
1、IMsgReceiver.cs

using UnityEngine;
using System.Collections;
namespace QFramework.Event {
        public interface IMsgReceiver  {
        }
}

2、IMsgReceiver.cs.meta

fileFormatVersion: 2
guid: 2f3fb1f60e8d54abf8cfc00457144456
timeCreated: 1465056425
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:

3、IMsgSender.cs

using UnityEngine;
using System.Collections;
namespace QFramework.Event {
        public interface IMsgSender  {
        }
}


4、IMsgSender.cs.meta

fileFormatVersion: 2
guid: fb4f40f1d1e914022a708cfeaec95cd1
timeCreated: 1465056639
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:

5、QMsgDispatcher.cs.meta

fileFormatVersion: 2
guid: eabc1f17069f64f8bb6b47708cfca98f
timeCreated: 1465053562
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
个人:签名
回复

使用道具 举报

63

主题

0

听众

1539

积分

助理设计师

自定义头衔

Rank: 4

纳金币
149
精华
0

优秀版主 荣誉管理 论坛元老

沙发
发表于 2016-8-22 15:53:01 |只看该作者
QMsgDispatcher.cs

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

namespace QFramework.Event {

        public enum QMsgChannel {
                Global,        // 全局
                UI,
                Logic,
        }

        /// <summary>
        /// 消息分发器
        /// C# this扩展 需要静态类
        /// </summary>
        public static class QMsgDispatcher  {

                /// <summary>
                /// 消息捕捉器
                /// </summary>
                class QMsgHandler {

                        public IMsgReceiver receiver;
                        public  VoidDelegate.WithParams callback;

                        /*
                         * VoidDelegate.WithParams 是一种委托 ,定义是这样的
                         *
                         *  public class VoidDelegate{
                         *          public delegate void WithParams(params object[] paramList);
                         *  }
                         */
                        public QMsgHandler(IMsgReceiver receiver,VoidDelegate.WithParams callback)
                        {
                                this.receiver = receiver;
                                this.callback = callback;
                        }
                }
                       
                /// <summary>
                /// 每个消息名字维护一组消息捕捉器。
                /// </summary>
                static Dictionary<QMsgChannel,Dictionary<string,List<QMsgHandler>>> mMsgHandlerDict = new Dictionary<QMsgChannel,Dictionary<string,List<QMsgHandler>>> ();
       
                /// <summary>
                /// 注册消息,
                /// 注意第一个参数,使用了C# this的扩展,
                /// 所以只有实现IMsgReceiver的对象才能调用此方法
                /// </summary>
                public static void RegisterGlobalMsg(this IMsgReceiver self, string msgName,VoidDelegate.WithParams callback)
                {
                        // 略过
                        if (string.IsNullOrEmpty(msgName)) {
                                Debug.LogError("RegisterMsg:" + msgName + " is Null or Empty");
                                return;
                        }

                        // 略过
                        if (null == callback) {
                                Debug.LogError ("RegisterMsg:" + msgName + " callback is Null");
                                return;
                        }
                               
                        // 添加消息通道
                        if (!mMsgHandlerDict.ContainsKey (QMsgChannel.Global)) {
                                mMsgHandlerDict [QMsgChannel.Global] = new Dictionary<string, List<QMsgHandler>> ();
                        }

                        // 略过
                        if (!mMsgHandlerDict[QMsgChannel.Global].ContainsKey (msgName)) {
                                mMsgHandlerDict[QMsgChannel.Global] [msgName] = new List<QMsgHandler> ();
                        }

                        // 看下这里
                        var handlers = mMsgHandlerDict [QMsgChannel.Global][msgName];

                        // 略过
                        // 防止重复注册
                        foreach (var handler in handlers) {
                                if (handler.receiver == self && handler.callback == callback) {
                                        Debug.LogWarning ("RegisterMsg:" + msgName + " ayready Register");
                                        return;
                                }
                        }

                        // 再看下这里
                        handlers.Add (new QMsgHandler (self, callback));
                }
                       
                /// <summary>
                /// 注册消息,
                /// 注意第一个参数,使用了C# this的扩展,
                /// 所以只有实现IMsgReceiver的对象才能调用此方法
                /// </summary>
                public static void RegisterMsgByChannel(this IMsgReceiver self, QMsgChannel channel,string msgName,VoidDelegate.WithParams callback)
                {
                        // 略过
                        if (string.IsNullOrEmpty(msgName)) {
                                Debug.LogError("RegisterMsg:" + msgName + " is Null or Empty");
                                return;
                        }

                        // 略过
                        if (null == callback) {
                                Debug.LogError ("RegisterMsg:" + msgName + " callback is Null");
                                return;
                        }

                        // 添加消息通道
                        if (!mMsgHandlerDict.ContainsKey (channel)) {
                                mMsgHandlerDict [channel] = new Dictionary<string, List<QMsgHandler>> ();
                        }

                        // 略过
                        if (!mMsgHandlerDict[channel].ContainsKey (msgName)) {
                                mMsgHandlerDict[channel] [msgName] = new List<QMsgHandler> ();
                        }

                        // 看下这里
                        var handlers = mMsgHandlerDict [channel][msgName];

                        // 略过
                        // 防止重复注册
                        foreach (var handler in handlers) {
                                if (handler.receiver == self && handler.callback == callback) {
                                        Debug.LogWarning ("RegisterMsg:" + msgName + " ayready Register");
                                        return;
                                }
                        }

                        // 再看下这里
                        handlers.Add (new QMsgHandler (self, callback));
                }


                /// <summary>
                /// 其实注销消息只需要Object和Go就足够了 不需要callback
                /// </summary>
                public static void UnRegisterGlobalMsg(this IMsgReceiver self,string msgName)
                {
                        if (CheckStrNullOrEmpty (msgName)) {
                                return;
                        }
                               
                        if (!mMsgHandlerDict.ContainsKey (QMsgChannel.Global)) {
                                Debug.LogError ("Channel:" + QMsgChannel.Global.ToString() + " doesn't exist");
                                return;                       
                        }

                        var handlers = mMsgHandlerDict[QMsgChannel.Global] [msgName];

                        int handlerCount = handlers.Count;

                        // 删除List需要从后向前遍历
                        for (int index = handlerCount - 1; index >= 0; index--) {
                                var handler = handlers [index];
                                if (handler.receiver == self) {
                                        handlers.Remove (handler);
                                        break;
                                }
                        }
                }

                /// <summary>
                /// 其实注销消息只需要Object和Go就足够了 不需要callback
                /// </summary>
                public static void UnRegisterMsgByChannel(this IMsgReceiver self,QMsgChannel channel,string msgName)
                {
                        if (CheckStrNullOrEmpty (msgName)) {
                                return;
                        }

                        if (!mMsgHandlerDict.ContainsKey (channel)) {
                                Debug.LogError ("Channel:" + channel.ToString () + " doesn't exist");
                                return;                       
                        }

                        var handlers = mMsgHandlerDict[channel] [msgName];

                        int handlerCount = handlers.Count;

                        // 删除List需要从后向前遍历
                        for (int index = handlerCount - 1; index >= 0; index--) {
                                var handler = handlers [index];
                                if (handler.receiver == self) {
                                        handlers.Remove (handler);
                                        break;
                                }
                        }
                }

                       
                static bool CheckStrNullOrEmpty(string str)
                {
                        if (string.IsNullOrEmpty (str)) {
                                Debug.LogWarning ("str is Null or Empty");
                                return true;
                        }
                        return false;
                }

                static bool CheckDelegateNull(VoidDelegate.WithParams callback)
                {
                        if (null == callback) {
                                Debug.LogWarning ("callback is Null");

                                return true;
                        }
                        return false;
                }

                /// <summary>
                /// 发送消息
                /// 注意第一个参数
                /// </summary>
                public static void SendGlobalMsg(this IMsgSender sender, string msgName,params object[] paramList)
                {
                        if (CheckStrNullOrEmpty (msgName)) {
                                return;
                        }

                        if (!mMsgHandlerDict.ContainsKey (QMsgChannel.Global)) {
                                Debug.LogError ("Channel:" + QMsgChannel.Global.ToString() + " doesn't exist");
                                return;
                        }
                               
                        // 略过,不用看
                        if (!mMsgHandlerDict[QMsgChannel.Global].ContainsKey(msgName)){
                                Debug.LogError("SendMsg is UnRegister");
                                return;
                        }

                        // 开始看!!!!
                        var handlers = mMsgHandlerDict[QMsgChannel.Global][msgName];

                        var handlerCount = handlers.Count;

                        // 之所以是从后向前遍历,是因为  从前向后遍历删除后索引值会不断变化
                        // 参考文章,http://www.2cto.com/kf/201312/266723.html
                        for (int index = handlerCount - 1;index >= 0;index--)
                        {
                                var handler = handlers[index];

                                if (handler.receiver != null) {
                                        Debug.Log ("SendLogicMsg:" + msgName + " Succeed");
                                        handler.callback (paramList);
                                } else {
                                        handlers.Remove (handler);
                                }
                        }
                }
                       
                public static void SendMsgByChannel(this IMsgSender sender,QMsgChannel channel,string msgName,params object[] paramList)
                {
                        if (CheckStrNullOrEmpty (msgName)) {
                                return;
                        }

                        if (!mMsgHandlerDict.ContainsKey (channel)) {
                                Debug.LogError ("Channel:" +channel.ToString() + " doesn't exist");
                                return;
                        }
                               
                        // 略过,不用看
                        if (!mMsgHandlerDict[channel].ContainsKey(msgName)){
                                Debug.LogWarning("SendMsg is UnRegister");
                                return;
                        }

                        // 开始看!!!!
                        var handlers = mMsgHandlerDict[channel][msgName];

                        var handlerCount = handlers.Count;

                        // 之所以是从后向前遍历,是因为  从前向后遍历删除后索引值会不断变化
                        // 参考文章,http://www.2cto.com/kf/201312/266723.html
                        for (int index = handlerCount - 1;index >= 0;index--)
                        {
                                var handler = handlers[index];

                                if (handler.receiver != null) {
                                        Debug.Log ("SendLogicMsg:" + msgName + " Succeed");
                                        handler.callback (paramList);
                                } else {
                                        handlers.Remove (handler);
                                }
                        }
                }
                       
                [Obsolete("RegisterLogicMsg已经弃用了,请使用RegisterGlobalMsg")]
                public static void RegisterLogicMsg(this IMsgReceiver self, string msgName,VoidDelegate.WithParams callback,QMsgChannel channel = QMsgChannel.Global)
                {
                        if (CheckStrNullOrEmpty (msgName)||CheckDelegateNull(callback)) {
                                return;
                        }

                        // 添加消息通道
                        if (!mMsgHandlerDict.ContainsKey (channel)) {
                                mMsgHandlerDict [channel] = new Dictionary<string, List<QMsgHandler>> ();
                        }

                        // 略过
                        if (!mMsgHandlerDict[channel].ContainsKey (msgName)) {
                                mMsgHandlerDict[channel] [msgName] = new List<QMsgHandler> ();
                        }

                        // 看下这里
                        var handlers = mMsgHandlerDict [channel][msgName];

                        // 略过
                        // 防止重复注册
                        foreach (var handler in handlers) {
                                if (handler.receiver == self && handler.callback == callback) {
                                        Debug.LogWarning ("RegisterMsg:" + msgName + " ayready Register");
                                        return;
                                }
                        }

                        // 再看下这里
                        handlers.Add (new QMsgHandler (self, callback));
                }


                [Obsolete("SendLogicMsg已经弃用了,请使用使用SendGlobalMsg或SendMsgByChannel")]
                public static void SendLogicMsg(this IMsgSender sender, string msgName,params object[] paramList)
                {
                        if (CheckStrNullOrEmpty (msgName)) {
                                return;
                        }

                        if (!mMsgHandlerDict.ContainsKey (QMsgChannel.Global)) {
                                Debug.LogError ("Channel:" + QMsgChannel.Global.ToString() + " doesn't exist");
                                return;
                        }


                        // 略过,不用看
                        if (!mMsgHandlerDict[QMsgChannel.Global].ContainsKey(msgName)){
                                Debug.LogWarning("SendMsg is UnRegister");
                                return;
                        }

                        // 开始看!!!!
                        var handlers = mMsgHandlerDict[QMsgChannel.Global][msgName];

                        var handlerCount = handlers.Count;

                        // 之所以是从后向前遍历,是因为  从前向后遍历删除后索引值会不断变化
                        // 参考文章,http://www.2cto.com/kf/201312/266723.html
                        for (int index = handlerCount - 1;index >= 0;index--)
                        {
                                var handler = handlers[index];

                                if (handler.receiver != null) {
                                        Debug.Log ("SendLogicMsg:" + msgName + " Succeed");
                                        handler.callback (paramList);
                                } else {
                                        handlers.Remove (handler);
                                }
                        }
                }

                [Obsolete("UnRegisterMsg已经弃用了,请使用UnRegisterMsg")]
                public static void UnRegisterMsg(this IMsgReceiver self,string msgName,VoidDelegate.WithParams callback,QMsgChannel channel = QMsgChannel.Global)
                {
                        if (CheckStrNullOrEmpty (msgName) || CheckDelegateNull(callback)) {
                                return;
                        }
                               
                        // 添加通道
                        if (!mMsgHandlerDict.ContainsKey (channel)) {
                                Debug.LogError ("Channel:" + channel.ToString () + " doesn't exist");
                                return;
                        }

                        var handlers = mMsgHandlerDict [channel] [msgName];

                        int handlerCount = handlers.Count;

                        // 删除List需要从后向前遍历
                        for (int index = handlerCount - 1; index >= 0; index--) {
                                var handler = handlers [index];
                                if (handler.receiver == self && handler.callback == callback) {
                                        handlers.Remove (handler);
                                        break;
                                }
                        }
                }


                [Obsolete("UnRegisterMsg已经弃用了,请使用UnRegisterGlobalMsg")]
                public static void UnRegisterMsg(this IMsgReceiver self,string msgName)
                {
                        if (CheckStrNullOrEmpty (msgName)) {
                                return;
                        }

                        if (!mMsgHandlerDict.ContainsKey (QMsgChannel.Global)) {
                                Debug.LogError ("Channel:" + QMsgChannel.Global.ToString() + " doesn't exist");
                                return;                       
                        }

                        var handlers = mMsgHandlerDict[QMsgChannel.Global] [msgName];

                        int handlerCount = handlers.Count;

                        // 删除List需要从后向前遍历
                        for (int index = handlerCount - 1; index >= 0; index--) {
                                var handler = handlers [index];
                                if (handler.receiver == self) {
                                        handlers.Remove (handler);
                                        break;
                                }
                        }
                }
        }
}
个人:签名
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-24 23:21 , Processed in 0.111300 second(s), 30 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部