Skip to content
ModuleC<T, S>

基类 / ModuleC

ModuleC<T, S> Class

客户端模块的基类

所有的客户端模块都必须继承这个类,才能被 ModuleService 管理。

注意:继承自 ModuleC 类中的方法名。当方法名前缀为"net_XXX"的方法才能在继承 ModuleS 中调用。

在 Script 类中说过,继承自 Script 的类享受onStart、OnUpdate、OnDestroy脚本的生命周期,在此基础之上,当在onStart()函数中注册了客户端服务端以及数据模块之后

ModuleService.registerModule(YourModS, YourModC, YourData);

使用示例:创建一个名为ModuleCExample的脚本,放置在对象栏中,打开脚本,将原本内容修改为如下内容,保存并运行游戏,客户端日志会输出player模块每个生命周期执行的日志,按下F键你将在客户端以及服务端日志中看到玩家等级的信息
ts
@Component
export default class ModuleCExample extends Script {

    protected onStart(): void {
        ModuleService.registerModule(PlayerModuleS, PlayerModuleC, PlayerModuleData);
    }

}

class PlayerModuleC extends ModuleC<PlayerModuleS, PlayerModuleData>{

    protected onAwake(): void {
        console.log("-----------player模块创建模块-----------");
    }

    protected onStart(): void {
        console.log("-----------player模块开始-----------");
        //输出当前玩家的等级
        let playerData = this.data;
        console.log("玩家等级:", playerData.getlevel());
        playerData.onDataChange.add(() => {
            //玩家数据发生变化时,输出当前玩家的等级
            console.log("玩家等级:", playerData.getlevel());
        })
        InputUtil.onKeyDown(Keys.F, () => {
            this.server.net_LevelUp();
        })
    }

    protected onEnterScene(sceneType: number): void {
        console.log("-----------player模块进入场景-----------");
    }

    protected onUpdate(dt: number): void {
        //每帧调用 dt为两帧之间的时间差
        // console.log("-----------player模块更新-----------"+dt);
    }

    protected onDestroy(): void {
        console.log("-----------player模块销毁-----------");
    }

}
class PlayerModuleS extends ModuleS<PlayerModuleC, PlayerModuleData>{
    //玩家升级
    public net_LevelUp(): void {
        //调用该函数的客户端玩家
        let player = this.currentPlayer;
        //调用该函数的客户端玩家id
        let playerId = this.currentPlayerId;
        //调用该函数的客户端玩家数据
        let playerData = this.currentData;
        playerData.levelUp();
        console.log("玩家等级:", playerData.getlevel());
    }
}
class PlayerModuleData extends Subdata {
    @Decorator.persistence()
    private level: number;

    protected initDefaultData(): void {
        this.level = 0;
    }

    public getlevel(): number {
        return this.level;
    }

    public levelUp(): void {
        this.level++;
        //保存数据
        this.save(true);
    }
}
@Component
export default class ModuleCExample extends Script {

    protected onStart(): void {
        ModuleService.registerModule(PlayerModuleS, PlayerModuleC, PlayerModuleData);
    }

}

class PlayerModuleC extends ModuleC<PlayerModuleS, PlayerModuleData>{

    protected onAwake(): void {
        console.log("-----------player模块创建模块-----------");
    }

    protected onStart(): void {
        console.log("-----------player模块开始-----------");
        //输出当前玩家的等级
        let playerData = this.data;
        console.log("玩家等级:", playerData.getlevel());
        playerData.onDataChange.add(() => {
            //玩家数据发生变化时,输出当前玩家的等级
            console.log("玩家等级:", playerData.getlevel());
        })
        InputUtil.onKeyDown(Keys.F, () => {
            this.server.net_LevelUp();
        })
    }

    protected onEnterScene(sceneType: number): void {
        console.log("-----------player模块进入场景-----------");
    }

    protected onUpdate(dt: number): void {
        //每帧调用 dt为两帧之间的时间差
        // console.log("-----------player模块更新-----------"+dt);
    }

    protected onDestroy(): void {
        console.log("-----------player模块销毁-----------");
    }

}
class PlayerModuleS extends ModuleS<PlayerModuleC, PlayerModuleData>{
    //玩家升级
    public net_LevelUp(): void {
        //调用该函数的客户端玩家
        let player = this.currentPlayer;
        //调用该函数的客户端玩家id
        let playerId = this.currentPlayerId;
        //调用该函数的客户端玩家数据
        let playerData = this.currentData;
        playerData.levelUp();
        console.log("玩家等级:", playerData.getlevel());
    }
}
class PlayerModuleData extends Subdata {
    @Decorator.persistence()
    private level: number;

    protected initDefaultData(): void {
        this.level = 0;
    }

    public getlevel(): number {
        return this.level;
    }

    public levelUp(): void {
        this.level++;
        //保存数据
        this.save(true);
    }
}

Type parameters

TT
Sextends Subdata

Hierarchy

Table of contents

Accessors

data(): S
本地玩家的模块数据
localPlayer(): Player client
获取当前玩家
localPlayerId(): number client
获取当前玩家ID
server(): T client
和自己绑定的服务端模块,可通过此对象直接调用net_开头的服务端方法

Methods

onAwake(): void client
生命周期方法-创建模块时调用
onDestroy(): void client
生命周期方法-销毁模块调用
onEnterScene(sceneType: number): void client
生命周期方法-进入场景调用
onExecute(type: number, ...params: any[]): void client
外部调用本模块的某个操作
onStart(): void client
生命周期方法-启动模块时调用
onUpdate(dt: number): void client
生命周期方法-刷新模块调用

Type parameters

TT
Sextends Subdata<S>

Accessors

data

Protected get data(): S

本地玩家的模块数据

Returns

S

localPlayer

Protected get localPlayer(): Player client

获取当前玩家

Returns

Player

localPlayerId

Protected get localPlayerId(): number client

获取当前玩家ID

Returns

number

server

Protected get server(): T client

和自己绑定的服务端模块,可通过此对象直接调用net_开头的服务端方法

Returns

T

Methods

onAwake

Protected onAwake(): void client

生命周期方法-创建模块时调用


onDestroy

Protected onDestroy(): void client

生命周期方法-销毁模块调用


onEnterScene

Protected onEnterScene(sceneType): void client

生命周期方法-进入场景调用

Parameters

sceneType number场景类型(预留) range: type:

onExecute

Protected onExecute(type, ...params): void client

外部调用本模块的某个操作

Parameters

type number操作类型 range: type:
...params any[]操作参数

onStart

Protected onStart(): void client

生命周期方法-启动模块时调用


onUpdate

Protected onUpdate(dt): void client

生命周期方法-刷新模块调用

Parameters

dt number两帧之间的时间差(单位:秒) range: type:浮点数