美文网首页
Eevee框架6——事件系统

Eevee框架6——事件系统

作者: ShawnWeasley | 来源:发表于2020-08-19 08:48 被阅读0次

此处借鉴唐老师的事件系统。本人进行了书写规范化及一些非空判断避免报错等小优化。

如果对委托还不太了解的建议先看一下委托

使用方法很简单,通常在Start或者需要的地方录入一下监听事件,再去实际触发事件的地方调用一下事件触发,原监听的地方就可以收到事件:

using System;
using UnityEngine;

public class Test : MonoBehaviour
{
    private void Start()
    {
        //调用方法一:直接输入监听的事件名,事件回调的函数(无参)
        EventCenter.Instance.AddEventListener("LeftMouse1", LeftDown);
        //调用方法二:Lambda表达式中再去调用有参函数
        //本架构仅允许了一个参数的重载,如果有需求多个参数请自行扩写
        EventCenter.Instance.AddEventListener("LeftMouse2", (string str) => { LeftDown2(str); });
        //调用方法三:新建一个Action,去+需要的监听函数
        Action leftAction = LeftDown;
        leftAction += LeftDown3;
        EventCenter.Instance.AddEventListener("LeftMouse1", leftAction);
    }

    private void LeftDown()
    {
        Debug.Log("左键按下1");
    }

    private void LeftDown2(string name)
    {
        Debug.Log("左键按下2" + name);
    }

    private void LeftDown3()
    {
        Debug.Log("左键按下3");
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            //此处调用触发事件,参数需与录入监听的事件参数相同
            EventCenter.Instance.EventTrigger("LeftMouse1");
            EventCenter.Instance.EventTrigger("LeftMouse2", "xxxx");
        }
        if (Input.GetMouseButtonDown(1))
        {
            EventCenter.Instance.RemoveEventListener("LeftMouse1", LeftDown);
        }
    }
}

事件系统代码,基于单例:

using System;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 定义一个空接口,作为EventInfo的基类(使用基类存储子类),则字典中存储的为EventInfo类型
/// </summary>
public interface IEventInfo { }

/// <summary>
/// 将Action转化为泛型,包裹在EventInfo,则字典中存储的为EventInfo类型
/// </summary>
/// <typeparam name="T">T</typeparam>
public class EventInfo<T> : IEventInfo
{
    public Action<T> actions;
    public EventInfo(Action<T> action)
    {
        actions += action;
    }
}

/// <summary>
/// 用于不需要指定泛型的事件使用
/// </summary>
public class EventInfo : IEventInfo
{
    public Action actions;
    public EventInfo(Action action)
    {
        actions += action;
    }
}

/// <summary>
/// 事件中心
/// </summary>
public class EventCenter : Singleton<EventCenter>
{
    //用于储存所有事件的Dictionary
    private Dictionary<string, IEventInfo> m_EventDictionary = new Dictionary<string, IEventInfo>();

    /// <summary>
    /// 添加监听事件
    /// </summary>
    /// <param name="name"></param>
    /// <param name="action"></param>
    public void AddEventListener(string name, Action action)
    {
        if (m_EventDictionary.ContainsKey(name))
        {
            if (null == (m_EventDictionary[name] as EventInfo))
                Debug.LogError("添加了不同参数的委托");
            else
                (m_EventDictionary[name] as EventInfo).actions += action;
        }
        else
            m_EventDictionary.Add(name, new EventInfo(action));
    }

    /// <summary>
    /// 添加监听事件(有参)
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="name">事件名</param>
    /// <param name="action">带参数的委托</param>
    public void AddEventListener<T>(string name, Action<T> action)
    {
        if (m_EventDictionary.ContainsKey(name))
        {
            if (null == (m_EventDictionary[name] as EventInfo<T>))
                Debug.LogError("添加了不同参数的委托");
            else
                (m_EventDictionary[name] as EventInfo<T>).actions += action;
        }
        else
            m_EventDictionary.Add(name, new EventInfo<T>(action));
    }

    /// <summary>
    /// 移除监听
    /// </summary>
    /// <param name="name"></param>
    /// <param name="action"></param>
    public void RemoveEventListener(string name, Action action)//移除
    {
        if (m_EventDictionary.ContainsKey(name))
        {
            (m_EventDictionary[name] as EventInfo).actions -= action;
            if (null == m_EventDictionary[name])
                m_EventDictionary.Remove(name);
        }
    }

    /// <summary>
    /// 移除监听(有参)
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="name">事件名</param>
    /// <param name="action"></param>
    public void RemoveEventListener<T>(string name, Action<T> action)
    {
        if (m_EventDictionary.ContainsKey(name))
        {
            (m_EventDictionary[name] as EventInfo<T>).actions -= action;
            if (null == m_EventDictionary[name])
                m_EventDictionary.Remove(name);
        }
    }

    /// <summary>
    /// 触发事件
    /// </summary>
    /// <param name="name"></param>
    public void EventTrigger(string name)
    {
        if (null == (m_EventDictionary[name] as EventInfo))
        {
            Debug.LogError("调用了不同参数的委托");
        }
        else if ((m_EventDictionary[name] as EventInfo).actions != null)
            (m_EventDictionary[name] as EventInfo).actions.Invoke();
    }

    /// <summary>
    /// 触发事件(有参)
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="name"></param>
    /// <param name="info"></param>
    public void EventTrigger<T>(string name, T info)
    {
        if (null == (m_EventDictionary[name] as EventInfo<T>))
        {
            Debug.LogError("调用了不同参数的委托");
        }
        else if ((m_EventDictionary[name] as EventInfo<T>).actions != null)
            (m_EventDictionary[name] as EventInfo<T>).actions.Invoke(info);
    }

    /// <summary>
    /// 清空所有事件
    /// </summary>
    public void Clear()
    {
        m_EventDictionary.Clear();
    }

    /// <summary>
    /// 删除事件及其所有监听
    /// </summary>
    /// <param name="name">事件名</param>
    public void DeleteEvent(string name)
    {
        if (m_EventDictionary.ContainsKey(name))
        {
            m_EventDictionary.Remove(name);
        }
    }
}

相关文章

  • Eevee框架6——事件系统

    此处借鉴唐老师的事件系统。本人进行了书写规范化及一些非空判断避免报错等小优化。 如果对委托还不太了解的建议先看一下...

  • Eevee框架10——UI框架

    想要一个完美的UI框架,貌似太理想了,这里参考了唐老师、siki等能百度到的很多UI框架,发现大家都只是做了界面的...

  • Eevee框架1——序

    一个多月来学了很多东西,想综合起来做一个自己的框架,那就从今天开始,构建一个自己用着趁手的框架吧。 其实凉鞋的QF...

  • Eevee框架2——单例

    这里我们跟唐老师一样,先创建一个单例的基类,这样后续很多类都可以简单地实现单例。如果不了解单例的,唐老师的免费前几...

  • Eevee框架8——场景切换

    和对象池一样,本人场景切换用到的非常少(基本单场景搞定,因为个人感觉Unity自己加载第一个场景的速度,要远快于动...

  • Eevee框架7——Mono工具

    目前为止,我们已经有了单例、基于Mono的单例、对象池、事件系统四个轮子(工具),还需要继续造一些常用的工具。 一...

  • Eevee框架11——Json处理

    本篇开始我们开始进行数据的处理,在数据处理、资源处理完成后,我们就进行框架整合。数据处理首先是我们常用的Json处...

  • Eevee框架5——命名规范

    做着做着发现命名规则有必要统一一下,至少我本人需要统一一下,不能再随意命名了。本篇会根据开发过程中发现的命名问题,...

  • Eevee框架4——对象池

    这里先简述一下对象池的目的以及什么情况下需要对象池: 将部分需要持续性复用的物体(或对象)以隐藏/修改位置等方式先...

  • Eevee框架3——Mono单例

    基于mono的单例视频里也讲过了,这里我们同样稍微改进一下:这是被调用的类 这是发起调用的类,非常简单,直接调用就...

网友评论

      本文标题:Eevee框架6——事件系统

      本文链接:https://www.haomeiwen.com/subject/qerkjktx.html