全局维护一个字典,字典中的key为字符串或者自定义类型,value为委托,

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System; public delegate void CallBack();
public delegate void CallBack<T>(T t);
public delegate void CallBack<T, D>(T t, D d);
public delegate void CallBack<T, D, U>(T t, D d, U u); public class Messenger
{
public static Dictionary<string, Delegate> eventTable = new Dictionary<string, Delegate>(); static void OnListenerAdding(string eventkey, Delegate listenerDelegate)
{
if (!eventTable.ContainsKey(eventkey))
{
eventTable.Add(eventkey, null);
}
}
public static void AddListener(string eventtype, CallBack handler)
{
OnListenerAdding(eventtype, handler);
eventTable[eventtype] = (eventTable[eventtype] as CallBack) + (handler);
} public static void AddListener<T>(string eventtype, CallBack<T> handler)
{
OnListenerAdding(eventtype, handler);
eventTable[eventtype] = (eventTable[eventtype] as CallBack<T>) + (handler);
}
public static void AddListener<T, D>(string eventtype, CallBack<T, D> handler)
{
OnListenerAdding(eventtype, handler);
eventTable[eventtype] = (eventTable[eventtype] as CallBack<T, D>) + (handler);
}
public static void AddListener<T, D, U>(string eventtype, CallBack<T, D, U> handler)
{
OnListenerAdding(eventtype, handler);
eventTable[eventtype] = (eventTable[eventtype] as CallBack<T, D, U>) + (handler);
}
static void OnBroadcast(string eventtype)
{
if (!eventTable.ContainsKey(eventtype))
{
Debug.LogError("不包含此监听");
return;
}
} public static void Broadcast(string eventtype)
{
OnBroadcast(eventtype);
CallBack callback;
if (eventTable.ContainsKey(eventtype))
{
callback = eventTable[eventtype] as CallBack;
callback?.Invoke();//如果不为空调用,unity2017以下不可简写
}
}
public static void Broadcast<T>(string eventtype,T t)
{
OnBroadcast(eventtype);
CallBack<T> callback;
if (eventTable.ContainsKey(eventtype))
{
callback = eventTable[eventtype] as CallBack<T>;
callback?.Invoke(t);//如果不为空调用,unity2017以下不可简写
}
}
public static void Broadcast<T,D>(string eventtype, T t,D d)
{
OnBroadcast(eventtype);
CallBack<T,D> callback;
if (eventTable.ContainsKey(eventtype))
{
callback = eventTable[eventtype] as CallBack<T,D>;
callback?.Invoke(t, d);//如果不为空调用,unity2017以下不可简写
}
}
public static void Broadcast<T, D,U>(string eventtype, T t, D d,U u)
{
CallBack<T, D,U> callback;
if (eventTable.ContainsKey(eventtype))
{
callback = eventTable[eventtype] as CallBack<T, D,U>;
callback?.Invoke(t, d, u); //如果不为空调用,unity2017以下不可简写
}
}
}

  

Unity 简易监听框架的更多相关文章

  1. 深入理解Spring的容器内事件发布监听机制

    目录 1. 什么是事件监听机制 2. JDK中对事件监听机制的支持 2.1 基于JDK实现对任务执行结果的监听 3.Spring容器对事件监听机制的支持 3.1 基于Spring实现对任务执行结果的监 ...

  2. 【转】监听按钮除OnClick外其他事件的方法,附简易改编的UIButton类

    http://lib.csdn.net/article/unity3d/38463 作者:IceFantasyLcj 大家好,我是雨中祈雨.一直以来,CSDN都是我最好的编程助手.这是我在CSDN的第 ...

  3. 【转】 NGUI 监听按钮除OnClick外其他事件的方法,附简易改编的UIButton类

    http://blog.csdn.net/icefantasylcj/article/details/49450555 大家好,我是雨中祈雨.一直以来,CSDN都是我最好的编程助手.这是我在CSDN的 ...

  4. 使用HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)

    之前发布了一款简易的计算器,今天做了一下修改,添加了键盘监听事件,不用再用鼠标点点点啦 JS代码: var yunSuan = 0;// 运算符号,0-无运算;1-加法;2-减法;3-乘法;4-除法 ...

  5. 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听

    本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...

  6. mui框架下监听返回按钮

    用于监听mui框架下的Android手机的返回按键(物理键) mui.back = function() { if(b == true) {//一个标识符,在某个状态下不允许双击返回关闭程序 aler ...

  7. Android图片加载框架最全解析(四),玩转Glide的回调与监听

    大家好,今天我们继续学习Glide. 在上一篇文章当中,我带着大家一起深入探究了Glide的缓存机制,我们不光掌握了Glide缓存的使用方法,还通过源码分析对缓存的工作原理进行了了解.虽说上篇文章和本 ...

  8. MVC框架入门准备(三)事件类 - 事件的监听和触发

    在mvc框架中可以看到事件类,实现事件的监听和触发. 举例: <?php /** * 事件类 */ class Event { // 事件绑定记录 private static $events; ...

  9. Unity中利用委托与监听解耦合的思路

    这篇随笔是一篇记录性的随笔,记录了从http://www.sikiedu.com/my/course/304,这门课程中学到的内容,附带了一些自己的思考. 一.单例模式的应用 首先假想一种情况,现在需 ...

随机推荐

  1. libsvm easy.py ValueError: need more than 0 values to unpack windows下终极解决

    现象是: python easy.py train test 输出: Scaling training data...WARNING: original #nonzeros 100389 new #n ...

  2. Classification week6: precision & recall 笔记

    华盛顿大学 machine learning :classification  笔记 第6周 precision & recall 1.accuracy 局限性 我们习惯用 accuracy ...

  3. iframe详解

    如何查看是否为iframe *使用FireFox组件firebug->firepath 1.Top Window:可直接定位 2.iframe#i:根据id定位 定位方法: switch_to. ...

  4. 机器学习之猫狗大战,解决image RGB values must be in the 0..1 range.

    猫狗大战是比较经典的机器学习案例,前几天体验了一番,来记录一下 1.图片准备 首先是准备训练的图片 链接:https://pan.baidu.com/s/1ht1HIuw 密码:aw9s 2.开始训练 ...

  5. 用sql语句,快速备份表数据

    1.SqlServer数据库 --DataTable 原数据表 --DataTable_20150717 要备份的新表名 select * into DataTable_20150717 from D ...

  6. python3 - 动态添加属性以及方法

    给实例动态添加方法,需引入types模块,用其的MethodType(要绑定的方法名,实例对象)来进行绑定:给类绑定属性和方法,可以通过 实例名.方法名(属性名) = 方法名(属性值) 来进行绑定.给 ...

  7. OC对象给分类加入属性

    OC对象中不能给分类加入属性.可是在实际开发中.常常为了更好的性能须要给分类加入属性,那么 加入的属性不能有默认的成员变量.须要我们自己实现set和get方法,要用到执行时 例如以下: #import ...

  8. mongodb基础操作

    查询选择器>db.customers.find({age:{$lt:102}})查询age小于102的数据$lte表示小于或等于$gt表示大于$gte表示大于或等于>db.customer ...

  9. JFrame 居中显示

    场景:    在利用 JAVA  的 Swing 开发 C/S 架构 的前端界面 目的:    想让 JFrame 居中显示在整个 屏幕的正中位置 方法一:计算窗体的左上角坐标 JFrame fram ...

  10. 实用的 集合工具类 和 String工具类

    集合工具类:CollectionUtil method: 1.isNotEmpty() 不为空 2.isEmpty() 为空 举例:map集合         Map<String,String ...