首先:要实现某个系统,首先要考虑是否再场景中我们只希望其存在一个就够了?显而易见,全局的消息传递系统就是这样的一个东西,因此需要将其做成单例;既然有单例就要用到上一文说到的,防止单例释放以后,还有脚本试图调用单例的方法,从而导致在游戏结束的时候,单例依然存在的情况; 不同的消息都需要可以处理,因此所有的消息类型应该有一个共同的基类,暂且叫做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

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

被折叠的 条评论
为什么被折叠?



