本帖最后由 空伊伊 于 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)
    }
}
下一节:为什么要使用数据中心④