观察者模式定义了对象之间的一对多依赖关系。
当一个对象的状态发生变化时,所有依赖它的对象都会收到通知并自动更新。常用于事件系统、UI 更新等。这里拿角色死亡举例:
核心代码就是对事件中心的使用:
public interface IEventInfo { }
public class EventInfo<T>: IEventInfo
{
public UnityAction<T> action;
}
public class EventInfo : IEventInfo
{
public UnityAction action;
}
public class EventManager
{
private static EventManager instance;
public static EventManager Instance
{
get
{
if (instance==null)
{
instance = new EventManager();
}
return instance;
}
}
public Dictionary<string, IEventInfo> actionDic = new Dictionary<string, IEventInfo>();
//添加事件 - 没有泛型
public void AddEventListener(string name,UnityAction action)
{
if (actionDic.ContainsKey(name))
{
(actionDic[name] as EventInfo).action += action;
}
else
{
actionDic.Add(name,new EventInfo() { action=action});
}
}
//添加事件 - 有泛型
public void AddEventListener<T>(string name, UnityAction<T> action)
{
if (actionDic.ContainsKey(name))
{
(actionDic[name] as EventInfo<T>).action += action;
}
else
{
actionDic.Add(name, new EventInfo<T>() { action = action });
}
}
//移除事件 - 没有泛型
public void RemoveEventListener(string name, UnityAction action)
{
if (actionDic.ContainsKey(name))
{
(actionDic[name] as EventInfo).action -= action;
}
}
//移除事件 - 有泛型
public void RemoveEventListener<T>(string name, UnityAction<T> action)
{
if (actionDic.ContainsKey(name))
{
(actionDic[name] as EventInfo<T>).action -= action;
}
}
//触发事件 - 没有泛型
public void TriggerEventListener(string name)
{
if (actionDic.ContainsKey(name))
{
(actionDic[name] as EventInfo).action?.Invoke();
}
}
//触发事件 - 有泛型
public void TriggerEventListener<T>(string name,T par)
{
if (actionDic.ContainsKey(name))
{
(actionDic[name] as EventInfo<T>).action.Invoke(par);
}
}
//清空事件
public void Clean()
{
actionDic.Clear();
}
在项目开始时候加入事件方法,在某一个状态变化时候触发事件