實現(xiàn)自定義事件管理類

我們在游戲開發(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)載注明,謝謝。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的。 ??事件,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,678評論 1 11
  • 0410 晨讀 看到“20小時快速學會技能”的標題,我的眼睛都發(fā)亮了。真的嗎?可以嗎?我一定要好好的學。帶著心里的...
    泉布閱讀 177評論 7 1
  • 今天在家大掃除的時候,小檸檬一個人自己玩樂高,不久很高興的喊著,媽媽看。原來現(xiàn)在能把積木扣的有模有樣。還弄了個動物...
    Sweet檸檬閱讀 630評論 0 0
  • “趣味數(shù)學”的課程安排初步擬定為:撲克牌游戲、金字塔魔方和數(shù)獨游戲。 來自八個班級的二年級學生隨機兩人一組,結(jié)合成...
    A_thinker閱讀 1,798評論 0 0
  • 天黑的越來越早,像個遲暮之年的老人,下班還沒到家,就合上了雙眸,于是冬夜的網(wǎng)從天而降,將人事物都捕獵進去。 風越來...
    以勒閱讀 209評論 0 1

友情鏈接更多精彩內(nèi)容