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());
}
阳光穿过叶的缝隙!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)