当前位置: 首页 > 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
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angular 响应式表单 基础例子
  • Fastjson的基本使用方法大全
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS编译提示和导航提示
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JS专题之继承
  • Koa2 之文件上传下载
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 分享几个不错的工具
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 聊聊directory traversal attack
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 七牛云假注销小指南
  • 算法-图和图算法
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • #ifdef 的技巧用法
  • #pragam once 和 #ifndef 预编译头
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十六)串口UART
  • (算法)Game
  • (一)Dubbo快速入门、介绍、使用
  • (一)Linux+Windows下安装ffmpeg
  • (一)认识微服务
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .equals()到底是什么意思?
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET CLR Hosting 简介
  • .NET LINQ 通常分 Syntax Query 和Syntax Method