📁Event


EventManager.cs📄

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

/// <summary>
/// 事件中心 单例模式对象
/// 
/// 1.Dictionary
/// 2.委托
/// 3.观察者设计模式
/// 4.泛型
/// 5.使用接口避免装箱拆箱
/// 
/// API:
/// 1.提供外部添加委托
/// 2.提供外部移除委托
/// 
/// 设计思路:
/// 1.模拟现实生活中的一个大厅房间的门牌号,门牌号为方法名字
/// 2.房间里面有很多信封,按照信中所说的做即可
/// </summary>
public class EventManager : Singleton<EventManager>
{
    //private Dictionary<string, UnityAction<object>> eventDic = new Dictionary<string, UnityAction<object>>();
    private Dictionary<string, IEventMassage> eventDic = new Dictionary<string, IEventMassage>();

    //添加委托
    public void AddEventListener<T>(string funName, UnityAction<T>  action)
    {
        if (eventDic.ContainsKey(funName))
        {
            //eventDic[funName] += callBack;
            (eventDic[funName] as EventMassage<T>).actions+=action;
        }
        else
        {
            eventDic.Add(funName, new EventMassage<T>(action));
        }
    }
    public void AddEventListener(string funName, UnityAction action)
    {
        if (eventDic.ContainsKey(funName))
        {
            //eventDic[funName] += callBack;
            (eventDic[funName] as EventMassage).actions += action;
        }
        else
        {
            eventDic.Add(funName, new EventMassage(action));
        }
    }
    //移除委托
    public void RemoveEventListener<T>(string funName, UnityAction<T> action)
    {
        if (eventDic.ContainsKey(funName))
        {
            //eventDic[funName] -= action;
            (eventDic[funName] as EventMassage<T>).actions -= action;
        }
    }
    public void RemoveEventListener(string funName, UnityAction action)
    {
        if (eventDic.ContainsKey(funName))
        {
            //eventDic[funName] -= action;
            (eventDic[funName] as EventMassage).actions -= action;
        }
    }
    //事件触发
    public void EventTrigger<T>(string funName,T massage)
    {
        if (eventDic.ContainsKey(funName)==false)
        {
            return;
        }
        //eventDic[funName]?.Invoke(obj);
        (eventDic[funName] as EventMassage<T>).actions?.Invoke(massage);
    }
    public void EventTrigger(string funName)
    {
        if (eventDic.ContainsKey(funName) == false)
        {
            return;
        }
        //eventDic[funName]?.Invoke(obj);
        (eventDic[funName] as EventMassage).actions?.Invoke();
    }

    /// <summary>
    /// 清空事件中心
    /// 
    /// 主要用在 场景切换时
    /// </summary>
    public void Clear()
    {
        eventDic.Clear();
    }
}
//为了避免装箱和拆箱,引入接口。
public interface IEventMassage { }
public class EventMassage<T> : IEventMassage
{
    public UnityAction<T> actions;

    public EventMassage(UnityAction<T> action)
    {
        this.actions = action;
    }
}
public class EventMassage : IEventMassage
{
    public UnityAction actions;

    public EventMassage(UnityAction action)
    {
        this.actions += action;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容