我們在游戲開發(fā)中,消息事件的分法及響應應用的十分廣泛,甚至有時候用得有些泛濫導致架構的失控以及理解代碼的難度有所上升、查bug難以定位等問題。所以,有個統(tǒng)一的事件管理類,對游戲中所有的事件進行管理和統(tǒng)一的調(diào)用是很有必要的。
事件類EventManager
public class EventManager
{
public delegate void Arg0EventHandler();
public delegate void Arg1EventHandler(object arg1);
public delegate void Arg2EventHandler(object arg1, object arg2);
public delegate void Arg3EventHandler(object arg1, object arg2, object arg3);
public delegate void Arg4EventHandler(object arg1, object arg2, object arg3, object arg4);
public delegate void ArgsEventHandler(params object[] paramList);
public static class EventExtensions
{
public static void Fire(this EventManager.Arg0EventHandler eventHandler)
{
if (eventHandler != null)
{
eventHandler();
}
}
public static void Fire(this EventManager.Arg1EventHandler eventHandler, object obj)
{
if (eventHandler != null)
{
eventHandler(obj);
}
}
public static void Fire(this EventManager.Arg2EventHandler eventHandler, object obj1, object obj2)
{
if (eventHandler != null)
{
eventHandler(obj1, obj2);
}
}
public static void Fire(this EventManager.Arg3EventHandler eventHandler, object obj1, object obj2, object obj3)
{
if (eventHandler != null)
{
eventHandler(obj1, obj2, obj3);
}
}
public static void Fire(this EventManager.Arg4EventHandler eventHandler,object obj1, object obj2, object obj3, object obj4)
{
if (eventHandler != null)
{
eventHandler(obj1, obj2, obj3, obj4);
}
}
public static void Fire(this EventManager.ArgsEventHandler eventHandler, params object[] objs)
{
if (eventHandler != null)
{
eventHandler(objs);
}
}
}
注意,事件的參數(shù)最好控制在4個以內(nèi),再多的話還是建議用params object[] objs
事件聲明
事件的聲明可以有兩種方式
第一種:直接聲明
public Arg0EventHandler TestEvt0;
第二種:根據(jù)類劃分事件模塊
#region Test Events
public class TestEvent
{
public Arg0EventHandler TestEvt0;
}
private readonly EventManager.TestEvent testEvents = new TestEvent();
public TestEvent TestEvents
{
get { return testEvents; }
}
#endregion
事件注冊/銷毀
在初始化時注冊,比如Start()
Game.Instance.EventMgr.TestEvt0 += OnTestEvt;
在銷毀時反注冊,比如OnDestroy()
Game.Instance.EventMgr.TestEvt0 -= OnTestEvt;
注意:這里的EventMgr是游戲全局管理單例類Game的一個引用,如果你不用這種方式,也可以把EventManager設置成單例類,然后EventManager.Instance.TestEvt0這樣調(diào)用都行。
事件觸發(fā)
在以上代碼可以看到,EventManager使用了靜態(tài)的擴展類EventExtensions,所以我們的事件觸發(fā)調(diào)用很簡單:
Game.Instance.EventMgr.TestEvt0.Fire();
或
Game.Instance.EventMgr.TestEvent.TestEvt0.Fire();
帶參數(shù)
Game.Instance.EventMgr.TestEvt1.Fire(123);
Game.Instance.EventMgr.TestEvent.TestEvt2.Fire(123,"123");
只要注冊了對應的事件,即可接受到觸發(fā)的事件,然后把裝箱參數(shù)object,拆箱強轉(zhuǎn)一下即可使用,如:
void OnTestEvt(object obj1, object obj2)
{
int num = (int)obj1;
string str = obj2.ToString();
//TODO...
}
是不是很簡單實用?喜歡就點個贊吧~謝謝!
Ricky Yang個人原創(chuàng),版權所有,轉(zhuǎn)載注明,謝謝。