C#全局消息传递系统 注意事项与基础实现

本文介绍了如何设计一个全局消息传递系统,包括单例模式的应用、消息注册与移除、委托的使用,以及在Unity中的具体实现和使用示例。通过实例演示了如何发送消息、监听并处理不同类型的消息,同时关注内存管理和委托注销以防止意外垃圾回收。

首先:要实现某个系统,首先要考虑是否再场景中我们只希望其存在一个就够了?显而易见,全局的消息传递系统就是这样的一个东西,因此需要将其做成单例;既然有单例就要用到上一文说到的,防止单例释放以后,还有脚本试图调用单例的方法,从而导致在游戏结束的时候,单例依然存在的情况; 不同的消息都需要可以处理,因此所有的消息类型应该有一个共同的基类,暂且叫做Message(所有消息类型的基类);既然要处理消息,那么消息触发的时候,就要有方法去处理,但是现在来看,我们是需要一个统一的格式来定义方法,因此这里使用委托;
其次:思考一下这个系统的基础功能,既然是消息传递,
对本身而言自然要有:消息注册、消息移除、消息处理(系统触发处理还是我们立即处理)
对外部使用系统的而言要有:消息注册函数,消息监听函数
代码如下:
SingletonComponent2 在上一篇中有

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

public delegate bool My_MessgaeHandlerDelegate(Message message);// 使用这个委托来进行对应消息的调用

public class My_MessageSystem : SingletonComponent2<My_MessageSystem>
{
   
   
    public static My_MessageSystem Instance
    {
   
   
        get
        {
   
   
            return (My_MessageSystem)_Instance2;
        }
        set {
   
   
            _Instance2 = value;
        }
    }
    private Queue<Message> _messageQueue = new Queue<Message>();  //消息队列
    private Dictionary<string, List<My_MessgaeHandlerDelegate>> _listenerDict = new Dictionary<string, List<My_MessgaeHandlerDelegate>>(); //类型与对应关系
    private System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();//消息处理的限制时间

    private const int _maxQueueProcessingTime = 16667;//最大处理时间
    
    //注册事件
    public bool AddListener(System.Type type, My_MessgaeHandlerDelegate handle)
    {
   
   
        if(type == null)
        {
   
   
            Debug.Log("类型为空");
            return false;
        }
        string msgType = type.Name;
        if (!_listenerDict.ContainsKey(msgType))
        {
   
   
            _listenerDict.Add(msgType, new List<My_MessgaeHandlerDelegate>());
        }
        List<My_MessgaeHandlerDelegate> listenerList = _listenerDict[msgType];
        if (listenerList.Contai
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值