1.先看下怎么使用的
1)脚本中注册逻辑事件
void Start () { m_pGUICanvasObj = GameObject.Find("Canvas"); if(m_pGUICanvasObj != null) { m_pGUICanvasObj.SetActive(false); } //为当前MonoBehaviour脚本注册对于MENU_VISIBLE_CHANGED事件的监听器 EventDispatchModule.GetSingletonInstance().RegisterEventHandler(LOGIC_EVENT_ID.MENU_VISIBLE_CHANGED,this); }
2)脚本销毁时移除
void OnDestroy() {
//当脚本销毁时,移除监听器 EventDispatchModule.GetSingletonInstance().RemoveEventHandler(LOGIC_EVENT_ID.MENU_VISIBLE_CHANGED,this); }
3)发送全局逻辑事件
public void Btn_BackToGame() { m_bShowMenu = false; //这里全局逻辑事件传递的参数可以是任意类型的,以引用传递 EventDispatchModule.SendWrap<bool>(LOGIC_EVENT_ID.MENU_VISIBLE_CHANGED,ref m_bShowMenu); }
4)响应逻辑事件(这里暂时比较挫,没有以回调的形式体现,后面再改)
public bool HandMessage(LOGIC_EVENT_ID iLogicEventID, ref object obj) { switch(iLogicEventID) { case LOGIC_EVENT_ID.MENU_VISIBLE_CHANGED: { OnMenuVisibleChanged(); return true;//return true 表示其它监听器可以继续处理该事件,false表示吞噬事件 } default: break; } return true; }
2.实现细节
1)所有需要监听消息的类,实现EventListener接口
public interface EventListener { //return true-continue. //return false-end. bool HandMessage(LOGIC_EVENT_ID iLogicEventID,ref object obj); }
2)附上上文的XCraft.CtrlScript脚本代码
using UnityEngine; using System.Collections; using XCraft.HighLevelManager; using XCraft.Module; namespace XCraft.CtrlScript { public class GUICtrl : MonoBehaviour ,EventListener{ private bool m_bShowMenu = false; private GameObject m_pGUICanvasObj = null; public bool HandMessage(LOGIC_EVENT_ID iLogicEventID, ref object obj) { switch(iLogicEventID) { case LOGIC_EVENT_ID.MENU_VISIBLE_CHANGED: { OnMenuVisibleChanged(); return true; } default: break; } return true; } void OnDestroy() { EventDispatchModule.GetSingletonInstance().RemoveEventHandler(LOGIC_EVENT_ID.MENU_VISIBLE_CHANGED,this); } // Use this for initialization void Start () { m_pGUICanvasObj = GameObject.Find("Canvas"); if(m_pGUICanvasObj != null) { m_pGUICanvasObj.SetActive(false); } EventDispatchModule.GetSingletonInstance().RegisterEventHandler(LOGIC_EVENT_ID.MENU_VISIBLE_CHANGED,this); } // Update is called once per frame void Update () { ApplicationManager.GetSingletonInstance().UpdateInstances(Time.deltaTime); if(Input.GetKeyDown(KeyCode.Escape)) { m_bShowMenu = !m_bShowMenu; EventDispatchModule.SendWrap<bool>(LOGIC_EVENT_ID.MENU_VISIBLE_CHANGED,ref m_bShowMenu); } } private void OnMenuVisibleChanged() { if(m_bShowMenu == true) { Debug.Log("Show Menu"); if(m_pGUICanvasObj != null) { m_pGUICanvasObj.SetActive(true); } } else { Debug.Log("Close Menu"); if(m_pGUICanvasObj != null) { m_pGUICanvasObj.SetActive(false); } } } public void Btn_BackToGame() { m_bShowMenu = false; EventDispatchModule.SendWrap<bool>(LOGIC_EVENT_ID.MENU_VISIBLE_CHANGED,ref m_bShowMenu); } public void Btn_SaveAndReturn() { Application.LoadLevel("TitleScene"); } } }