🪢 事件系统
这一小节中,我们会对SDK中的事件系统进行阐述。

本文内容包含:
- 事件系统的作用
- Event类介绍
事件系统的作用:
1.线程安全性保障
在SDK中,初始化引擎模块时,可以选择使用客户端线程,也可以多线程。这使得引擎模块与前端业务执行之间可能存在线程不安全的情况,容易出现问题。为了解决这一问题,所有事件的通讯都通过事件系统进行分发,在事件系统中,把事件消息进行管理,统一到前端业务执行的线程中去。
2.SDK插件事件和前端渲染表现层业务解耦
解耦是开发时必须谈及的问题,如何正确解耦可以使业务分离,模块之间更加独立,更好进行维护,提高代码重用性。
通过事件系统,业务和表现层以及SDK内部可以解耦,使三者相对独立。它们之间通过事件或消息的方式进行分发并完成通讯。
Event类:
该类是维护整个事件系统的核心类,并且是一个静态类。它提供事件注册、注销、激发、清除等方法。
注册与注销事件:
1.registerIn
bool registerIn(string eventname, object obj, string funcname)
描述:
注册监听由渲染表现层抛出的事件(in = render->kbe),一般由SDK插件层进行注册。例如:UI层点击登录按钮的事件。
参数:
eventname
:string,事件名。请确保不要和SDK内部事件名冲突,并且全局唯一,否则会发生调用混乱。obj
:object,事件激发时的被调对象。funcname
:string,事件激发时的被调方法名。请确保该方法的签名与fireIn
的参数args
一致。在调用时,通过反射机制(Unity的C#下)查找obj
的该方法,并进行调用。
2.registerOut
bool registerOut(string eventname, object obj, string funcname)
描述:
和registerIn
类似,但是注册监听由SDK插件抛出的事件。(out = kbe->render),一般由渲染表现层来注册。例如:监听角色血量属性的变化, 如果UI层注册这个事件,事件触发后就可以根据事件所附带的当前血量值来改变角色头顶的血条值。
参数:
eventname
:string,事件名。请确保不要和SDK内部事件名冲突,并且全局唯一,否则会发生调用混乱。obj
:object,事件激发时的被调对象。funcname
:string,事件激发时的被调方法名。请确保该方法的签名与fireOut
的参数args
一致。在调用时,通过反射机制(Unity的C#下)查找obj
的该方法,并进行调用。
3.deregisterIn
bool deregisterIn(object obj)
描述:
注销obj
对象身上的In事件。
参数:
obj
:object,要注销In事件的目标对象。
4.deregisterOut
bool deregisterOut(object obj)
描述:
注销obj
对象身上的Out事件。
参数:
obj
:object,要注销Out事件的目标对象。
激发事件:
1.fireIn
bool fireIn(string eventname, params object[] args)
描述:
渲染表现层抛出事件(in = render->kbe),由渲染表现层来调用该方法。例如:UI层点击登录时向SDK插件层激发该事件。
参数:
eventname
:string,事件名。请确保不要和SDK内部事件名冲突,并且全局唯一,否则会发生调用混乱。args
:object,事件激发时的参数。
2.fireOut
bool fireIn(string eventname, params object[] args)
描述:
SDK插件层抛出事件(out = kbe->render,由SDK插件层来调用该方法。例如:收到角色血量变化的服务器消息时,向UI层激发该事件,使其更改血条值。
参数:
eventname
:string,事件名。请确保不要和SDK内部事件名冲突,并且全局唯一,否则会发生调用混乱。args
:object,事件激发时的参数。
暂停和恢复:
暂停和恢复事件系统的激发操作,有些时候非常有用。因为客户端是需要有一些延迟操作的,比如场景的加载、角色的加载等需要一定时间才能完成一些初始化操作,而服务端的消息是不会被影响的,导致在资源加载后,这些事件已经被激发完毕了,而事件的注册者都还没来得及进行注册,造成事件丢失。这个时候就可以使用暂停和恢复功能。
1.pause
描述:
暂停事件系统的激发。
2.resume
描述:
恢复事件系统的激发。