Skip to content
Subdata

基类 / Subdata

Subdata Class

数据控制类的基类

  1. 为什么需要数据控制中心?
  • 数据控制中心可以帮助我们将数据进行永久存储。

  • 数据控制中心实现了服务端和客户端的数据同步。

  • 数据控制中心实现了数据缓存,降低与KV服务器的交互频率。

  • 数据控制中心实现了模块数据的统一管理。

【定义数据方便】数据体只需要继承SubData,数据就能自动被DataCenter管理起来

【保存数据方便】保存数据只需要调用父类SubData的save方法,即可实现保存

【获取数据方便】获取数据只需要传入数据体的类名,即可获取到对应数据

  1. 数据控制中心是如何工作的?

数据上方标注的 @Decorator.saveProperty 装饰器有两个作用:

  • 让字段能够被永久存储(永久存储可以认为当退出游戏后,再次打开游戏,会存储上次游戏数据继续玩)

  • 让字段能够被同步到客户端

  • 没有标注 @Decorator.saveProperty 装饰器将丧失永久存储和同步至客户端的能力。

  1. 通过改写 ModuleService 中的示例,数据控制中心如何使用:
使用示例: C&S 和数据模块组合。
ts
@Component
export default class GameStart extends Script {

    protected onStart(): void {
        ModuleService.registerModule(AppleModS, AppleModC, AppleData);
    }

}
class AppleData extends Subdata {

    @Decorator.persistence()
    appleNum : number = 10;

    public removeApple() {
        this.appleNum -= 1;
        this.save(true);
    }
    public addApple() {
        this.appleNum += 1;
        this.save(true);
    }
}
class AppleModS extends ModuleS<AppleModC,AppleData> {

    public net_appleChange(player:Player) {
        let curPlayer = DataCenterS.getData(this.currentPlayer, AppleData);
        curPlayer.removeApple();
        const otherPlayer = DataCenterS.getData(player, AppleData);
        otherPlayer.addApple();
    }
}
class AppleModC extends ModuleC<AppleModS, AppleData> {

    public npc:Player;

    protected onStart(): void {
        InputUtil.onKeyDown(Keys.P, () => {
            Player.getAllPlayers().forEach( (element) => {
                if(element != this.localPlayer){
                    this.npc = element;
                }
            });
            ModuleService.getModule(AppleModC).sendApple(this.npc);
        });
        InputUtil.onKeyDown(Keys.O, async () => {
            await DataCenterC.ready();
            let apple = DataCenterC.getData(AppleData).appleNum;
            console.log("The current number of apples of the client player is:" + apple);
        });
    }
    public sendApple(player:Player) {
        this.server.net_appleChange(player);
    }
}
@Component
export default class GameStart extends Script {

    protected onStart(): void {
        ModuleService.registerModule(AppleModS, AppleModC, AppleData);
    }

}
class AppleData extends Subdata {

    @Decorator.persistence()
    appleNum : number = 10;

    public removeApple() {
        this.appleNum -= 1;
        this.save(true);
    }
    public addApple() {
        this.appleNum += 1;
        this.save(true);
    }
}
class AppleModS extends ModuleS<AppleModC,AppleData> {

    public net_appleChange(player:Player) {
        let curPlayer = DataCenterS.getData(this.currentPlayer, AppleData);
        curPlayer.removeApple();
        const otherPlayer = DataCenterS.getData(player, AppleData);
        otherPlayer.addApple();
    }
}
class AppleModC extends ModuleC<AppleModS, AppleData> {

    public npc:Player;

    protected onStart(): void {
        InputUtil.onKeyDown(Keys.P, () => {
            Player.getAllPlayers().forEach( (element) => {
                if(element != this.localPlayer){
                    this.npc = element;
                }
            });
            ModuleService.getModule(AppleModC).sendApple(this.npc);
        });
        InputUtil.onKeyDown(Keys.O, async () => {
            await DataCenterC.ready();
            let apple = DataCenterC.getData(AppleData).appleNum;
            console.log("The current number of apples of the client player is:" + apple);
        });
    }
    public sendApple(player:Player) {
        this.server.net_appleChange(player);
    }
}

Table of contents

Properties

onDataChange: Action
数据变化的委托

Accessors

currentVersion(): number
当前数据版本号,和version配合使用,可实现数据升级
version(): number
数据版本号,数据有变化需要重写,和currentVersion配合使用,可实现数据升级

Methods

getSavedProperty<T: >(propertyName: string): T:
通过属性名获取存储的属性值(用作数据升级,读取之前已经存储的数据)
initDefaultData(): void
初始化默认数据,需要请复写
onDataInit(): void
数据初始化完成调用,需要请复写,可在这个方法中实现数据升级
save(syncToClient: boolean): Subdata server
保存数据
syncToClient(): Subdata server
向客户端同步数据

Properties

onDataChange

Readonly onDataChange: Action

数据变化的委托

Accessors

currentVersion

Protected get currentVersion(): number

Protected set currentVersion(value): void

当前数据版本号,和version配合使用,可实现数据升级

Returns

number

当前数据版本号,和version配合使用,可实现数据升级

Parameters

valuenumber

version

Protected get version(): number

数据版本号,数据有变化需要重写,和currentVersion配合使用,可实现数据升级

Returns

number

Methods

getSavedProperty

Protected getSavedProperty<T>(propertyName): T

通过属性名获取存储的属性值(用作数据升级,读取之前已经存储的数据)

Parameters

propertyName string属性名 range:

Returns

T属性值

Type parameters

Name
T

initDefaultData

Protected initDefaultData(): void

初始化默认数据,需要请复写


onDataInit

Protected onDataInit(): void

数据初始化完成调用,需要请复写,可在这个方法中实现数据升级

Precautions

这个方法调用完成后,你需要保证currentVersion和version是相等的


save

save(syncToClient): Subdata server

保存数据

Parameters

syncToClient boolean是否同步给客户端

Returns

Subdata自身

修改数据时,只有调用了 save 并设置参数为 true 时,才会同步至对应客户端。


syncToClient

syncToClient(): Subdata server

向客户端同步数据

Returns

Subdata自身