当前位置: 首页 > news >正文

在Unity中实现一个简单的消息管理器

一直偷懒没有开发这个东西,最近要做新手引导系统,必须大范围的解耦,所以不得不用消息系统来管理了。上网查了几篇文章,发现一点也不难,但是可能有的教程比较老,或者格式比较乱,所以我重新来写一个我自己的实现吧,抛砖引玉。

功能介绍

这个管理器,包含几个部分:

  1. 事件类型的枚举

  2. 事件列表

  3. 监听器的添加和删除

  4. 事件发送

原理简述

我假定读者尚不清楚事件管理器的概念。每当一个消息被触发的时候,在触发位置调用一下事件发送的函数。然后这个函数,会去事件列表中定位该事件,找出它对应的回调函数队列,逐个执行。如果没有回调函数,那么这个消息什么也不做。如果某个类需要监听某个事件,就将回调函数注册进去,如果不需要了,就从队列中删除。

关于delegate

这方面网上文章很多,就不详细介绍了,只说下基本思路。Delegate用来定义一种通用的函数类型,将函数作为参数传递,比如
public delegate void Func();
这里我定义了一个函数形式命名为Func,符合这个结构的,都可以当做这个delegate使用。需要传入函数作为参数的时候,这样用:

void Awake(){
    Foo(Test);
}

public void Test(){
    Debug.Log("hello");
}

public void Foo(Func bar){
    bar();
}

具体实现

public enum CustomEventType{
    //事件列表
}

public delegate void EventCallback(object data = null);

public class EventManager{

    private static EventManager _instance;
    public static EventManager instance{
        get{
            if(_instance == null){
                _instance = new EventManager();
            }
            return _instance;
        }
    }

    private static Dictionary<CustomEventType, List<EventCallback>> eventQueue 
    = new Dictionary<CustomEventType, List<EventCallback>>();

    public static void AddListener(CustomEventType type, EventCallback callback){
        if(!eventQueue.ContainsKey(type)){
            eventQueue.Add(type, new List<EventCallback>());
        }
        if(!eventQueue[type].Contains(callback)){
            eventQueue[type].Add(callback);
        }
    }

    public static void RemoveListener(CustomEventType type, EventCallback callback){
        if(eventQueue.ContainsKey(type)){
            eventQueue[type].Remove(callback);
        }
    }

    public static void PostEvent(CustomEventType type){
        if(eventQueue != null && eventQueue.ContainsKey(type)){
            List<EventCallback> callbacks = eventQueue[type];
            for (int i = 0; i < callbacks.Count; i++) {
                callbacks[i]();
            }
        }
    }

}

相关文章:

  • 重要的方法
  • Docker入门最佳实践
  • webpack 4.x 搭建项目脚手架
  • python学习第十二课
  • 用事件修饰符来修改事件
  • PHP慢慢长路之问题与解决方法(2)——用navicat导出数据库出错问题解决
  • DevOps/TestOps概念
  • 高级特性(8)- JavaBean构件
  • openpyxl read excel
  • Android通讯录管理(获取联系人、通话记录、短信消息)(二)
  • h5开发坑点小总结
  • 在没有数据库表或者列的情况下新建model;rails ,ruby, rack
  • Keepalived
  • Nginx禁止ip访问或IP网段访问方法
  • Investigating Your RAM Usage
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • egg(89)--egg之redis的发布和订阅
  • ESLint简单操作
  • JavaScript服务器推送技术之 WebSocket
  • JS学习笔记——闭包
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 程序员最讨厌的9句话,你可有补充?
  • 动态魔术使用DBMS_SQL
  • 构建二叉树进行数值数组的去重及优化
  • 关于for循环的简单归纳
  • 如何设计一个微型分布式架构?
  • 如何优雅地使用 Sublime Text
  • 什么软件可以剪辑音乐?
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 我的业余项目总结
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​如何防止网络攻击?
  • ​虚拟化系列介绍(十)
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #1015 : KMP算法
  • #每天一道面试题# 什么是MySQL的回表查询
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (区间dp) (经典例题) 石子合并
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (转)Scala的“=”符号简介
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ***监测系统的构建(chkrootkit )
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .net 微服务 服务保护 自动重试 Polly
  • .net/c# memcached 获取所有缓存键(keys)
  • .Net6使用WebSocket与前端进行通信
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET框架
  • .NET面试题(二)
  • .net下的富文本编辑器FCKeditor的配置方法