基于消息机制的万能框架
public class MonoBase : MonoBehaviour { public virtual void Execute(int eventCode, object message) { } }
public class ManagerBase : MonoBase { /// <summary> /// 处理自身的消息 /// </summary> /// <param name="eventCode">Event code.</param> /// <param name="message">Message.</param> public override void Execute(int eventCode, object message) { if (!dict.ContainsKey(eventCode)) { Debug.LogWarning("没有注册 : " + eventCode); return; } //一旦注册过这个消息 给所有的脚本 发过去 List<MonoBase> list = dict[eventCode]; for (int i = 0; i < list.Count; i++) { list[i].Execute(eventCode, message); } } private Dictionary<int,List<MonoBase>> dict = new Dictionary<int, List<MonoBase>>(); /// <summary> /// 添加事件 /// </summary> /// <param name="eventCode">Event code.</param> /// <param name="mono">Mono.</param> public void Add(int eventCode, MonoBase mono) { List<MonoBase> list = null; //之前没有注册过 if (!dict.ContainsKey(eventCode)) { list = new List<MonoBase>(); list.Add(mono); dict.Add(eventCode, list); return; } //之前注册过 list = dict[eventCode]; list.Add(mono); } /// <summary> /// 添加多个事件 /// 一个脚本关心多个事件 /// </summary> /// <param name="eventCode">Event code.</param> public void Add(int[] eventCodes, MonoBase mono) { for (int i = 0; i < eventCodes.Length; i++) { Add(eventCodes[i], mono); } } /// <summary> /// 移除事件 /// </summary> /// <param name="eventCode">Event code.</param> /// <param name="mono">Mono.</param> public void Remove(int eventCode, MonoBase mono) { if (!dict.ContainsKey(eventCode)) { Debug.LogWarning("没有这个消息" + eventCode + "注册"); return; } List<MonoBase> list = dict[eventCode]; if (list.Count == 1) dict.Remove(eventCode); else list.Remove(mono); } /// <summary> /// 移除多个 /// </summary> /// <param name="eventCode">Event code.</param> /// <param name="mono">Mono.</param> public void Remove(int[] eventCodes, MonoBase mono) { for (int i = 0; i < eventCodes.Length; i++) { Remove(eventCodes[i], mono); } } }
/// <summary> /// 消息处理中心 /// </summary> public class MsgCenter : MonoBase { public static MsgCenter Instance = null; void Awake() { Instance = this; gameObject.AddComponent<AudioManager>(); gameObject.AddComponent<UIManager>(); gameObject.AddComponent<NetManager>(); gameObject.AddComponent<CharacterManager>(); gameObject.AddComponent<SceneMgr>(); DontDestroyOnLoad(gameObject); } /// <summary> /// 参数:区域码、消息、消息参数 /// </summary> /// <param name="areaCode"></param> /// <param name="eventCode"></param> /// <param name="message"></param> public void Dispatch(int areaCode, int eventCode, object message) { switch (areaCode) { case AreaCode.AUDIO: AudioManager.Instance.Execute(eventCode, message); break; case AreaCode.CHARACTER: CharacterManager.Instance.Execute(eventCode, message); break; case AreaCode.NET: NetManager.Instance.Execute(eventCode, message); break; case AreaCode.GAME: break; case AreaCode.UI: UIManager.Instance.Execute(eventCode, message); break; case AreaCode.SCENE: SceneMgr.Instance.Execute(eventCode, message); break; default: break; } } }
public class AreaCode { /// <summary> /// UI模块 /// </summary> public const int UI = 0; /// <summary> /// GAME模块 /// </summary> public const int GAME = 1; /// <summary> /// CHARACTER模块 /// </summary> public const int CHARACTER = 2; /// <summary> /// NET模块 /// </summary> public const int NET = 3; /// <summary> /// AUDIO模块 /// </summary> public const int AUDIO = 4; /// <summary> /// SCENE模块 /// </summary> public const int SCENE = 5; //.... }
public class UIBase : MonoBase { /// <summary> /// 自身关心的消息集合 /// </summary> private List<int> list = new List<int>(); /// <summary> /// 绑定一个或多个消息 /// </summary> /// <param name="eventCodes">Event codes.</param> protected void Bind(params int[] eventCodes) { list.AddRange(eventCodes); UIManager.Instance.Add(list.ToArray(), this); } /// <summary> /// 接触绑定的消息 /// </summary> protected void UnBind() { UIManager.Instance.Remove(list.ToArray(), this); list.Clear(); } /// <summary> /// 自动移除绑定的消息 /// </summary> public virtual void OnDestroy() { if (list != null) UnBind(); } /// <summary> /// 发消息 /// </summary> /// <param name="areaCode">Area code.</param> /// <param name="eventCode">Event code.</param> /// <param name="message">Message.</param> public void Dispatch(int areaCode, int eventCode, object message) { MsgCenter.Instance.Dispatch(areaCode, eventCode, message); } }
public class UIManager : ManagerBase { public static UIManager Instance = null; void Awake() { Instance = this; } }
UIEvent:
/// <summary> /// 存储所有的UI消息 /// </summary> public class UIEvent { public const int START_PANEL = 0;//设置开始面板的显示 public const int REGIST_PANE = 1;//设置注册面板的显示 }
PanelA:
public class PanelA : UIBase { private void Awake() { Bind(UIEvent.START_PANEL);//添加对消息的关心 } public override void Execute(int eventCode, object message) { switch (eventCode) //对消息的处理 { case UIEvent.START_PANEL: DoSomeThing(); break; default: break; } } }