当怪物死亡,可能会触发玩家金币增加、另一种怪物重生、跳转到下一关等事件,如果通过事件监听的方法来处理这个过程,会让程序耦合性增加,侦听效率很低。
因此我设计了一个简单的事件中心模块,将怪物死亡这个事分发到事件中心,需要根据怪物死亡来处理相关逻辑的事件可以直接侦听。
using System.Collections.Generic;
using UnityEngine.Events;
//1.字典
//2.委托
//3.观察者模式
//事件信息接口
public interface IEventInfo
{
}
//事件信息类
//事件侦听依赖于接口
//有参数的事件
public class EventInfo<T>:IEventInfo
{
public UnityAction<T> actions;
public EventInfo(UnityAction<T> action)
{
this.actions+=action;
}
}
//无参数的事件
public class EventInfo:IEventInfo
{
public UnityAction actions;
public EventInfo(UnityAction action)
{
this.actions+=action;
}
}
public class EventCenter : BaseManager<EventCenter>
{
//事件集合
private Dictionary<string,IEventInfo> eventDic=new Dictionary<string, IEventInfo>();
//添加侦听事件
public void AddEventListener<T>(string name,UnityAction<T> action)
{
if(eventDic.ContainsKey(name))
{
(eventDic[name] as EventInfo<T>).actions+=action;
}
else
{
eventDic.Add(name,new EventInfo<T>(action));
}
}
public void AddEventListener(string name,UnityAction action)
{
if(eventDic.ContainsKey(name))
{
(eventDic[name] as EventInfo).actions+=action;
}
else
{
eventDic.Add(name,new EventInfo(action));
}
}
//对象被移除时,必须移除对应的侦听函数
public void RemoveEventListener<T>(string name,UnityAction<T> action)
{
if(eventDic.ContainsKey(name))
{
(eventDic[name] as EventInfo<T>).actions-=action;
}
}
public void RemoveEventListener(string name,UnityAction action)
{
if(eventDic.ContainsKey(name))
{
(eventDic[name] as EventInfo).actions-=action;
}
}
//事件触发方法
public void EventTrigger<T>(string name,T info)
{
if(eventDic.ContainsKey(name))
{
if((eventDic[name] as EventInfo<T>).actions!=null)
(eventDic[name] as EventInfo<T>).actions.Invoke(info);
}
}
public void EventTrigger(string name)
{
if(eventDic.ContainsKey(name))
{
if((eventDic[name] as EventInfo).actions!=null)
(eventDic[name] as EventInfo).actions.Invoke();
}
}
//清除所有事件
public void Clear()
{
eventDic.Clear();
}
}