栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

unity 通用消息发布与订阅机制

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

unity 通用消息发布与订阅机制

在MonoBehaviour下
测试类

/// 
/// 测试消息脚本
/// 
public class Test1:MonoBehaviour,IMsgReceiver,IMsgSender
{
    private void OnEnable()
    {
        ///注册消息
        this.AddMessageHandler(ECustomMessageType.你的消息枚举, 处理消息的方法);
    }

    private void Start()
    {
        this.DispatchMessage(ECustomMessageType.你的消息枚举, "参数1", 22222, "参数3");
    }


    private void OnDisable()
    {
        ///取消消息注册
        this.RemoveAllMessageHandler();
    }

    private void 处理消息的方法(params object[] param)
    {
        
    }
}


using UnityEngine;
using System.Collections.Generic;

/// 
/// 自定义消息事件枚举,在这里注册消息类型
/// 所有的自定义消息通过一个枚举来区分
/// 
public enum ECustomMessageType
{
    NULL,

}
/// 
/// 自定义消息委托
/// 
/// 参数组
public delegate void DelegateCustomMessage(params object[] param);

/// 
/// 消息接受接口,但凡继承本接口则具备接受消息的能力
/// 
public interface IMsgReceiver { }

/// 
/// 消息发送者接口,但凡继承本接口则具备发送消息的能力
/// 
public interface IMsgSender { }

/// 
/// 消息派发器类
/// 
public static class CCEDMsgDispatcher
{
    /// 
    /// 消息捕捉器
    /// 记录消息名和处理回调
    /// 
    private class LogicMsgHandler
    {
        // 消息接受对象
        public IMsgReceiver m_Receiver;
        public DelegateCustomMessage m_Callback;

        public LogicMsgHandler(IMsgReceiver receiver, DelegateCustomMessage Callback)
        {
            m_Receiver = receiver;
            m_Callback = Callback;
        }
    }

    // 消息注册管理对象
    private static Dictionary> m_MsgHandlerList = new Dictionary>();

    /// 
    /// 注册消息处理
    /// 
    /// this扩展,this必须是 ImsgReceiver 的实例
    ///  消息名 
    ///  回调函数,无返回值,支持任意类型,任意长度的参数 
    public static void AddMessageHandler(this IMsgReceiver self, ECustomMessageType MsgType, DelegateCustomMessage Callback)
    {
        if (MsgType == ECustomMessageType.NULL)
        {
            Debug.LogError(string.Format("error msg type is {0}", MsgType));
            return;
        }

        if (Callback == null)
        {
            Debug.LogError(string.Format("none call back!!", MsgType));
            return;
        }

        if (!m_MsgHandlerList.ContainsKey(MsgType))
        {
            // 如果不包含这个Key,那么就创建他
            m_MsgHandlerList[MsgType] = new List();
        }

        // 防止反复注册
        foreach (var item in m_MsgHandlerList[MsgType])
        {
            if (item.m_Receiver == self && item.m_Callback == Callback)
            {
                return;
            }
        }

        // 注册
        m_MsgHandlerList[MsgType].Add(new LogicMsgHandler(self, Callback));
    }

    /// 
    /// 移除掉某个对象身上的事件处理
    /// 一般在他的OnDestory里执行
    /// 
    /// this 扩展,扩展对象必须是IMsgReceiver 的实例
    /// 消息类型
    public static void RemoveMessageHandler(this IMsgReceiver self, ECustomMessageType MsgType)
    {
        if (MsgType == ECustomMessageType.NULL)
        {
            Debug.LogError(string.Format("error msg type is {0}", MsgType));
            return;
        }

        // 没有注册该消息时的处理
        if (!m_MsgHandlerList.ContainsKey(MsgType))
        {
            return;
        }

        // 得到所有注册的处理
        var Handlers = m_MsgHandlerList[MsgType];

        // 得到数量
        var HandlerCount = Handlers.Count;

        // 倒序遍历,防止删除引起的循环异常
        for (int i = HandlerCount - 1; i >= 0; i--)
        {
            var Handler = Handlers[i];

            // 存在处理对象才调用
            if (Handler.m_Receiver == self)
            {
                Handlers.Remove(Handler);
            }
        }
    }

    /// 
    /// 移除一个对象身上建立的所有事件监听
    /// 
    /// this 扩展,必须是IMsgReceiver的实例 
    public static void RemoveAllMessageHandler(this IMsgReceiver self)
    {
        // 遍历所有事件注册
        foreach (var item in m_MsgHandlerList)
        {
            // 得到数量
            var HandlerCount = item.Value.Count;

            // 倒序遍历,防止删除引起的循环异常
            for (int i = HandlerCount - 1; i >= 0; i--)
            {
                var Handler = item.Value[i];

                // 存在处理对象才调用
                if (Handler.m_Receiver == self)
                {
                    item.Value.Remove(Handler);
                }
            }

        }

    }

    /// 
    /// 消息发送处理
    /// 
    /// this扩展,this必须是 IMsgSender的实例
    /// 要发送的消息类型
    /// 要发送的参数,支持任意类型,任意长度的参数
    public static void DispatchMessage(this IMsgSender self, ECustomMessageType MsgType, params object[] paramList)
    {
        if (MsgType == ECustomMessageType.NULL)
        {
            Debug.LogError(string.Format("error msg type is {0}", MsgType));
            return;
        }

        // 没有注册该消息时的处理
        if (!m_MsgHandlerList.ContainsKey(MsgType))
        {
            return;
        }

        // 得到所有注册的处理
        var Handlers = m_MsgHandlerList[MsgType];

        // 得到数量
        var HandlerCount = Handlers.Count;

        // 倒序遍历,防止删除引起的循环异常
        for (int i = HandlerCount - 1; i >= 0; i--)
        {
            var Handler = Handlers[i];

            // 存在处理对象才调用
            if (Handler.m_Receiver != null)
            {
                Handler.m_Callback(paramList);
            }
            else
            {
                Handlers.Remove(Handler);
            }
        }
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/900423.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号