【Unity】消息系统
介绍
封装的消息机制
使用
注册消息
Reg(MessageType messageType, MessageDelHandle handle);
messageType : 注册消息类型
handle :消息传入时回调方法(该方法需拥有参数Message
)
注销消息
UnReg(MessageType messageType, MessageDelHandle handle);
messageType : 注销消息类型
handle :消息传入时回调方法(该方法需拥有参数Message
)
发送消息
SendMessage(int messageType, object body = null);
messageType : 发送消息类型
body :发送消息携带参数
代码
Message
/// <summary> /// 消息类 /// </summary> public class Message{ public int Type //发送的消息类型 { get; private set; } public object Body //消息主体 { get; private set; } /// <summary> /// 构造函数 /// </summary> /// <param name="type">消息类型</param> public Message(int type){ Type = type; } /// <summary> /// 构造函数 /// </summary> /// <param name="type">消息类型</param> /// <param name="body">消息体</param> public Message(int type, object body){ Type = type; Body = body; } }
MessageType
/// <summary> /// 消息的类型枚举 /// </summary> public enum MessageType { }
MessageManager
/// <summary> /// 消息中心 /// </summary> public class MessageManager : Singleton<MessageManager> { // 消息委托 public delegate void MessageDelHandle(Message message); // 消息字典 private readonly Dictionary<int, MessageDelHandle> messageMap = new Dictionary<int, MessageDelHandle>(); /// <summary> /// 构造函数 /// </summary> public MessageManager() { } /// <summary> /// 注册监听 /// </summary> public void Reg(int messageType, MessageDelHandle handle) { if (handle == null) { return; } // 把事件添加到对应的委托中 messageMap.TryGetValue(messageType, out MessageDelHandle myHandle); messageMap[messageType] = (MessageDelHandle)Delegate.Combine(myHandle, handle); } /// <summary> /// 移除监听 /// </summary> public void UnReg(int messageType, MessageDelHandle handle) { if (handle == null) { return; } messageMap[messageType] = (MessageDelHandle)Delegate.Remove(messageMap[messageType], handle); } /// <summary> /// 清空消息 /// </summary> public void Clear() { messageMap.Clear(); } public void SendMessage(int messageType, object body = null) { if (messageMap.TryGetValue(messageType, out var handle)) { Message evt = new Message(messageType, body); try { if (handle != null) { handle(evt); } } catch (Exception e) { Debug.LogError(string.Format("发送消息:{0}, {1}, {2}, {3}", evt.Type.ToString(), e.Message, e.StackTrace, e)); throw; } } } #region MessageType public void Reg(MessageType messageType, MessageDelHandle handle) { //Debug.Log($"注册:{messageType}消息"); Reg((int)messageType, handle); } public void UnReg(MessageType messageType, MessageDelHandle handle) { //Debug.Log($"注销:{messageType}消息"); UnReg((int)messageType, handle); } public void SendMessage(MessageType messageType, object body = null) { SendMessage((int)messageType, body); } #endregion }
需实现单例 继承Singleton类
本文来自博客园,作者:星空探险家,转载请注明原文链接:https://www.cnblogs.com/PuppetLazy/p/18017814
分类:
Unity / 示例代码
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库