新事件系统使用说明 1. # 更新记录 1. ## 增加接口 MEventCenter.IsValidate() ,用于注册/取消注册/触发消息时候调用MEventCenter.GetInstance() 前判断事件系统是否激活 2. xx 2. # 注册事件 1. ## 注意事项 1. ### 使用MEventCenter.GetInstance().XXXX 注册事件回调 2. ### 注册事件接口中增加了 isIgnoreOnDisableGameObject=bool 字段,以支持在start中注册事~~件,destroy取消注册,如果当前对象非激活状态,并且这个字段(isIgnoreOnDisabl~~eGameObject==true),则会忽略触发回调接口,默认是false 3. ~~注册的回调接口一般需要返回 bool 类型值,当为true 时候会拦截优先级低的回调,为了方便只提供了一个不带参数的注册接口(~~~~RegisterDefaultBlock~~~~)可以不需要返回值.~~ 4. ### 为了方便提供了一个 EventParameter 参数类,当需要传递多个参数或者参数中有非基本类型时候需要使用这个包装一下,建议使用 EventParameter .GetEventParameterIns(),而不是直接new 一个对象,获取对象后直接赋值对应字段即可。由于内部使用了对象池复用对象,对于未赋值的字段不要获取值。 5. ### 考虑到某些时候只需要一个object 类型对象参数,特提供一个单独接口 RegisterSignalObj()(内部使用了 EventParameter 传递参数) 6. ### 增加了一个设置优先级的参数 priority ,数值越大越先执行,建议使用 EventHandlerPriority 定义的数值 (+,- 操作) 2. ## 不带参数的回调 ``` /// /// 监听不带参数的事件 /// /// 监听对象,一个类中要保持一致,最好不要一会儿是this,一会儿是gameobject /// 事件id /// 此时一定不会阻止后面的执行 /// /// 优先级,数值越大越先执行,建议使用 EventHandlerPriority 定义的数值 (+,- 操作) if (MEventCenter.IsValidate()) MEventCenter.GetInstance().RegisterVoid(m_Host, (int) EventCodeDefine.XXX, YYY, bool isIgnoreOnDisableGameObject = false, int priority =(int) EventHandlerPriority.Default); ``` 3. ## 带int 类型参数 ``` if (MEventCenter.IsValidate()) MEventCenter.GetInstance().RegisterInt(gameObject, (int) EventCodeDefine.XXX, YYY, bool isIgnoreOnDisableGameObject = false, int priority =(int) EventHandlerPriority.Defaul); ``` 4. ## 带有其他基本类型参数 ``` //uint 参数类型 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().RegisterUInt(gameObject, (int) EventCodeDefine.XXX, YYY, bool isIgnoreOnDisableGameObject = false, int priority =(int) EventHandlerPriority.Default); //long参数类型 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().RegisterLong(gameObject, (int) EventCodeDefine.XXX, YYY, bool isIgnoreOnDisableGameObject = false, int priority =(int) EventHandlerPriority.Default); //float参数类型 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().RegisterFloat(gameObject, (int) EventCodeDefine.XXX, YYY, bool isIgnoreOnDisableGameObject = false, int priority =(int) EventHandlerPriority.Default); //double参数类型 MEventCenter.GetInstance().RegisterDouble(gameObject, (int) EventCodeDefine.XXX, YYY, bool isIgnoreOnDisableGameObject = false, int priority =(int) EventHandlerPriority.Default); //string参数类型 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().RegisterString(gameObject, (int) EventCodeDefine.XXX, YYY, bool isIgnoreOnDisableGameObject = false, int priority =(int) EventHandlerPriority.Default); //bool参数类型 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().RegisterBool(gameObject, (int) EventCodeDefine.XXX, YYY, bool isIgnoreOnDisableGameObject = false, int priority =(int) EventHandlerPriority.Default); //verctor2参数类型 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().RegisterVector2(gameObject, (int) EventCodeDefine.XXX, YYY, bool isIgnoreOnDisableGameObject = false, int priority =(int) EventHandlerPriority.Default); //vector3参数类型 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().RegisterVector3(gameObject, (int) EventCodeDefine.XXX, YYY, bool isIgnoreOnDisableGameObject = false, int priority =(int) EventHandlerPriority.Default); ``` 5. ## 带有类对象类型参数 ``` //参数是一个EventParameter类型参数(参数内部可以包含各种常用的类型参数) if (MEventCenter.IsValidate()) MEventCenter.GetInstance().RegisterObj(gameObject, (int) EventCodeDefine.XXX, YYY); ``` 3. # 取消注册事件 1. ## 特别说明: 1. ### 如果在start注册消息,destroy取消注册吗,一般建议使用 UnRegisterAllEventOfListener(listener) 取消所有当前对象监听的接口 2. ### 也可以使用 UnRegisterEventOfCode(listener,code)取消指定监听对象的某个code 接口 3. ### 提供了 DoUnRegisterAllUnAvailableListener() 接口,会扫描所有的监听回调,如果监听对象不存在或者回调的对象不存在时候移除监听。目前在回到intro场景时候会调用 ![](https://szbrmwlyx.feishu.cn/space/api/box/stream/download/asynccode/?code=MTk0OTJhM2I1ZWNhOWZlNjQ4ODMxOTkxNDYzYzY0M2FfeU1QNWthNlZsWFp5Wm9mOERibjhhdXhJaEk2dlNuSTNfVG9rZW46Ym94Y25qVnV3NkZlOWZyTFgwVU1pN0JVTWNnXzE2NTU5NTIzMDU6MTY1NTk1NTkwNV9WNA) 4. dd 2. ### 取消所有当前对象监听的接口 ``` //取消参数1 对象的所有回调 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().UnRegisterAllEventOfListener(gameObject); ``` 3. ### 取消指定监听对象的某个code 接口 ``` //取消参数1 对象的 参数2指定id 所有回调 if (MEventCenter.IsValidate()) MEventCenter.GetInstance(). UnRegisterEventOfCode(gameObject,(int) EventCodeDefine.xxx)); ``` 4. ## 取消指定监听对象指定事件id 的指定类型回调接口 ``` //取消参数1 对象指定的事件类型为2的所有回调 无参数 if (MEventCenter.IsValidate()) MEventCenter.GetInstance(). UnRegisterVoid(gameObject, (int) EventCodeDefine.XXX); //取消参数1 对象指定的事件类型为2的所有回调 参数类型 EventParameter if (MEventCenter.IsValidate()) MEventCenter.GetInstance().UnRegisterObj(gameObject, (int) EventCodeDefine.XXX); //取消参数1 对象指定的事件类型为2的所有回调 参数类型单个 object if (MEventCenter.IsValidate()) MEventCenter.GetInstance().UnRegisterSignalObj(gameObject, (int) EventCodeDefine.XXX); //取消参数1 对象指定的事件类型为2的所有回调 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().UnRegisterInt(gameObject, (int) EventCodeDefine.XXX); //取消参数1 对象指定的事件类型为2的所有回调 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().UnRegisterLong(gameObject, (int) EventCodeDefine.XXX); //取消参数1 对象指定的事件类型为2的所有回调 参数类型 float if (MEventCenter.IsValidate()) MEventCenter.GetInstance().UnRegisterFloat(gameObject, (int) EventCodeDefine.XXX); //取消参数1 对象指定的事件类型为2的所有回调 参数类型 double if (MEventCenter.IsValidate()) MEventCenter.GetInstance().UnRegisterDouble(gameObject, (int) EventCodeDefine.XXX); //取消参数1 对象指定的事件类型为2的所有回调 参数类型 bool if (MEventCenter.IsValidate()) MEventCenter.GetInstance().UnRegisterBool(gameObject, (int) EventCodeDefine.XXX); //取消参数1 对象指定的事件类型为2的所有回调 参数类型 vevtor2 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().UnRegisterVector2(gameObject, (int) EventCodeDefine.XXX); //取消参数1 对象指定的事件类型为2的所有回调 参数类型 vector3 if (MEventCenter.IsValidate()) MEventCenter.GetInstance().UnRegisterVector3(gameObject, (int) EventCodeDefine.XXX); //取消参数1 对象指定的事件类型为2的所有回调 参数类型 string if (MEventCenter.IsValidate()) MEventCenter.GetInstance().UnRegisterString(gameObject, (int) EventCodeDefine.XXX); ``` 5. xx 4. # 触发事件 1. ## 特别说明: 1. ### 对于TriggerObj 和 TriggerSignalObj () 接口,由于内部使用 **EventParameter** 传递参数,所有给了一个 **bool** **isRecycleAfterTrigger****= true**参数,当执行完事件后会自动回收这个对象,所有不要在后续再使用这个事件参数 ``` if (MEventCenter.IsValidate()) MEventCenter.GetInstance().TriggerDefault((int) EventCodeDefine.XXX); //触发全局事件 事件id 参数1 指定,参数参数2指定类型 EventParameter if (MEventCenter.IsValidate()) MEventCenter.GetInstance().TriggerObj((int) EventCodeDefine.XXX,YYY, bool isAutoRecycleEventParameter = true); //触发全局事件 事件id 参数1 指定,参数参数2指定类型 int MEventCenter.GetInstance().TriggerInt((int) EventCodeDefine.XXX,YYY); //触发全局事件 事件id 参数1 指定,参数参数2指定类型 uint MEventCenter.GetInstance().TriggerUInt((int) EventCodeDefine.XXX,YYY); //触发全局事件 事件id 参数1 指定,参数参数2指定类型 long MEventCenter.GetInstance().TriggerLong((int) EventCodeDefine.XXX,YYY); //触发全局事件 事件id 参数1 指定,参数参数2指定类型 float MEventCenter.GetInstance().TriggerFloat((int) EventCodeDefine.XXX,YYY); //触发全局事件 事件id 参数1 指定,参数参数2指定类型 double MEventCenter.GetInstance().TriggerDouble((int) EventCodeDefine.XXX,YYY); //触发全局事件 事件id 参数1 指定,参数参数2指定类型 bool MEventCenter.GetInstance().TriggerBool((int) EventCodeDefine.XXX,YYY); //触发全局事件 事件id 参数1 指定,参数参数2指定类型 vector2 MEventCenter.GetInstance().TriggerVector2((int) EventCodeDefine.XXX,YYY); //触发全局事件 事件id 参数1 指定,参数参数2指定类型 vector3 MEventCenter.GetInstance().TriggerVector3((int) EventCodeDefine.XXX,YYY); //触发全局事件 事件id 参数1 指定,参数参数2指定类型 string MEventCenter.GetInstance().TriggerString((int) EventCodeDefine.XXX,YYY); ``` 5. # EventParameter 使用说明 1. ## 定义 ``` namespace DMM.Core { /// /// 在特化参数外的 通用参数(避免直接使用 object 类型参数,特别是lua 调用时候浮点数类型不一致) /// #if UNITY_EDITOR [System.Serializable] #endif public class EventParameter { public long m_LongParameter; public double m_DoubleParameter; public string m_StringParameter; public Vector2 m_Vector2Parameter; public Vector3 m_Vector3Parameter; public object m_ObjectParameter = null; #if UNITY_EDITOR public override string ToString() { return string.Format($"m_LongParameter={m_LongParameter} \n") + string.Format($" m_DoubleParameter={m_DoubleParameter} m_StringParameter={m_StringParameter} \n") + string.Format($"m_Vector2Parameter={m_Vector2Parameter} m_Vector3Parameter={m_Vector3Parameter} \n ") + string.Format($"m_ObjectParameter={m_ObjectParameter} \n"); } #endif #if UNITY_EDITOR public override string ToString() { return string.Format($"m_LongParameter={m_LongParameter} \n") + string.Format($" m_DoubleParameter={m_DoubleParameter} m_StringParameter={m_StringParameter} \n") + string.Format($"m_Vector2Parameter={m_Vector2Parameter} m_Vector3Parameter={m_Vector3Parameter} \n ") + string.Format($"m_ObjectParameter={m_ObjectParameter} \n"); } #endif #region 类型转换接口 API /// /// 获取 m_LongParameter 参数转换为 uint 类型 /// /// public uint AsUintFromLong() => (uint) m_LongParameter; /// /// 获取 m_LongParameter 参数转换为 int 类型 /// /// public int AsIntFromLong() => (int) m_LongParameter; /// /// 获取 m_LongParameter 参数转换为 bool 类型 /// /// public bool AsBoolFromLong() => m_LongParameter != 0; /// /// 获取 m_DoubleParameter 参数转换为 float 类型 /// /// public uint AsFloatFromDouble() => (uint) m_DoubleParameter; /// /// 获取 m_DoubleParameter 参数转换为 uint 类型 /// /// public uint AsUintFromDouble() => (uint) m_DoubleParameter; /// /// 获取 m_DoubleParameter 参数转换为 int 类型 /// /// public int AsIntFromDouble() => (int) m_DoubleParameter; /// /// 获取 m_DoubleParameter 参数转换为 bool 类型 /// /// public bool AsBoolFromDouble() => m_DoubleParameter != 0; #endregion } ``` 2. ### 获取实例 ``` /// /// 获取一个通用参数类型对象 内部维持一个对象池 /// /// public static EventParameter GetEventParameterIns() { return MEventCenter.GetInstance().GetEventParameterIns(); } ``` 3. ### 回收实例对象 ``` /// /// 回收指定的参数对象 /// /// public static void RecycleEventParameter(EventParameter eventParameter) { if (eventParameter == null) return; MEventCenter.GetInstance().RecycleEventParameter(eventParameter); } ``` 4. ss 6. # EventCodeDefine 定义事件id 说明 1. ## 示例 ``` /// /// 供EventCenter使用,用于定义需要处理的消息,每个枚举必须定义唯一的一值.每个类型最好预留一部分数据段,枚举值按照从小到大顺序排列 /// public enum EventCodeDefine { #region C#层全局通用事件[-1,-5000] OnNotifyLoginOut = -1, //通知退出登录 OnNotifyRestart = -2, //重启Unity NotifyOverDayBefore = -3, //跨天 NotifyOverDay = -4, //跨天 NotifyLoginSuccess = -5, //登录成功 NotifyReturnLobbyFromGame = -6, //单局返回大厅 NotifyPlayerInfoChanged = -7, //角色信息更新 NotifyCameraZoomOffset = -8, //摄像机滚轮滚动 NotifySkinSuiteCountChanged = -9, //套装数量改变 OnActivityLobbyRedPointChange = -10, //大厅红点数据更新 #endregion #region ***Lua 相关事件 [-5001,-10000]*** #endregion NotifyCurrencyItemRefresh=4, //某个代币信息需要刷新 NotifyComRedPointNotify=14, //通用红点状态通知更新 NotifyLobbyBannerUpdate=15, //首页Banner图需要更新 OnFinishLotteryBoxOpen=16, } ``` 2. ## 说明 1. 对于全局通用的底层事件预定义了 [-1,-5000] 供使用 2. 对于lua 事件预定义了 [-5001,-10000] 3. 其他功能事件建议定义一个预留范围,并在#regin中标注 ![](https://szbrmwlyx.feishu.cn/space/api/box/stream/download/asynccode/?code=ZGZlNDdlM2MxZDE2M2Y1YTY1NjliZjhhNDA1OGExMjlfMnRlSGNSVlByZmR2SXdySVZJdzQ5TzB2MDB1ajg5d05fVG9rZW46Ym94Y25yZGRrVGg5c09GWnJVRW80UlZlbkFKXzE2NTU5NTIzMDY6MTY1NTk1NTkwNl9WNA) 7. # 其他说明 1. ## 旧的 UIDataEvents 事件系统已经移除了 Inspector 上“New Event”按钮,也就是不能再新增事件和增加监听了。 2. ## 为了兼容以前的旧的事件系统,提供了 EventTriggerController 类型,后续如果需要触发旧的事件,需要调用这里的接口,如果不存在,建议新增一个接口,后续好彻底移除旧的 UIDataEvents ``` /// /// 为了转换 UIDataBinder 中的事件到其他事件系统的一个中转类,后期可能会删减 UIDataBinder 触发事件 /// public class EventTriggerController { #region 通用 /// /// 玩家数据更新 /// public static void TriggerPlayerInfoChange() { UIDataEvents.Inst.InvokeEvent("OnPlayerInfoChanged"); MEventCenter.GetInstance().TriggerDefault((int) EventCodeDefine.NotifyPlayerInfoChanged); } /// /// 玩家数据更新 /// public static void TriggerOverDayEvent() { #if UNITY_EDITOR GLog.LogInfo($"TriggerOverDayEvent 跨天了"); #endif UIDataEvents.Inst.InvokeEvent("OverDayEvent"); MEventCenter.GetInstance().TriggerDefault((int) EventCodeDefine.NotifyOverDay); } /// /// 套装部件数据更新 /// public static void TriggerOnSkinSuiteCountChanged() { UIDataEvents.Inst.InvokeEvent("OnSkinSuiteCountChagned"); MEventCenter.GetInstance().TriggerDefault((int) EventCodeDefine.NotifySkinSuiteCountChanged); } } ``` 3. ss 8. # 调试相关 1. ## 在 MEventCenter 对象上新增一个开关,方便查看目前注册的所有监听和回调信息,目前由于时间有限,只提供了基本功能,后续如果有需要可能会提供一个单独的编辑器窗口查看数据 ![](https://szbrmwlyx.feishu.cn/space/api/box/stream/download/asynccode/?code=YTYwMjMzMTRlNDk4M2RjOWE2MDE0MTBlNzc3MTY4ZDRfcHpHZUQza0doaXR1Nm40QnI1UlgycGlDUXpRQXZpalFfVG9rZW46Ym94Y25rdVBwV1hCWVZBSzZKb2NJZW0yZndiXzE2NTU5NTIzMDY6MTY1NTk1NTkwNl9WNA) 2. ss 9. ss