查看: 1506|回復(fù): 1
打印 上一主題 下一主題

[其他] 消息機(jī)制相關(guān)代碼地址

[復(fù)制鏈接]

63

主題

0

聽眾

1539

積分

助理設(shè)計師

自定義頭銜

Rank: 4

納金幣
149
精華
0

優(yōu)秀版主 榮譽(yù)管理 論壇元老

跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2016-8-22 15:52:22 |只看該作者 |倒序?yàn)g覽
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好友和群 騰訊微博騰訊微博 騰訊朋友騰訊朋友 微信微信
轉(zhuǎn)播轉(zhuǎn)播0 分享淘帖0 收藏收藏0 支持支持0 反對反對0
個人:簽名
回復(fù)

使用道具 舉報

63

主題

0

聽眾

1539

積分

助理設(shè)計師

自定義頭銜

Rank: 4

納金幣
149
精華
0

優(yōu)秀版主 榮譽(yù)管理 論壇元老

沙發(fā)
發(fā)表于 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>
        /// 消息分發(fā)器
        /// C# this擴(kuò)展 需要靜態(tài)類
        /// </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>
                /// 每個消息名字維護(hù)一組消息捕捉器。
                /// </summary>
                static Dictionary<QMsgChannel,Dictionary<string,List<QMsgHandler>>> mMsgHandlerDict = new Dictionary<QMsgChannel,Dictionary<string,List<QMsgHandler>>> ();
       
                /// <summary>
                /// 注冊消息,
                /// 注意第一個參數(shù),使用了C# this的擴(kuò)展,
                /// 所以只有實(shí)現(xiàn)IMsgReceiver的對象才能調(diào)用此方法
                /// </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];

                        // 略過
                        // 防止重復(fù)注冊
                        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>
                /// 注冊消息,
                /// 注意第一個參數(shù),使用了C# this的擴(kuò)展,
                /// 所以只有實(shí)現(xiàn)IMsgReceiver的對象才能調(diào)用此方法
                /// </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];

                        // 略過
                        // 防止重復(fù)注冊
                        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>
                /// 其實(shí)注銷消息只需要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>
                /// 其實(shí)注銷消息只需要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>
                /// 發(fā)送消息
                /// 注意第一個參數(shù)
                /// </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;

                        // 之所以是從后向前遍歷,是因?yàn)?nbsp; 從前向后遍歷刪除后索引值會不斷變化
                        // 參考文章,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;

                        // 之所以是從后向前遍歷,是因?yàn)?nbsp; 從前向后遍歷刪除后索引值會不斷變化
                        // 參考文章,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已經(jīng)棄用了,請使用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];

                        // 略過
                        // 防止重復(fù)注冊
                        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已經(jīng)棄用了,請使用使用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;

                        // 之所以是從后向前遍歷,是因?yàn)?nbsp; 從前向后遍歷刪除后索引值會不斷變化
                        // 參考文章,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已經(jīng)棄用了,請使用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已經(jīng)棄用了,請使用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;
                                }
                        }
                }
        }
}
個人:簽名
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

手機(jī)版|納金網(wǎng) ( 閩ICP備2021016425號-2/3

GMT+8, 2024-10-31 07:30 , Processed in 0.098654 second(s), 30 queries .

Powered by Discuz!-創(chuàng)意設(shè)計 X2.5

© 2008-2019 Narkii Inc.

回頂部