事件監聽器
事件類型
public enum BaseHEventType {
GAME_OVER,
GAME_WIN,
PAUSE,
ENERGY_EMEPTy,
GAME_DATA
}
事件基類
public class BaseHEvent
{
protected Hashtable m_arguments;
protected BaseHEventType m_type;
protected Object m_Sender;
public IDictionary Params {
get { return this.m_arguments; }
set { this.m_arguments = (value as Hashtable); }
}
public BaseHEventType Type {//事件類型 構造函數會給Type 和Sender賦值
get { return this.m_type; }
set { this.m_type = value; }
}
public Object Sender {//物體
get { return this.m_Sender; }
set { this.m_Sender = value; }
}
public override string ToString()
{
return this.m_type + "[" + ((this.m_Sender == null) ? "null" : this.m_Sender.ToString()) + "]";
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="type"> 事件類型 </param>
/// <param name="sender"> 物體 </param>
public BaseHEvent(BaseHEventType type, Object sender)
{
this.Type = type;
Sender = sender;
if (this.m_arguments == null)
{
this.m_arguments = new Hashtable();
Debug.LogError("this.m_arguments" + this.m_arguments.Count);
}
}
public BaseHEvent (BaseHEventType type,Hashtable args,Object sender)
{
this.Type = type;
this.m_arguments = args;
Sender = sender;
if (this.m_arguments == null)
{
this.m_arguments = new Hashtable();
}
}
public BaseHEvent Clone()
{
return new BaseHEvent(this.m_type, this.m_arguments, Sender);
}
}
事件機制
public delegate void HEventListenerDelegate(BaseHEvent hEvent);//定義委託用於傳事件基類
public class HEventDispatcher
{
static HEventDispatcher Instance;
public static HEventDispatcher GetInstance()//單利
{
if (Instance == null)
{
Instance = new HEventDispatcher();
}
return Instance;
}
private Hashtable listeners = new Hashtable(); //掌控全部類型的委託事件
public void AddEventListener(BaseHEventType type,HEventListenerDelegate listener)
{
HEventListenerDelegate hEventListenerDelegate = this.listeners[type] as HEventListenerDelegate;//得到以前這個類型的委託 若是第一次等於Null
hEventListenerDelegate = (HEventListenerDelegate) Delegate.Combine(hEventListenerDelegate, listener);//將兩個委託的調用列表鏈接在一塊兒,成爲一個新的委託
this.listeners[type] = hEventListenerDelegate;//賦值給哈希表中的這個類型
}
public void RemoveEventListener(BaseHEventType type, HEventListenerDelegate listener)
{
HEventListenerDelegate hEventListener = this.listeners[type] as HEventListenerDelegate;//得到以前這個類型的委託 若是第一次等於Null
if (hEventListener != null)
{
hEventListener =(HEventListenerDelegate)Delegate.Remove(hEventListener, listener);//從hEventListener的調用列表中移除listener
this.listeners[type] = hEventListener;//賦值給哈希表中的這個類型
}
}
public void DispatchEvent(BaseHEvent baseH)
{
HEventListenerDelegate hEventListener = this.listeners[baseH.Type] as HEventListenerDelegate;
if (hEventListener != null)
{
try
{
hEventListener(baseH);//執行委託
}
catch (Exception e)
{
throw new System.Exception(string.Concat(new string[] { "Error Dispatch event", baseH.Type.ToString(), ":", e.Message, " ", e.StackTrace }), e);
}
}
}
public void RemoveAll()
{
this.listeners.Clear();
}
}
調用方法 下面是我在Unity當中調用的
//註冊/添加事件
void Start()
{
HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA,StartHEvent);
HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_DATA, StartDataEvent);
HEventDispatcher.GetInstance().AddEventListener(BaseHEventType.GAME_WIN,StopHEvent);
}
//事件分發
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_DATA, this));
}
if (Input.GetKeyDown(KeyCode.S))
{
HEventDispatcher.GetInstance().DispatchEvent(new BaseHEvent(BaseHEventType.GAME_WIN, this));
}
}
//事件移除
private void OnDestroy()
{
HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_DATA, StartHEvent);
HEventDispatcher.GetInstance().RemoveEventListener(BaseHEventType.GAME_WIN, StopHEvent);
}
//添加事件方法
void StartDataEvent(BaseHEvent hEvent)
{
Debug.Log("Doule" +hEvent.ToString());
}
void StartHEvent(BaseHEvent hEvent)
{
Debug.Log("StartHEvent + HEvent" + hEvent.ToString());
}
void StopHEvent(BaseHEvent hEvent)
{
Debug.Log("StopHEvent + HEvent" + hEvent.ToString());
}