我們?cè)谟螒蜷_發(fā)中颖医,消息事件的分法及響應(yīng)應(yīng)用的十分廣泛,甚至有時(shí)候用得有些泛濫導(dǎo)致架構(gòu)的失控以及理解代碼的難度有所上升裆蒸、查bug難以定位等問題熔萧。所以,有個(gè)統(tǒng)一的事件管理類僚祷,對(duì)游戲中所有的事件進(jìn)行管理和統(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個(gè)以內(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
事件注冊(cè)/銷毀
在初始化時(shí)注冊(cè)俺榆,比如Start()
Game.Instance.EventMgr.TestEvt0 += OnTestEvt;
在銷毀時(shí)反注冊(cè),比如OnDestroy()
Game.Instance.EventMgr.TestEvt0 -= OnTestEvt;
注意:這里的EventMgr是游戲全局管理單例類Game的一個(gè)引用装哆,如果你不用這種方式罐脊,也可以把EventManager設(shè)置成單例類,然后EventManager.Instance.TestEvt0這樣調(diào)用都行蜕琴。
事件觸發(fā)
在以上代碼可以看到萍桌,EventManager使用了靜態(tài)的擴(kuò)展類EventExtensions,所以我們的事件觸發(fā)調(diào)用很簡(jiǎn)單:
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");
只要注冊(cè)了對(duì)應(yīng)的事件凌简,即可接受到觸發(fā)的事件上炎,然后把裝箱參數(shù)object,拆箱強(qiáng)轉(zhuǎn)一下即可使用雏搂,如:
void OnTestEvt(object obj1, object obj2)
{
int num = (int)obj1;
string str = obj2.ToString();
//TODO...
}
是不是很簡(jiǎn)單實(shí)用藕施?喜歡就點(diǎn)個(gè)贊吧~謝謝!
Ricky Yang個(gè)人原創(chuàng)凸郑,版權(quán)所有裳食,轉(zhuǎn)載注明,謝謝芙沥。