using System;
using System.Collections.Generic;
public class EventManager
{
static EventManager _instance;
public static EventManager instance
{
get
{
if (_instance == null)
{
_instance = new EventManager();
}
return _instance;
}
}
Dictionary<GameEvent, List<Action<List<object>>>> eventsDic =
new Dictionary<GameEvent, List<Action<List<object>>>>();
public void AddEvent(GameEvent gameEvent, Action<List<object>> callback)
{
if (!eventsDic.ContainsKey(gameEvent))
{
eventsDic[gameEvent] = new List<Action<List<object>>>();
}
eventsDic[gameEvent].Add(callback);
}
public void RemoveEventDirectly(GameEvent gameEvent)
{
if (eventsDic.ContainsKey(gameEvent))
{
eventsDic.Remove(gameEvent);
}
else
{
XESUniDebug.Log($"eventsDic doesn't ContainsKey {gameEvent}");
}
}
public void RemoveEventFunc(GameEvent gameEvent, Action<List<object>> callback)
{
List<Action<List<object>>> actions;
if (eventsDic.TryGetValue(gameEvent, out actions))
{
actions.Remove(callback);
}
else
{
XESUniDebug.Log($"eventsDic doesn't ContainsKey {gameEvent}");
}
}
public void SendEvent(GameEvent gameEvent, List<object> parameters = null)
{
if (eventsDic.ContainsKey(gameEvent))
{
var events = eventsDic[gameEvent];
for (int i = 0; i < events.Count; i++)
{
var eventAction = events[i];
eventAction(parameters);
}
}
else
{
XESUniDebug.Log($"eventsDic doesn't ContainsKey {gameEvent}");
}
}
}
在项目开发多人合作模式下,这个事件管理类显得尤为重要。比如一个人负责接口、一个人负责UI、另一个人负责游戏主体流程时,接口调用完成后发送一个事件即可,并把相关数据法出去。UI或者游戏主体流程中都可通过AddEvent来监听这个事件。
private void OnEnable()
{
//地图加载完成
EventManager.instance.AddEvent(GameEvent.DynamicMapProgress, DynamicMapFinish);
}
private void OnDisable()
{
EventManager.instance.RemoveEventFunc(GameEvent.DynamicMapProgress, DynamicMapFinish);
}
private void DynamicMapFinish(List<object> data)
{
Debug.Log("地图加载完成");
if((string)data[0]=="success")
{
}
}
//接口请求成功完成
private void HttpFinish()
{
//...
EventManager.instance.SendEvent(GameEvent.DynamicMapProgress,
new List<object> {"success"});
}