153 lines
3.7 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Windows;
public interface IEventInfo//利用一个空的接口来承载泛型类,里氏转换原则
{
}
public class EventInfo<T> : IEventInfo
{
public UnityAction<T> action;
public EventInfo(UnityAction<T> action)
{
action += action;
}
}
public class EventInfo : IEventInfo
{
public UnityAction action;
public EventInfo(UnityAction action)
{
this.action += action;
}
}
/// <summary>
/// 事件中心
/// 1.字典 2.委托 3.观察者设计模式
/// 4.泛型
/// </summary>
public class EventCenter : BaseManager<EventCenter>
{
//key ---事件名字(比如:怪物死亡,玩家死亡,通关 等等)
//value --- 对应 监听这个事件 对应的委托函数
private Dictionary<string , IEventInfo> eventDic = new Dictionary<string , IEventInfo>();
/// <summary>
/// 添加事件监听
/// </summary>
/// <param name="name">事件的名字</param>
/// <param name="action">准备用来处理时间的委托函数</param>
public void AddEventListener<T>(string name,UnityAction<T> action)
{
//有没有对应的事件监听
//有的情况
if(eventDic.ContainsKey(name))
{
(eventDic[name] as EventInfo<T>).action += action;//已经有事件就往后排
}
//没有的情况
else
{
eventDic.Add(name, new EventInfo<T>(action));//没有就加一个
}
}
/// <summary>
/// 重载加入事件,不需要参数,没有泛型
/// </summary>
/// <param name="name"></param>
/// <param name="action"></param>
public void AddEventListener(string name, UnityAction action)
{
//有没有对应的事件监听
//有的情况
if (eventDic.ContainsKey(name))
{
(eventDic[name] as EventInfo).action += action;//已经有事件就往后排
}
//没有的情况
else
{
eventDic.Add(name, new EventInfo(action));//没有就加一个
}
}
/// <summary>
/// 减去事件监听
/// 事件有加就有减
/// </summary>
/// <param name="name"></param>
/// <param name="action"></param>
public void RemoveEventListener<T>(string name, UnityAction<T> action)
{
if(eventDic.ContainsKey(name))
{
(eventDic[name] as EventInfo<T>).action -= action;
}
}
/// <summary>
/// 重载事件移除,没有泛型
/// </summary>
/// <param name="name"></param>
/// <param name="action"></param>
public void RemoveEventListener(string name, UnityAction action)
{
if (eventDic.ContainsKey(name))
{
(eventDic[name] as EventInfo).action -= action;
}
}
/// <summary>
/// 事件触发
/// </summary>
/// <param name="name">哪一个名字的事件触发了</param>
public void EventTrigger<T>(string name,T info)
{
if(eventDic.ContainsKey(name))
{
if((eventDic[name] as EventInfo<T>).action != null)
{
(eventDic[name] as EventInfo<T>).action.Invoke(info);
}
// eventDic[name].Invoke(info);//有就触发事件
}
}
/// <summary>
/// 重载事件触发,没有泛型
/// </summary>
/// <param name="name"></param>
/// <param name="info"></param>
public void EventTrigger(string name)
{
if (eventDic.ContainsKey(name))
{
if ((eventDic[name] as EventInfo).action != null)
{
(eventDic[name] as EventInfo).action.Invoke();
}
// eventDic[name].Invoke(info);//有就触发事件
}
}
/// <summary>
/// 清空事件中心,主要用在场景切换时
/// </summary>
public void Clear()
{
eventDic.Clear();
}
}