Common(五)—— 消息系统(一):简单的EventCenter

源码里面有一个消息系统,把这个消息系统挖出来,然后单独的一个EventCenter就出来了,文章最后面会有演示如何使用.
先来看看都有哪些文件:
Assets/Scripts/Common/目录下
Callback.cs,
Event.cs,
EventCenter.cs,
EventDefine.cs.

Callback.cs:

//无参数
public delegate void Callback();
//一个参数
public delegate void Callback<T>(T arg1);
//两个参数
public delegate void Callback<T, U>(T arg1, U arg2);
//三个参数
public delegate void Callback<T, U, V>(T arg1, U arg2, V arg3);
//四个参数
public delegate void Callback<T, U, V, X>(T arg1, U arg2, V arg3, X arg4);

Event.cs:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

public class CEvent
{
    //Event类型
    private EGameEvent eventId;

    //参数表
    private Dictionary<string, object> paramList;

    public CEvent()
    {
        paramList = new Dictionary<string, object> ();
    }

    public CEvent(EGameEvent id)
    {
        eventId = id;
        paramList = new Dictionary<string, object> ();
    }

    public EGameEvent GetEventId()
    {
        return eventId;
    }

    public void AddParam(string name, object value)
    {
        paramList [name] = value;
    }

    public object GetParam(string name)
    {
        if (paramList.ContainsKey(name))
        {
            return paramList [name];
        }
        return null;
    }

    public bool HasParam(string name)
    {
        if (paramList.ContainsKey(name))
        {
            return true;
        }
        return false;
    }

    public int GetParamCount()
    {
        return paramList.Count;
    }

    public Dictionary<string, object> GetParamList()
    {
        return paramList;
    }
}

EventDefine.cs

using UnityEngine;
using System.Collections;

//Event事件enum
public enum EGameEvent
{
    eGameEvent_ErrorStr = 1,
    eGameEvent_ConnectServerFail,
    eGameEvent_ConnectServerSuccess,

    eGameEvent_ReConnectSuccess,
    eGameEvent_ReConnectFail,

    eGameEvent_InputUserData,

    eGameEvent_SelectServer,

    eGameEvent_IntoLobby,

    eGameEvent_IntoRoom,

    eGameEvent_RoomBack,

    eGameEvent_RoomEnd,

    eGameEvent_IntoHero,

    eGameEvent_Loading,

    eGameEvent_LoadingEnd,

    eGameEvent_GameOver,

    eGameEvent_ReConnectToBattle,

    eGameEvent_BattleFinished,

    eGameEvent_AskReadySucces,
    eGameEvent_AskLeaveBattleSucces,
    eGameEvent_BattleStateChange,
    eGameEvent_AskComplementedRegisterInfo,

    eGameEvent_AskAddInBattle,
    eGameEvent_TheBattleUserFull,
    eGameEvent_NullBattle,
    eGameEvent_BattlePDWNotMatch,
    eGameEvent_NullUser,
    eGameEvent_InvalidMapID,
    eGameEvent_InvalidBattlePos,
    eGameEvent_JustInBattle,

    eGameEvent_JustNotInBattle,
    eGameEvent_UserDonotInTheBattle,
    eGameEvent_InvalidBattleState,
    eGameEvent_YouAreNotBattleManager,
    eGameEvent_NotAllUserReady,

    eGameEvent_NotEnoughGold,

    eGameEvent_Reborn,
    eGameEvent_PlayerEnterAlter,

    eGameEvent_ChangeMapState,

    eGameEvent_UpdateUserGameItems,
    eGameEvent_GameStartTime,



    eGameEvent_OpenUIPlay,

    eGameEvent_SceneChange,
    eGameEvent_SystemNoticeCreatePrefab,

    eGameEvent_CreateDailyBonus,
    eGameEvent_DailyBonus,
    eGameEvent_RemoveDailyBonus,
    eGameEvent_ChangeMoney,
    eGameEvent_UpdateMiniMap,
    eGameEvent_InitMiniMap,
    eGameEvent_AddMiniMap,
    eGameEvent_RemoveMiniMap,
    eGameEvent_BroadcastBeAtk,
    eGameEvent_RemoveMiniWarning,

    eGameEvent_AllPlayerGoods,
    eGameEvent_AllPlayerAssist,
    eGameEvent_AllPlayerKills,
    eGameEvent_AllPlayerDeaths,
    eGameEvent_AllPlayerCp,
    eGameEvent_AllPlayerLevel,
    eGameEvent_AllPlayerLastHit,

    eGameEvent_NotifyChangeKills,
    eGameEvent_NotifyChangeDeaths,
    eGameEvent_LocalPlayerCp,
    eGameEvent_PlayerGetCp,
    eGameEvent_LocalPlayerAssist,

    eGameEvent_UpLv,


    eGameEvent_BeginWaiting,
    eGameEvent_EndWaiting,

    eGameEvent_MatchNumber,

    eGameEvent_EntityHpChange, //entityHP改变
    eGameEvent_EntityMpChange, //entityMP改变
    //OB
    eGameEvent_HeroInfoChange,
    eGameEvent_HeroHpChange,
    eGameEvent_HeroLvChange,
    eGameEvent_HeroMpChange,
    eGameEvent_SkillUpLvChange,
    eGameEvent_SkillInfo,
    eGameEvent_HeroHeadInfoChange,
    eGameEvent_HeroDeathTime,
    eGameEvent_HeroBackTown,
    eGameEvent_AbsSkillInfo,
    eGameEvent_SkillCDInfo,
    eGameEvent_FuryStateInfo,
    eGameEvent_PackageBuyInfo,
    eGameEvent_PersonInitInfo,

    eGameEvent_InviteAddFriendInfo,
    eGameEvent_RemoveFriend,
    eGameEvent_RemoveFriendEnd,
    eGameEvent_FriendPersonInfo, //详细信息
    eGameEvent_BlackInfo, //黑名单简介
    eGameEvent_ReceiveLobbyMsg,
    eGameEvent_ReceiveNewMsg,
    eGameEvent_RemoveChatTask,
    eGameEvent_InvitationMsg,
    eGameEvent_FindFriendInfo,
    eGameEvent_FindClear,
    eGameEvent_TalkUIDetails,
    eGameEvent_AskFriendError,

    eGameEvent_HeroReborn, //英雄复活
    eGameEvent_NotyfyDeathEnter,
    eGameEvent_NotifyDeathExit,

    eGameEvent_ChatCheck,


    eGameEvent_LockTarget, //广播自己锁定目标
    eGameEvent_AddOrDelEnemy, //广播增加或者删除敌方玩家
    eGameEvent_SSPingInfo, //广播SSPing
    eGameEvent_NotifyChangeCp, //Cp改变
    eGameEvent_NotifyHpLessWarning, //血量警告特效
    eGameEvent_NotifyOpenShop, //打开商店,关闭商店
    eGameEvent_NotifyBuildingDes, //Ientity死亡
    eGameEvent_GuideShowBuildingTips,


    //sdk event
    eGameEvent_SdkRegisterSuccess, //sdk登陆成功
    eGameEvent_SdkServerCheckSuccess, //服务器向SDK验证成功
    eGameEvent_SdkLogOff,



    //Login
    eGameEvent_LoginEnter, //进入登陆
    eGameEvent_LoginExit, //退出登陆
    eGameEvent_LoginError, //登录错误码
    eGameEvent_LoginSuccess, //登陆成功
    eGameEvent_LoginFail,  //登陆失败

    //system notic
    eGameEvent_SystemNoticeEnter,
    eGameEvent_SystemNoticeExit,

    //兑换码
    eGameEvent_ExtraBonusEnter,
    eGameEvent_ExtraBonusExit,
    //英雄时限
    eGameEvent_TimeLimitHeroEnter,
    eGameEvent_TImeLimitHeroExit,

    //英雄信息
    eGameEvent_HeroDatumEnter,
    eGameEvent_HeroDatumExit,
    //user info
    eGameEvent_UserEnter, //进入用户信息设置
    eGameEvent_UserExit, //退出用户信息设置

    //账号获得物品
    eGameEvent_UserGetGoodsHero, //获得英雄
    eGameEvent_UserGetGoodsNml,  //获得普通物品
    eGameEvent_UserGetMoney,
    eGameEvent_RefreshGoodHero,  //刷新商城显示物品
    eGameEvent_CsGetNewHero,  //账号获得新的英雄
    eGameEvent_RefreshTimeLimitHero,

    //lobby
    eGameEvent_LobbyEnter,  //进入大厅
    eGameEvent_LobbyExit,  //退出大厅
    eGameEvent_BattleEnter, //进入战斗
    eGameEvent_BattleExit, //退出战斗
    eGameEvent_MarketEnter,
    eGameEvent_MarketExit,
    eGameEvent_MarketHeroListEnter,
    eGameEvent_MarketHeroListExit,
    eGameEvent_MarketHeroInfoEnter,
    eGameEvent_MarketHeroInfoExit,

    eGameEvent_HeroTimeLimitEnter,
    eGameEvent_HeroTimeLimitExit,

    eGameEvent_MarketRuneListEnter,
    eGameEvent_MarketRuneListExit,
    eGameEvent_MarketRuneInfoEnter,
    eGameEvent_MarketRuneInfoExit,

    eGameEvent_MarketRuneBuyEnter,
    eGameEvent_MarketRuneBuyExit,

    eGameEvent_RuneEquipWindowEnter,
    eGameEvent_RuneEquipWindowExit,

    eGameEvent_RuneCombineWindowEnter,
    eGameEvent_RuneCombineWindowExit,

    eGameEvent_RuneRefreshCardUpdate,

    eGameEvent_RuneRefreshWindowEnter,
    eGameEvent_RuneRefreshWindowExit,

    eGameEvent_RuneBuyWindowEnter,
    eGameEvent_RuneBuyWindowExit,

    eGameEvent_PurchaseSuccessWindowEnter,
    eGameEvent_PurchaseSuccessWindowExit,

    eGameEvent_PurchaseRuneSuccessWin,

    eGameEvent_RuneQuipUpdate,
    eGameEvent_RuneQuipUnload,
    eGameEvent_RuneBagUpdata,

    eGameEvent_GameSettingEnter,
    eGameEvent_GameSettingExit,

    eGameEvent_TeamMatchEnter, //进入组队匹配
    eGameEvent_TeamMatchExit, //退出组队匹配
    eGameEvent_TeamMatchAddTeammate, //增加队友
    eGameEvent_TeamMatchDelTeammatem, //删除队友

    eGameEvent_TeamMatchInvitationEnter, //组队邀请界面
    eGameEvent_TeamMatchInvitationExit, //组队邀请界面退出

    eGameEvent_TeamMatchSearchingEnter,  //匹配中界面
    eGameEvent_TeamMatchSearchingExit, //匹配中界面

    eGameEvent_ServerMatchInvitationEnter, //服务器匹配邀请界面
    eGameEvent_ServerMatchInvitationExit,  //服务器匹配邀请界面退出

    eGameEvent_HomePageEnter, //进入主页
    eGameEvent_HomePageExit,  //退出主页

    //个人信息
    eGameEvent_PersonInfoEnter,
    eGameEvent_PersonInfoExit,
    eGameEvent_ChangeNickName,
    eGameEvent_ChangeHeadID,
    eGameEvent_ChangeUserLevel,

    //VIP
    eGameEvent_VIPPrerogativeEnter,
    eGameEvent_VIPPrerogativeExit,

    //mail
    eGameEvent_MailEnter,
    eGameEvent_MailExit,
    eGameEvent_AskMailInfo,
    eGameEvent_AskCloseOrGetMailGift,
    eGameEvent_UpdateMailList,
    eGameEvent_UpdateMailInfo,
    eGameEvent_AddNewMailReq,
    eGameEvent_AddNewMailRsp,
    eGameEvent_SetDefaultMailInfo,

    eGameEvent_BattleUpdateRoomList, //更新房间列表

    //social
    eGameEvent_SocialEnter,
    eGameEvent_SocialExit,
    eGameEvent_CreateFriendPrefab,
    eGameEvent_CreateBlackPrefab,
    eGameEvent_FriendChangeInfo, //简介

    //Invite
    eGameEvent_InviteCreate,
    eGameEvent_InviteEnter,
    eGameEvent_InviteExit,
    eGameEvent_InviteChange,

    //在大厅接收Invite
    eGameEvent_InviteAddRoom,
    eGameEvent_InviteRoomEnter,
    eGameEvent_InviteRoomExit,
    eGameEvent_NewInviteRoom,

    //chatTask
    eGameEvent_ChatTaskEnter,
    eGameEvent_ChatTaskExit,
    eGameEvent_ChatTaskFriend,
    eGameEvent_ReadyChatTaskEnter,
    eGameEvent_ShowChatTaskFriend,

    //room
    eGameEvent_RoomEnter, //进入登陆
    eGameEvent_RoomExit, //退出登陆
    eGameEvent_AskBeginBattleError, //开始游戏错语反馈
    eGameEvent_SeatPosUpdate, //更新座位
    eGameEvent_RecvChatMsg,  //收到房间聊天消息

    //RoomOpenInvite
    eGameEvent_RoomInviteEnter,
    eGameEvent_RoomInviteExit,
    eGameEvent_InviteList,

    //hero
    eGameEvent_HeroEnter,  //进入英雄选择
    eGameEvent_HeroExit, //退出英雄选择
    eGameEvent_HeroPreSelect, //英雄预选择
    eGameEvent_HeroRealSelect, //英雄选择确认
    eGameEvent_HeroAddSelect, //增加一个英雄选择
    eGameEvent_HeroEnterRamdon, //进入随机选择英雄
    eGameEvent_HeroFirstTime, //第一次读秒时间
    eGameEvent_HeroSecondTime, //第二次读秒时间
    eGameEvent_HeroReconnectPreSelect, //重连预选择选择

    //play
    eGameEvent_BattleInfoEnter, //进入实时战斗查看信息
    eGameEvent_BattleInfoExit, //退出实时战斗查看信息
    eGameEvent_BattleIngEnter, //查看当前战绩
    eGameEvent_BattleMineEnter, //查看自己当前的属性
    eGameEvent_BattleTimeDownEnter, //进入战斗倒计时

    //LocalPlayer
    eGameEvent_LocalPlayerHpChange,
    eGameEvent_LocalPlayerMpChange,
    eGameEvent_LocalPlayerLevelChange,
    eGameEvent_LocalPlayerExpChange,
    eGameEvent_LocalPlayerInit,
    eGameEvent_LocalPlayerPassiveSkillsUpLv,
    eGameEvent_LocalPlayerPassiveSkills,
    eGameEvent_LocalPlayerSkillCD,
    eGameEvent_LocalPlayerSilence,
    eGameEvent_SkillDescribleType,
    eGameEvent_SkillDescribleId,
    eGameEvent_SkillDescribleUpdate,
    eGameEvent_LocalPlayerUpdateFuryValue,
    eGameEvent_LocalPlayerUpdateFuryEffect,
    eGameEvent_LocalPlayerRange,

    //over
    eGameEvent_ScoreEnter, //进入胜负显示
    eGameEvent_ScoreExit, //退出胜负显示
    eGameEvent_SettlementEnter, //进入结算显示
    eGameEvent_SettlementExit, //退出结算显示

    eGameEvent_GamePlayEnter,
    eGameEvent_GamePlayExit,
    eGameEvent_HeroAttributesInfo,

    //吸附
    eGameEvent_SoleSoldierEnter,
    eGameEvent_SoleSoldierExit,
    eGameEvent_ResetAbsHead,
    eGameEvent_ResetLockHead,
    eGameEvent_AbsorbResult,

    //新手引导
    eGameEvent_UIGuideEnter,
    eGameEvent_UIGuideExit,
    eGameEvent_UIGuideEvent,
    eGameEvent_PlayGuideEnter,
    eGameEvent_PlayGuideExit,
    eGameEvent_PlayGuideDragEvent,
    eGameEvent_PlayGuideTaskFinish,
    eGameEvent_PlayChildTaskFinish,
    eGameEvent_PlayTaskModelFinish,

    eGameEvent_GuideKillTask,
    eGameEvent_GuideAbsorbTask,
    eGameEvent_GuideLockTargetCanAbsorb, //如果锁定了可以吸附的小怪
    eGameEvent_GuideLockTargetCanNotAbsorb, //锁定对象为空了或者锁定对象不能吸附

    //进阶引导
    eGameEvent_AdvancedGuideEnter,
    eGameEvent_AdvancedGuideExit,
    eGameEvent_AdvancedGuideShowTip,
    eGameEvent_AdvancedGuideBeAttackByBuilding,

    //其他
    eGameEvent_ShowMessage, //显示MessageBox
    eGameEvent_ShowLogicMessage,

    //DailyBonus
    eGameEvent_DailyBonusEnter,
    eGameEvent_DailyBonusExit,
    eGameEvent_DailyBonusUpdate,
    eGameEvent_NotifyAllTaskUpdate,
    eGameEvent_NotifyDailyTaskUpdate,
    eGameEvent_NotifyOneTaskAdd,
    eGameEvent_NotifyOneTaskUpdate,
    eGameEvent_NotifyOneTaskDel,
    eGameEvent_NotifyOneTaskRewards,

    //UIGuide //register guide
    eGameEvent_UIGuideTriggerRegister = -5000,
    eGameEvent_UIGuideTriggerNewsGuide = -5001,
    eGameEvent_UIGuideTriggerSelfDefGame = -5002,
    eGameEvent_UIGuideTriggerCreateRoom = -5003,
    eGameEvent_UIGuideTriggerBackLobby = -5004,
    eGameEvent_UIGuideTriggerMatchGame = -5005,
    eGameEvent_UIGuideTriggerSelectHero = -5006,
    eGameEvent_UIGuideTriggerRoomBeginGame = -5007,

    eGameEvent_SecondaryGuideTipToBuyStart = -5008,
    eGameEvent_SecondaryGuideTipToBackCityStart = -5009,
    eGameEvent_SecondaryGuideTipToFurySkillStart = -5010,
    eGameEvent_SecondaryGuideTipToShopCpStart = -5011,
    eGameEvent_SecondaryGuideTipToBuyEnd = -5012,
    eGameEvent_SecondaryGuideTipToBackCityEnd = -5013,
    eGameEvent_SecondaryGuideTipToFurySkillEnd = -5014,
    eGameEvent_SecondaryGuideTipToShopCpEnd = -5015,

    eGameEvent_UIGuideInputNickNameStart = -8000,
    eGameEvent_UIGuideSelectSexStart = -8001,
    eGameEvent_UIGuideSelectHeadStart = -8002,
    eGameEvent_UIGuideCommitRegisterStart = -8003,
    eGameEvent_UIGuideNewsGuideStart = -8004,
    eGameEvent_UIGuideSelfDefBtnStart = -8005,
    eGameEvent_UIGuideSelectPrimaryBtnStart = -8006,
    eGameEvent_UIGuideCreateRoomBtnStart = -8007,
    eGameEvent_UIGuideBackLobbyBtnStart = -8008,
    eGameEvent_UIGuideMatchBtnStart = -8009,
    eGameEvent_UIGuideRoomBeginBtnStart = -8010,
    eGameEvent_UIGuideSelectHeroHeadStart = -8011,
    eGameEvent_UIGuideSelectHeroCommitStart = -8012,


    eGameEvent_UIGuideInputNickNameEnd = -1000,
    eGameEvent_UIGuideSelectSexEnd = -1001,
    eGameEvent_UIGuideSelectHeadEnd = -1002,
    eGameEvent_UIGuideCommitRegisterEnd = -1003,
    eGameEvent_UIGuideNewsGuideEnd = -1004,
    eGameEvent_UIGuideSelfDefBtnEnd = -1005,
    eGameEvent_UIGuideSelectPrimaryBtnEnd = -1006,
    eGameEvent_UIGuideSelectCreateRoomBtnEnd = -1007,
    eGameEvent_UIGuideBackLobbyBtnEnd = -1008,
    eGameEvent_UIGuideMatchBtnEnd = -1009,
    eGameEvent_UIGuideRoomBeginBtnEnd = -1010,
    eGameEvent_UIGuideSelectHeroHeadEnd = -1011,
    eGameEvent_UIGuideSelectHeroCommitEnd = -1012,
}

最后是EventCenter.cs:

using System;
using System.Collections.Generic;
using UnityEngine;

static internal class EventCenter
{
    //EventTable
    static public Dictionary<EGameEvent, Delegate> mEventTable = new Dictionary<EGameEvent, Delegate> ();

    //保存一直存在,不会被删除的Event
    static public List<EGameEvent> mPermanentMessages = new List<EGameEvent> ();

    //把event加进mPermanentMessages里面
    static public void MarkAsPermanent(EGameEvent eventType)
    {
        mPermanentMessages.Add (eventType);
    }

    //删除除了需要一直存在的其他的所有event
    static public void Cleanup()
    {
        List<EGameEvent> messagesToRemove = new List<EGameEvent> ();

        foreach(KeyValuePair<EGameEvent, Delegate> pair in mEventTable)
        {
            bool wasFound = false;

            foreach (EGameEvent message in mPermanentMessages)
            {
                if (pair.Key == message)
                {
                    wasFound = true;
                    break;
                }
            }

            if (!wasFound)
            {
                messagesToRemove.Add (pair.Key);
            }
        }

        foreach (EGameEvent message in messagesToRemove)
        {
            mEventTable.Remove (message);
        }
    }

    //打印当前eventTable中的所有event
    static public void PrEGameEventEventTable()
    {
        Debug.Log ("\t\t\t=== MESSENGER PrEGameEventEventTable ===");

        foreach(KeyValuePair<EGameEvent, Delegate> pair in mEventTable)
        {
            Debug.Log ("\t\t\t" + pair.Key + "\t\t" + pair.Value);
        }

        Debug.Log ("\n");
    }

    //添加Listener之前的的准备工作
    static public void OnListenerAdding(EGameEvent eventType, Delegate listenerBeingAdded)
    {
        if (!mEventTable.ContainsKey(eventType))
        {
            mEventTable.Add (eventType, null);
        }

        Delegate d = mEventTable [eventType];
        if (d != null && d.GetType() != listenerBeingAdded.GetType())
        {
            throw new ListenerException (string.Format ("Attempting to add listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being added has type {2}", eventType, d.GetType ().Name, listenerBeingAdded.GetType ().Name));
        }
    }

    //删除Listener之前的准备工作
    static public void OnListenerRemoving(EGameEvent eventType, Delegate listenerBeingRemoved)
    {
        if (mEventTable.ContainsKey(eventType))
        {
            Delegate d = mEventTable[eventType];

            if (d == null)
            {
                throw new ListenerException(string.Format("Attempting to remove listener with for event type \"{0}\" but current listener is null.", eventType));
            }
            else if (d.GetType() != listenerBeingRemoved.GetType())
            {
                throw new ListenerException(string.Format("Attempting to remove listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being removed has type {2}", eventType, d.GetType().Name, listenerBeingRemoved.GetType().Name));
            }
        }
        else
        {
            throw new ListenerException(string.Format("Attempting to remove listener for type \"{0}\" but Messenger doesn't know about this event type.", eventType));
        }
    }

    static public void OnListenerRemoved(EGameEvent eventType)
    {
        if (mEventTable[eventType] == null)
        {
            mEventTable.Remove (eventType);
        }
    }

    //进行broadcast之前的准备
    //啥也没做啊
    static public void OnBroadcasting(EGameEvent eventType)
    {
        if (!mEventTable.ContainsKey(eventType))
        {

        }
    }

    static public BroadcastException CreateBroadcastSignatureException(EGameEvent eventType)
    {
        return new BroadcastException(string.Format("Broadcasting message \"{0}\" but listeners have a different signature than the broadcaster.", eventType));
    }

    //其实就是抛出Exception
    public class BroadcastException: Exception
    {
        public BroadcastException(string msg)
            :base(msg)
        {

        }
    }

    public class ListenerException: Exception
    {
        public ListenerException(string msg)
            :base(msg)
        {

        }
    }

    //无参数
    static public void AddListener(EGameEvent eventType, Callback handler)
    {
        OnListenerAdding (eventType, handler);
        //这个“+”号表示:一个delegate实例可以实现组播(multicast)
        //当触发事件时,组播里所有callback一次调用
        mEventTable [eventType] = (Callback)mEventTable [eventType] + handler;
    }

    //单个参数
    static public void AddListener<T>(EGameEvent eventType, Callback<T> handler)
    {
        OnListenerAdding (eventType, handler);
        mEventTable [eventType] = (Callback<T>)mEventTable [eventType] + handler;
    }

    //两个参数
    static public void AddListener<T, U>(EGameEvent eventType, Callback<T, U> handler)
    {
        OnListenerAdding (eventType, handler);
        mEventTable [eventType] = (Callback<T, U>)mEventTable [eventType] + handler;
    }

    //三个参数
    static public void AddListener<T, U, V>(EGameEvent eventType, Callback<T, U, V> handler)
    {
        OnListenerAdding (eventType, handler);
        mEventTable [eventType] = (Callback<T, U, V>)mEventTable [eventType] + handler;
    }

    //四个函数
    static public void AddListener<T, U, V, X>(EGameEvent eventType, Callback<T, U, V, X> handler)
    {
        OnListenerAdding (eventType, handler);
        mEventTable [eventType] = (Callback<T, U, V, X>)mEventTable [eventType] + handler;
    }

    //无参数
    static public void RemoveListener(EGameEvent eventType, Callback handler)
    {
        OnListenerRemoving (eventType, handler);
        mEventTable [eventType] = (Callback)mEventTable [eventType] - handler;
        OnListenerRemoved (eventType);
    }

    //单个参数
    static public void RemoveListener<T>(EGameEvent eventType, Callback<T> handler)
    {
        OnListenerRemoving (eventType, handler);
        mEventTable [eventType] = (Callback<T>)mEventTable [eventType] - handler;
        OnListenerRemoved (eventType);
    }

    //两个参数
    static public void RemoveListener<T, U>(EGameEvent eventType, Callback<T, U> handler)
    {
        OnListenerRemoving (eventType, handler);
        mEventTable [eventType] = (Callback<T, U>)mEventTable [eventType] - handler;
        OnListenerRemoved (eventType);
    }

    //三个参数
    static public void RemoveListener<T, U, V>(EGameEvent eventType, Callback<T, U, V> handler)
    {
        OnListenerRemoving (eventType, handler);
        mEventTable [eventType] = (Callback<T, U, V>)mEventTable [eventType] - handler;
        OnListenerRemoved (eventType);
    }

    //四个参数
    static public void RemoveListener<T, U, V, X>(EGameEvent eventType, Callback<T, U, V, X> handler)
    {
        OnListenerRemoving (eventType, handler);
        mEventTable [eventType] = (Callback<T, U, V, X>)mEventTable [eventType] - handler;
        OnListenerRemoved (eventType);
    }

    //无参数
    static public void Broadcast(EGameEvent eventType)
    {
        OnBroadcasting (eventType);

        Delegate d;
        if (mEventTable.TryGetValue(eventType, out d))
        {
            Callback callback = d as Callback;

            if (callback != null)
            {
                callback ();
            }
            else
            {
                throw CreateBroadcastSignatureException (eventType);
            }
        }
    }

    //如其名,把CEvent传进需要的地方,但暂时不知道该怎么样
    static public void SendEvent(CEvent evt)
    {
        Broadcast<CEvent> (evt.GetEventId (), evt);
    }

    //单个参数
    static public void Broadcast<T>(EGameEvent eventType, T arg1)
    {
        OnBroadcasting (eventType);

        Delegate d;
        if (mEventTable.TryGetValue(eventType, out d))
        {
            Callback<T> callback = d as Callback<T>;

            if (callback != null)
            {
                callback (arg1);
            }
            else
            {
                throw CreateBroadcastSignatureException (eventType);
            }
        }
    }

    //两个参数
    static public void Broadcast<T, U>(EGameEvent eventType, T arg1, U arg2)
    {
        OnBroadcasting (eventType);

        Delegate d;
        if (mEventTable.TryGetValue(eventType, out d))
        {
            Callback<T, U> callback = d as Callback<T, U>;

            if (callback != null)
            {
                callback (arg1, arg2);
            }
            else
            {
                throw CreateBroadcastSignatureException (eventType);
            }
        }
    }

    //三个参数
    static public void Broadcast<T, U, V>(EGameEvent eventType, T arg1, U arg2, V arg3)
    {
        OnBroadcasting (eventType);

        Delegate d;
        if (mEventTable.TryGetValue(eventType, out d))
        {
            Callback<T, U, V> callback = d as Callback<T, U, V>;

            if (callback != null)
            {
                callback (arg1, arg2, arg3);
            }
            else
            {
                throw CreateBroadcastSignatureException (eventType);
            }
        }
    }

    //四个参数
    static public void Broadcast<T, U, V, X>(EGameEvent eventType, T arg1, U arg2, V arg3, X arg4)
    {
        OnBroadcasting (eventType);

        Delegate d;
        if (mEventTable.TryGetValue(eventType, out d))
        {
            Callback<T, U, V, X> callback = d as Callback<T, U, V, X>;

            if (callback != null)
            {
                callback (arg1, arg2, arg3, arg4);
            }
            else
            {
                throw CreateBroadcastSignatureException (eventType);
            }
        }
    }

}

太长了,如何使用放到下一篇.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值