首先 ,需要监听消息的类要继承的接口:
/// <summary> /// 消息监听接口 挂载在需要监听的类上 如UI类 /// </summary> public interface IEventListener { /// <summary> /// 处理消息 /// </summary> /// <param name="id">消息ID</param> /// <param name="param1"></param> /// <param name="param2"></param> /// <returns>是否终止消息派发</returns> bool HandleEvent(int id , object param1 , object param2); /// <summary> ///消息优先级 /// </summary> /// <returns></returns> int EventPriority(); }
然后是消息发送者要继承的消息管理
/* 作者: bambom 创建时间: 脚本: 这是一个脚本 */ using UnityEngine; using System.Collections; using System.Collections.Generic; public class EventNote : MonoBehaviour { /// <summary> /// 节点优先级 /// </summary> public int EventNodePriority { set; get; } /// <summary> /// 所有消息集合 /// </summary> private Dictionary<int , List<IEventListener>> mListener = new Dictionary<int , List<IEventListener>>(); /// <summary> /// 消息节点 /// </summary> private List<EventNote> mNodeList = new List<EventNote>(); /// <summary> /// 挂载一个消息节点到当前的节点上 /// </summary> /// <param name="node">消息节点</param> /// <returns>如果节点上已经包含要添加的节点 返回false</returns> public bool AttachEventNode(EventNote node) { if(node==null) { return false; } if(mNodeList.Contains(node)) { return false; } int pos = 0; for(int i=0;i<mNodeList.Count;i++) { if(node.EventNodePriority>mNodeList[i].EventNodePriority) { break; } pos++; } mNodeList.Insert(pos , node); return true; } /// <summary> /// 卸载一个消息节点 /// </summary> /// <param name="node">消息节点</param> /// <returns>如果节点不存在 就返回false</returns> public bool DetachEventNode(EventNote node) { if(!mNodeList.Contains(node)) { return false; } mNodeList.Remove(node); return true; } /// <summary> /// 挂载一个消息监听器到当前消息节点 /// </summary> /// <param name="key">消息ID</param> /// <param name="listener"> 消息监听器</param> /// <returns></returns> public bool AttachEventListener(int key , IEventListener listener) { if(listener==null) { return false; } if(!mListener.ContainsKey(key)) { mListener.Add(key , new List<IEventListener>() { listener }); return true; } if(mListener[key].Contains(listener)) { return false; } int pos = 0; for(int i=0;i<mListener[key].Count;i++) { if(listener.EventPriority()>mListener[key][i].EventPriority()) { break; } pos++; } mListener[key].Insert(pos , listener); return true; } /// <summary> /// 卸载一个消息节点 /// </summary> /// <param name="key"></param> /// <param name="listener"></param> /// <returns> 如果当前消息节点不存在那么返回 false</returns> public bool DetachEventListener(int key,IEventListener listener) { if(mListener.ContainsKey(key)&& mListener[key].Contains(listener)) { mListener[key].Remove(listener); return true; } return false; } public void SendEvent(int key,object param1=null,object param2=null) { DispatchEvent(key , param1 , param2); } /// <summary> /// 派发消息到子消息节点以及自己节点下的监听器上 /// </summary> /// <param name="key"><消息ID/param> /// <param name="param1"></param> /// <param name="param2"></param> private bool DispatchEvent(int key , object param1 , object param2) { for(int i=0;i<mNodeList.Count;i++) { if(mNodeList[i].DispatchEvent(key,param1,param2)) return true; } return TriggerEvent(key , param1 , param2); } /// <summary> /// 消息触发 /// </summary> /// <param name="key">消息id</param> /// <param name="param1"></param> /// <param name="param2"></param> /// <returns>是否中断</returns> private bool TriggerEvent(int key , object param1 , object param2) { if (!this.gameObject.activeSelf || !this.gameObject.activeInHierarchy)//还要一个判定条件||!this.gameObject. { return false; } //当前消息集合里 不含有这条消息 if(!mListener.ContainsKey(key)) { return false; } List<IEventListener> listeners=mListener[key]; for(int i=0;i<listeners.Count;i++) { if(listeners[i].HandleEvent(key,param1,param2)) return this; } return false; } /// <summary> /// /// </summary> void OnApplicationQuit() { mListener.Clear(); mNodeList.Clear(); } }
测试: