C#——Unity事件监听器
事件监听器
事件类型
public enum BaseHEventType {
GAME_OVER,
GAME_WIN,
PAUSE,
ENERGY_EMEPTy,
GAME_DATA
}
事件基类
public class BaseHEvent
{
protected Hashtable m_arguments;
protected BaseHEventType m_type;
protected Object m_Sender;
public IDictionary Params {
get { return this.m_arguments; }
set { this.m_arguments = (value as Hashtable); }
}
public BaseHEventType Type {//事件类型 构造函数会给Type 和Sender赋值
get { return this.m_type; }
set { this.m_type = value; }
}
public Object Sender {//物体
get { return this.m_Sender; }
set { this.m_Sender = value; }
}
public override string ToString()
{
return this.m_type + "[" + ((this.m_Sender == null) ? "null" : this.m_Sender.ToString()) + "]";
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="type"> 事件类型 </param>
/// <param name="sender"> 物体 </param>
public BaseHEvent(BaseHEventType type, Object sender)
{
this.Type = type;
Sender = sender;
if (this.m_arguments == null)
{
this.m_arguments = new Hashtable();
Debug.LogError("this.m_arguments" + this.m_arguments.Count);
}
}
public BaseHEvent (BaseHEventType type,Hashtable args,Object sender)
{
this.Type = type;
this.m_arguments = args;
Sender = sender;
if (this.m_arguments == null)
{
this.m_arguments = new Hashtable();
}
}
public BaseHEvent Clone()
{
return new BaseHEvent(this.m_type, this.m_arguments, Sender);
}
}
事件机制
public delegate void HEventListenerDelegate(BaseHEvent hEvent);//定义委托用于传事件基类
public class HEventDispatcher
{
static HEventDispatcher Instance;
public static HEventDispatcher GetInstance()//单利
{
if (Instance == null)
{
Instance = new HEventDispatcher();
}
return Instance;
}
private Hashtable listeners = new Hashtable(); //掌控所有类型的委托事件
public void AddEventListener(BaseHEventType type,HEventListenerDelegate listener)
{
HEventListenerDelegate hEventListenerDelegate = this.listeners[type] as HEventListenerDelegate;//获得之前这个类型的委托 如果第一次等于Null
hEventListenerDelegate = (HEventListenerDelegate) Delegate.Combine(hEventListenerDelegate, listener);//将两个委托的调用列表连接在一起,成为一个新的委托
this.listeners[type] = hEventListenerDelegate;//赋值给哈希表中的这个类型
}
public void RemoveEventListener(BaseHEventType type, HEventListenerDelegate listener)
{
HEventListenerDelegate hEventListener = this.listeners[type] as HEventListenerDelegate;//获得之前这个类型的委托 如果第一次等于Null
if (hEventListener != null)
{
hEventListener =(HEventListenerDelegate)Delegate.Remove(hEventListener, listener);//从hEventListener的调用列表中移除listener
this.listeners[type] = hEventListener;//赋值给哈希表中的这个类型
}
}
public void DispatchEvent(BaseHEvent baseH)
{
HEventListenerDelegate hEventListener = this.listeners[baseH.Type] as HEventListenerDelegate;
if (hEventListener != null)
{
try
{
hEventListener(baseH);//执行委托
}
catch (Exception e)
{
throw new System.Exception(string.Concat(new string[] { "Error Dispatch event", baseH.Type.ToString(), ":", e.Message, " ", e.StackTrace }), e);
}
}
}
public void RemoveAll()
{
this.listeners.Clear();
}
}
调用方法 下面是我在Unity当中调用的
//注册/添加事件
void Start()
{
HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA,StartHEvent);
HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA, StartDataEvent);
HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_WIN,StopHEvent);
}
//事件分发
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_DATA, this));
}
if (Input.GetKeyDown(KeyCode.S))
{
HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_WIN, this));
}
}
//事件移除
private void OnDestroy()
{
HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_DATA, StartHEvent);
HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_WIN, StopHEvent);
}
//添加事件方法
void StartDataEvent(BaseHEvent hEvent)
{
Debug.Log("Doule" +hEvent.ToString());
}
void StartHEvent(BaseHEvent hEvent)
{
Debug.Log("StartHEvent + HEvent" + hEvent.ToString());
}
void StopHEvent(BaseHEvent hEvent)
{
Debug.Log("StopHEvent + HEvent" + hEvent.ToString());
}
C#——Unity事件监听器的更多相关文章
- passive 的事件监听器
很久以前,addEventListener() 的参数约定是这样的: addEventListener(type, listener, useCapture) 后来,最后一个参数,也就是控制监听器是在 ...
- js事件监听器用法实例详解
这篇文章主要介绍了js事件监听器用法,以实例形式较为详细的分析了javascript事件监听器使用注意事项与相关技巧,需要的朋友可以参考下本文实例讲述了js事件监听器用法.分享给大家供大家参考.具体分 ...
- Java基础之处理事件——实现低级事件监听器(Sketcher 2 implementing a low-level listener)
控制台程序. 定义事件监听器的类必须实现监听器接口.所有的事件监听器接口都扩展了java.util.EventListener接口.这个接口没有声明任何方法,仅仅用于表示监听器对象.使用EventLi ...
- [原创]java WEB学习笔记48:其他的Servlet 监听器:域对象中属性的变更的事件监听器 (3 个),感知 Session 绑定的事件监听器(2个)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- Android编程: 界面组成、事件监听器
学习知识:界面组成.事件监听器 ====界面组成==== 1.用户界面的基本组件叫做View,都是继承android.view.View类,Android里面预定义很多基本的界面组件,比如 Butto ...
- Hibernate拦截器(Interceptor)与事件监听器(Listener)
拦截器(Intercept):与Struts2的拦截器机制基本一样,都是一个操作穿过一层层拦截器,每穿过一个拦截器就会触发相应拦截器的事件做预处理或善后处理. 监听器(Listener):其实功能与拦 ...
- Android事件监听器Event Listener
在 Android 中,我们可以通过事件处理使UI与用户互动(UI Events). UI的用户事件处理,即View处理用户的操作,在应用程序中几乎不可避免.View是重要的类,它是与用户互动的前线: ...
- Servlet事件监听器
监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 面试题:请描述一下java事件监听机 ...
- 第13章 Swing程序设计----常用事件监听器
组件本身并不带有任何功能.这时需要为这些组件添加特定事件监听器. Swing中常用的两个事件监听器,即动作事件监听器和焦点事件监听器.
随机推荐
- Maven/Docker快速搭建RocketMQ
官方文档 [https://rocketmq.apache.org/docs/quick-start/] ①:Bin_二进制安装版 1. 环境准备 系统环境:Centos7 x64 JDK:jdk-8 ...
- linux 相关指令
modinfo *.ko 显示驱动文件的信息.
- 深入理解@LoadBalanced注解的实现原理与客户端负载均衡
前提 在阅读这篇博客之前,希望你对SpringCloud套件熟悉和理解,更希望关注下微服务开发平台 概述 在使用springcloud ribbon客户端负载均衡的时候,可以给RestTemplate ...
- linux引导之grub2
先了解下什么是Bootloader 以下是百度百科释意 在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件环境带到一个合适 ...
- js数组方法大全(下)
# js数组方法大全(下) 记录一下整理的js数组方法,免得每次要找方法都找不到.图片有点多,注意流量,嘻嘻! 本期分享 forEach() map() filer() every() some() ...
- sso单点登录系统
sso单点登录概念 1.一处登录,处处登录.会单独做一个单点登录系统,只负责颁发token和验证token,和页面登录功能. 2.通过在浏览器cookie中放入token,和在redis中对应toke ...
- 正则表达式 解决python2升python3的语法问题
2019.9.12 更新 今天偶然看到 python 官网中,还介绍了一个专门的工具,用于 python2 升级 python3,以后有机会使用下看看 https://docs.python. ...
- Spring Boot2 系列教程(二十三)理解 Spring Data Jpa
有很多读者留言希望松哥能好好聊聊 Spring Data Jpa! 其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring ...
- pat 1132 Cut Integer(20 分)
1132 Cut Integer(20 分) Cutting an integer means to cut a K digits lone integer Z into two integers o ...
- Kibana创建索引成功,但一直不显示出来(Fielddata is disabled on text fields by default. Set fielddata=true........)
现象 把EFK整个集群搭建完成后,通过Kibana操作界面创建索引(如图1),我创建了lile-zabbix*的索引,显示是创建成功了,但是只要我在重新刷新一次,已经创建的索引就“消失了”.后通过查看 ...