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

消息侠 (MessageX)
• 阅读 5496

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

功能介绍

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

  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]();
            }
        }
    }

}
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Karen110 Karen110
4年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Stella981 Stella981
4年前
Akka源码分析
  akka中的EventBus其实是不常用,也最容易被忽略的一个组件。  但如果你深入Cluster的实现就会发现,这个东西其实还挺有用的,而且它是ActorSystem系统中所有事件消息的一个横切面,通过它你可以订阅特定类型的消息,然后做出相应的动作。那读者可能会问了,这个订阅消息也很简单的啊,我自己实现不就好了。嗯,其实你这个想法是对的,akka所
Stella981 Stella981
4年前
Python实现坦克大战
Python实现坦克大战一、前言前段时间,也就是国庆节。在寝室闲来无事,用pygame写了一个小游戏,就是标题写的《坦克大战》。这个游戏写了两个版本,第一个版本是按照书上的思想来写的,发现写到后面的时候代码太乱了。于是我又从头开始,用比较合理的面向对象思想重新写了一个版本。说比较合理也只是符合我自己的思想,所以难免
Wesley13 Wesley13
4年前
unity将 -u4E00 这种 编码 转汉字 方法
 unity中直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\\u4E00类似这种其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文但是有时服务器要求将传参中字符串中类似\\u4E00这种转汉字,就需要下面 publ
Stella981 Stella981
4年前
Noark入门之异步事件
引入异步事件主要是为了各模块的解耦,每当完成一个动作时,向系统发布一个事件,由关心的模块自己监听处理,可选择同步处理,异步处理,延迟处理。何时发布事件,当其他模块关心此动作时<br比如获得道具时,任务系统模块要判定完成进度,BI模块需要上报等等都可以监听此事件,已达模块解耦0x00事件源一个实现xyz.noark.core.event
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这