Unity 简易监听框架
全局维护一个字典,字典中的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 简易监听框架的更多相关文章
- 深入理解Spring的容器内事件发布监听机制
目录 1. 什么是事件监听机制 2. JDK中对事件监听机制的支持 2.1 基于JDK实现对任务执行结果的监听 3.Spring容器对事件监听机制的支持 3.1 基于Spring实现对任务执行结果的监 ...
- 【转】监听按钮除OnClick外其他事件的方法,附简易改编的UIButton类
http://lib.csdn.net/article/unity3d/38463 作者:IceFantasyLcj 大家好,我是雨中祈雨.一直以来,CSDN都是我最好的编程助手.这是我在CSDN的第 ...
- 【转】 NGUI 监听按钮除OnClick外其他事件的方法,附简易改编的UIButton类
http://blog.csdn.net/icefantasylcj/article/details/49450555 大家好,我是雨中祈雨.一直以来,CSDN都是我最好的编程助手.这是我在CSDN的 ...
- 使用HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
之前发布了一款简易的计算器,今天做了一下修改,添加了键盘监听事件,不用再用鼠标点点点啦 JS代码: var yunSuan = 0;// 运算符号,0-无运算;1-加法;2-减法;3-乘法;4-除法 ...
- 【iOS】7.4 定位服务->2.1.3.3 定位 - 官方框架CoreLocation 功能3:区域监听
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...
- mui框架下监听返回按钮
用于监听mui框架下的Android手机的返回按键(物理键) mui.back = function() { if(b == true) {//一个标识符,在某个状态下不允许双击返回关闭程序 aler ...
- Android图片加载框架最全解析(四),玩转Glide的回调与监听
大家好,今天我们继续学习Glide. 在上一篇文章当中,我带着大家一起深入探究了Glide的缓存机制,我们不光掌握了Glide缓存的使用方法,还通过源码分析对缓存的工作原理进行了了解.虽说上篇文章和本 ...
- MVC框架入门准备(三)事件类 - 事件的监听和触发
在mvc框架中可以看到事件类,实现事件的监听和触发. 举例: <?php /** * 事件类 */ class Event { // 事件绑定记录 private static $events; ...
- Unity中利用委托与监听解耦合的思路
这篇随笔是一篇记录性的随笔,记录了从http://www.sikiedu.com/my/course/304,这门课程中学到的内容,附带了一些自己的思考. 一.单例模式的应用 首先假想一种情况,现在需 ...
随机推荐
- sqoop-1.4.4安装配置
环境:redhat6.5 hadoop2.4.1 感谢: http://wenku.baidu.com/view/a9083da8dd3383c4bb4cd274.html注释hbase检查 感谢: ...
- Zookeeper权限管理与Quota管理
Zookeeper的ACL机制和Quota机制网上资料较少,这里做一个总结,以供大家参考. 1 Zookeeper ACL ZooKeeper的权限管理亦即ACL控制功能通过Server.Client ...
- CImg的使用,入门
CImg的使用: const char *imageIN="image.jpg" const char *imageOUT="imgeout.jpg" CImg ...
- Linux命令之split
split用来将大文件分割成小文件.有时文件越来越大,传送这些文件时,首先将其分割可能更容易. 使用vi或其他工具诸如sort时,如果文件对于工作缓冲区太大,也会存在一些问题. 因此有时没有选择余地, ...
- 如何在Java的Filter中注入Service???
今天在做用户使用cookie自动登录的时候,发现在LoginFilter中读取到cookie以后要进行查询数据库然后进行用户名和密码的比对,查询数据库肯定要用到Service和Dao,一开始我以为在s ...
- 创建新的C++工程来调用Caffe对图片进行识别
前段时间一直在跑Caffe训练数据.之前用训练好的caffemodel对图片进行分类都是用的命令行指令,于是就想着自己新建一个工程来调用caffe,结合classification的代码来对图片进行分 ...
- docker学习笔记(2) 构建镜像
一.手动构建一个简单镜像 我们以构建nginx的docker镜像为例:手动构建镜像 docker pull centos 安装基础镜像docker run --name mynginx -it ...
- 解决asp.net中HTML中talbe的行高被内容撑的变高的问题
将asp.net页面中的如下语句: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- 【Python之路】第十六篇--Web框架之Tornado
概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...
- 【python】-- Django路由系统(网址关系映射)、视图、模板
Django路由系统(网址关系映射).视图.模板 一.路由系统(网址关系映射) 1.单一路由对应: 一个url对应一个视图函数(类) urls.py: url(r'^test', views.test ...