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"});
}
更新优化:
多个委托实例组合成一个新的委托,那事件监听时Dictionary<String, List<Action<List<object>>>> eventsDic = new();没有必要。改成
Dictionary<string, Action<object[]>> mMessageDict = new Dictionary<string, Action<object[]>>(32);就够了:
public class MessageManager
{
static MessageManager mInstance;
public static MessageManager Instance
{
get
{
return mInstance ?? (mInstance = new MessageManager());
}
}
Dictionary<string, Action<object[]>> mMessageDict = new Dictionary<string, Action<object[]>>(32);
private MessageManager() { }
//订阅消息
public void AddEvent(string message, Action<object[]> action)
{
Action<object[]> value = null;
//已有消息则追加绑定
if (mMessageDict.TryGetValue(message, out value))
{
value += action;
mMessageDict[message] = value;
}
else
{
mMessageDict.Add(message, action);
}
}
//取消消息订阅
public void RemoveEvent(string message)
{
mMessageDict.Remove(message);
}
//分发消息
public void Send(string message, object[] args = null)
{
Action<object[]> value = null;
if (mMessageDict.TryGetValue(message, out value))
value(args);
}
}