首页 学习日记正文

Unity事件处理封装【优化篇】

阿沐 学习日记 2020-04-12 852 0 unity

Unity事件处理封装【优化篇】

image.png

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("某键按下");


打赏

评论

Music