[开发者心得] 【模块管理和数据中心】——模块管理的各功能介绍③

[复制链接]
2439 |3
空伊伊 发表于 2023-3-9 19:33:25 | 显示全部楼层 |阅读模式

本帖最后由 空伊伊 于 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)
    }
}

下一节:为什么要使用数据中心④

更多图片 小图 大图
组图打开中,请稍候......
回复

使用道具 举报

你若盛开,蝴蝶自来 发表于 2023-8-31 23:06:21 | 显示全部楼层
那客户端调用客户端呐
回复

使用道具 举报

空伊伊楼主 发表于 2023-9-1 15:44:49 | 显示全部楼层

直接getModule就行了呀
回复

使用道具 举报

你若盛开,蝴蝶自来 发表于 2023-9-4 15:15:01 | 显示全部楼层
空伊伊 发表于 2023-9-1 15:44
直接getModule就行了呀

回复

使用道具 举报

热门版块
快速回复 返回顶部 返回列表