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;
}
}