本帖最后由 空伊伊 于 2023-11-8 17:27 编辑
本帖最后由 空伊伊 于 2023-11-8 17:26 编辑
模块管理和数据中心
目录
为什么要使用模块管理①
模块管理的使用步骤②
模块管理的各功能介绍③
为什么要使用数据中心④
数据中心的使用步骤⑤
数据中心的各功能介绍⑥
数据中心的各功能介绍及其运行逻辑
1.数据中心工作流

2.SubData
SubData是数据class的基类,继承它,数据才能够被DataCenter管理起来。
●SubData的核心功能:通过装饰器标记永久存储字段
@Decorator.saveProperty装饰器有两个作用:
1.让字段能够被永久存储
2.让字段能够被同步到客户端
注意:
继承SubData的子类,属性不能有dataInfo命名,不能有名为init的方法!
export class MyData extends Subdata {
@Decorator.persistence()
myName: string // 加了装饰器、能够被永久存储 | 能够同步到客户端
@Decorator.persistence()
myAge: number // 加了装饰器、能够被永久存储 | 能够同步到客户端
myTime: number // 没加装饰器,不能够被永久存储
/**初始化数据,当远端数据不存在时,会调用这个方法来初始化数据 */
public initDefaultData(): void {
this.myName = "Zoe"
this.myAge = 11
this.myTime = 2023
}
}
●SubData的生命周期
SubData在被创建的时候,会被添加到以类名为key,SubData为value的一个Map中。(因为一个玩家可能定义了多个SubData来存储数据,所以用一个Map存储方便存取)这个Map就是一位玩家的数据(PlayerData)由DataCenterS管理所有玩家的数据;由DataCenterC管理自己的数据;C的数据是由S同步过来的
●SubData的关键方法(都只在服务端调用生效)
保存数据:save()将数据更改保存到Map中(如果参数填true,数据的改动会同步给客户端)
同步数据:syncToClient()将数据同步给客户端
●SubData提供了数据变化的委托
onDataChange:Type.Action
当服务端数据变化时,服务端执行委托方法;当服务端将数据同步给客户端时,客户端执行委托方法
3.DataCenterS
DataCenterS是一个单例,需要用getInstance()来获取其实例
●DataCenterS的主要功能:
自动将数据保存到KV服务器:
DataCenterS每隔10秒,会将自己管理的Map里的数据,使用DataStorage.asyncSetPlayerData上传到KV服务器。(这么做的目的是降低与KV服务器的交互频率)
自动将数据同步给DataCenterC:
DataCenterS在检测到玩家进入游戏时,会使用DataStorage.asyncGetPlayerData从KV服务器上获取一次数据,然后同步给DataCenterC。之后,可以在每次保存数据时将DataCenterS的数据同步给DataCenterC
管理了房间内所有客户端的数据:
DataCenterS将房间内所有玩家的PlayerData以键值对的形式存放在playerDataMap中
●DataCenterS的关键方法
获取指定玩家的数据:getData()传入Player|playerID以及SubData名称取出对应的数据
获取在线且数据准备就绪的玩家列表:getReadyPlayerIds()
当玩家数据准备好时的监听:onPlayerJoined
4.DataCenterC
DataCenterC是一个单例,需要用getInstance()来获取其实例
●DataCenterC的主要功能:管理自己的数据
●DataCenterC的关键方法:获取自己的数据:getData()判断数据是否准备就绪:ready()