Unity事件处理封装【优化篇】
1、优化内容:
a、代码优化:优化之前的object装箱拆箱操作
b、里氏替换原则:设置委托事件对象用来存储
c、功能扩展:重载无参的事件触发功能
2、具体实现:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; #region 委托事件对象类 /// <summary> /// 空接口 用来 里氏转换【将父类转换成子类】 /// </summary> public interface IEventDate { } /// <summary> /// 带类型的 事件存储对象 /// </summary> /// <typeparam name="T"></typeparam> public class EventDate<T> : IEventDate { //用来保存 指定类型的 委托事件 public UnityAction<T> actions; /// <summary> /// 添加 该类型对象时 默认执行构造函数 保存该事件 /// </summary> public EventDate(UnityAction<T> action) { actions += action; } } /// <summary> /// 无指定类型的 事件存储对象 /// </summary> public class EventDate : IEventDate { //用来保存 委托事件 public UnityAction actions; /// <summary> /// 添加时 保存该事件 /// </summary> public EventDate(UnityAction action) { actions += action; } } #endregion /// <summary> /// 事件处理【注册、派发】 单例类 /// </summary> public class EventCenter : SingletonBase<EventCenter> { //保存事件的字典 private Dictionary<string, IEventDate> eventDict = new Dictionary<string, IEventDate>(); #region 注册事件 /// <summary> /// 注册事件 /// </summary> /// <param name="name">事件名称</param> /// <param name="eve">要添加的事件名【函数名】</param> public void AddListenerEvent<T>(string name, UnityAction<T> action) { //字典存在该事件 if (eventDict.ContainsKey(name)) { //将事件 添加绑定 (eventDict[name] as EventDate<T>).actions += action; } else { //不存在则 注册该事件 将该事件 添加进字典 eventDict.Add(name, new EventDate<T>(action)); } } /// <summary> /// 重载 无指定类型的 委托添加事件 /// </summary> /// <param name="name"></param> /// <param name="action"></param> public void AddListenerEvent(string name, UnityAction action) { //字典存在该事件 if (eventDict.ContainsKey(name)) { //将事件 添加绑定 (eventDict[name] as EventDate).actions += action; } else { //不存在则 注册该事件 将该事件 添加进字典 eventDict.Add(name, new EventDate(action)); } } #endregion #region 派发事件 /// <summary> /// 事件派发 /// </summary> /// <param name="name">注册的事件名称</param> public void EventTrigger<T>(string name,T info) { //事件中心存在该事件 if (eventDict.ContainsKey(name)) { //派发 执行 (eventDict[name] as EventDate<T>).actions.Invoke(info); } } public void EventTrigger(string name) { //事件中心存在该事件 if (eventDict.ContainsKey(name)) { //派发 执行 (eventDict[name] as EventDate).actions.Invoke(); } } #endregion #region 移除监听事件 /// <summary> /// 移除事件的监听 /// </summary> /// <param name="name">事件名称</param> /// <param name="action">具体事件【函数名】</param> public void RemoveEventListener<T>(string name,UnityAction<T> action) { //字典存在该事件 if (eventDict.ContainsKey(name)) { //将事件 移除 if ((eventDict[name] as EventDate<T>).actions!=null) (eventDict[name] as EventDate<T>).actions -= action; } } public void RemoveEventListener(string name, UnityAction action) { //字典存在该事件 if (eventDict.ContainsKey(name)) { //将事件 移除 if ((eventDict[name] as EventDate).actions != null) (eventDict[name] as EventDate).actions -= action; } } #endregion /// <summary> /// 清空全部事件 /// 主要应用于跳转场景 /// </summary> public void Clear() { eventDict.Clear(); } }
测试:
//指定类型注册 EventCenter.GetInstance().AddListenerEvent<KeyCode>("某键按下",PressFun);//注册键盘按下事件 //一般注册 EventCenter.GetInstance().AddListenerEvent("某键抬起", RaiseFun);//注册键盘按下事件 void PressFun(KeyCode key) { } void RaiseFun() { } //指定类型派发事件 EventCenter.GetInstance().EventTrigger<KeyCode>("某键按下", key); //无参派发事件 EventCenter.GetInstance().EventTrigger("某键按下");
评论