本帖最后由 空伊伊 于 2023-11-8 17:30 编辑
模块管理和数据中心
目录
为什么要使用模块管理①
模块管理的使用步骤②
模块管理的各功能介绍③
为什么要使用数据中心④
数据中心的使用步骤⑤
数据中心的各功能介绍⑥
模块管理的各功能介绍及其运行逻辑
1.ModuleService
ModuleService是编辑器提供的一个模块管理服务
ModuleService的两个主要功能:
●注册模块:registerModule
ModuleService.registerModule(S, C, Data)
注册模块的作用:
1.将各个模块都添加到ModuleService中,方便获取和管理
2.按注册顺序依次执行各个模块的onAwake、onStart、onEnterScene
3.将由"net_"开头的方法注册成网络方法
4.让C和S关联同一份数据(数据由S端获取,玩家上线以及每次服务端save数据的时候,会同步给客户端)
●获取模块:getModule
ModuleService.getModule(S/C)
获取模块的作用:
1.实现跨模块调用(模块之间相互调用其方法)
2.让外部代码进行调用(比如在UI脚本里需要使用到模块里的方法)
(案例:跨模块调用)
class MyModuleC extends ModuleC<MyModuleS, null>{
protected onStart(): void {
// MyModuleC调用BagModuleC的方法
ModuleService.getModule(BagModuleC).bagModuleCDoSomeThing()
}
}
class MyModuleS extends ModuleS<MyModuleC, null>{
protected onStart(): void {
// MyModuleS调用BagModuleS的方法
ModuleService.getModule(BagModuleS).bagModuleSDoSomeThing()
}
}
2.ModuleS
ModuleS是服务端模块的基类,自己定义的服务端模块需要继承它
●ModuleS的生命周期方法:
<img src="https://arkimg.ark.online/193702spn3nrp3o38zehra.webp" alt="image-20230927173057513" style="zoom:50%;" />
3.ModuleC
ModuleC是客户端模块的基类,自己定义的客户端模块需要继承它
●ModuleC的生命周期方法:
<img src="https://arkimg.ark.online/193706fcur4ctzrieyzho4.webp" alt="image-20230927173057513" style="zoom:50%;" />
4.网络方法的使用方式
模块的网络方法无非两种情况:客户端调用服务端、服务端调用客户端
注意:只有方法前缀为"net_"的方法才能通过下面两种方式调用
●客户端调用服务端方法
如果ModuleC完成注册后,ModuleC会获得一个server属性,通过点可以直接取到server,从而调用服务端的方法
export class MyModuleC extends ModuleC<MyModuleS, MyModuleData>{
public testFunc() {
// 调用服务端方法
this.server.net_TestFun()
}
}
export class MyModuleS extends ModuleS<MyModuleC, MyModuleData>{
/**服务端方法 */
public net_TestFun() {
// 此次客户端的调用者
this.currentPlayer
// 此次客户端调用者的数据
this.currentData
//(注意:这两个current会在这次方法执行完毕后清除,也就是这两个属性只有在该方法被客户端调用时才生效)
}
}
●服务端调用客户端方法
MoudleS不能直接获取到指定ModuleC,需要通过player或者playerID来获取。不过ModuleS可以获取所有客户端
export class MyModuleC extends ModuleC<MyModuleS, MyModuleData>{
/**客户端方法 */
public net_TestFun() {
}
}
export class MyModuleS extends ModuleS<MyModuleC, MyModuleData>{
public test(player: Player) {
// 根据player获取到指定客户端,从而调用其方法
this.getClient(player).net_TestFun()
}
public test2() {
/**调用所有客户端的指定方法 */
this.getAllClient().net_TestFun()
}
}
(ps:客户端调用客户端,只需要用 getModule 就可以啦)
5.模块数据的使用
模块数据实际上就是 SubData,详细内容大家阅读完数据中心便能知道其用法。
●客户端获取模块数据
export class MyModuleC extends ModuleC<MyModuleS, MyModuleData>{
/**客户端方法 */
public net_TestFun() {
// 获取数据,在模块里直接使用this.data即可获取到本模块的数据
this.data
}
}
●服务端获取模块数据
export class MyModuleS extends ModuleS<MyModuleC, MyModuleData>{
public test(player: Player|number) {
// 根据player或者playerID获取数据
this.getPlayerData(player)
}
}
●服务端配合客户端存储模块数据
export class MyModuleC extends ModuleC<MyModuleS, MyModuleData>{
/**客户端通知服务端修改自己的数据 */
public changeData(value: string) {
this.server.net_changeData(value)
}
}
export class MyModuleS extends ModuleS<MyModuleC, MyModuleData>{
/**服务端收到对应客户端的修改请求 */
public net_changeData(value: string) {
// 只有当被客户端调用时,这个currentData才生效,currentData此时就是对应客户端的模块数据
this.currentData.myName = value
// 设置完保存一下,并同步给客户端
this.currentData.save(true)
}
}
下一节:为什么要使用数据中心④