Unity事件处理封装【优化篇】
1、优化内容:
a、代码优化:优化之前的object装箱拆箱操作
b、里氏替换原则:设置委托事件对象用来存储
c、功能扩展:重载无参的事件触发功能
2、具体实现:
C#
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();
}
}
测试:
C#
//指定类型注册
EventCenter.GetInstance().AddListenerEvent<KeyCode>("某键按下",PressFun);//注册键盘按下事件
//一般注册
EventCenter.GetInstance().AddListenerEvent("某键抬起", RaiseFun);//注册键盘按下事件
void PressFun(KeyCode key)
{
}
void RaiseFun()
{
}
//指定类型派发事件
EventCenter.GetInstance().EventTrigger<KeyCode>("某键按下", key);
//无参派发事件
EventCenter.GetInstance().EventTrigger("某键按下");
评论