C#——Unity事件监听器
2024-09-01 17:51:11
事件监听器
事件类型
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());
}
最新文章
- java代码实现栈
- 【XLL API 函数】xlSheetId
- outlook备份及恢复
- mysql安装及卸载
- animation of android (1)
- 浅谈javascript中的数据类型和引用类型
- mysql数据库表格导出为excel表格
- jsp页面写入中文到mysql时出现了乱码(转)
- Ubuntu设置环境变量的几种方法
- 超级实用且不花哨的js代码大全
- JENKINS 打包发布脚本
- java 遍历树节点 同时保留所有的从根到叶节点的路径
- Linux下一个C基本的编程----写进Blog在那之前
- 解决xtrabackup command not found no mysqld group 问题
- python3之模块
- c++趣味之难以发现的bug
- [转] List of OpenFlow Software Projects
- 草珊瑚的redux使用方式
- 2016 多校联赛7 Balls and Boxes(概率期望)
- hdu 5692(dfs+线段树) Snacks
热门文章
- Asp.net Core 系列之--2.ORM初探:Dapper实现MySql数据库各类操作
- SpringBoot Web篇笔记(一)
- 开源 ERP 系统 GoodERP
- Python 基础之 线程与进程
- 前后端分离,我怎么就选择了 Spring Boot + Vue 技术栈?
- 微信web协议,群成员唯一uin,获取群成员唯一标识
- pat 1069 The Black Hole of Numbers(20 分)
- python3.7.1安装Scrapy爬虫框架
- oracle使用parallel并行,多线程查询
- Git的使用和基本概念理解