## @esengine/ecs-framework 新增 @sync 装饰器和二进制编解码器,支持基于 Component 的网络状态同步: - `sync` 装饰器标记需要同步的字段 - `ChangeTracker` 组件变更追踪 - 二进制编解码器 (BinaryWriter/BinaryReader) - `encodeSnapshot`/`decodeSnapshot` 批量编解码 - `encodeSpawn`/`decodeSpawn` 实体生成编解码 - `encodeDespawn`/`processDespawn` 实体销毁编解码 将以下方法标记为 @internal,用户应通过 Core.update() 驱动更新: - Scene.update() - SceneManager.update() - WorldManager.updateAll() ## @esengine/network - 新增 ComponentSyncSystem 基于 @sync 自动同步组件状态 - 将 ecs-framework 从 devDependencies 移到 peerDependencies ## @esengine/server 新增 ECSRoom,带有 ECS World 支持的房间基类: - 每个 ECSRoom 在 Core.worldManager 中创建独立的 World - Core.update() 统一更新 Time 和所有 World - onTick() 只处理状态同步逻辑 - 自动创建/销毁玩家实体 - 增量状态广播
2.2 KiB
2.2 KiB
@esengine/ecs-framework, @esengine/network, @esengine/server
| @esengine/ecs-framework | @esengine/network | @esengine/server |
|---|---|---|
| minor | minor | minor |
feat: ECS 网络状态同步系统
@esengine/ecs-framework
新增 @sync 装饰器和二进制编解码器,支持基于 Component 的网络状态同步:
import { Component, ECSComponent, sync } from '@esengine/ecs-framework';
@ECSComponent('Player')
class PlayerComponent extends Component {
@sync("string") name: string = "";
@sync("uint16") score: number = 0;
@sync("float32") x: number = 0;
@sync("float32") y: number = 0;
}
新增导出
sync- 标记需要同步的字段装饰器SyncType- 支持的同步类型SyncOperation- 同步操作类型(FULL/DELTA/SPAWN/DESPAWN)encodeSnapshot/decodeSnapshot- 批量编解码encodeSpawn/decodeSpawn- 实体生成编解码encodeDespawn/processDespawn- 实体销毁编解码ChangeTracker- 字段级变更追踪initChangeTracker/clearChanges/hasChanges- 变更追踪工具函数
内部方法标记
将以下方法标记为 @internal,用户应通过 Core.update() 驱动更新:
Scene.update()SceneManager.update()WorldManager.updateAll()
@esengine/network
新增 ComponentSyncSystem,基于 @sync 装饰器自动同步组件状态:
import { ComponentSyncSystem } from '@esengine/network';
// 服务端:编码状态
const data = syncSystem.encodeAllEntities(false);
// 客户端:解码状态
syncSystem.applySnapshot(data);
修复
- 将
@esengine/ecs-framework从 devDependencies 移到 peerDependencies
@esengine/server
新增 ECSRoom,带有 ECS World 支持的房间基类:
import { ECSRoom } from '@esengine/server/ecs';
// 服务端启动
Core.create();
setInterval(() => Core.update(1/60), 16);
// 定义房间
class GameRoom extends ECSRoom {
onCreate() {
this.addSystem(new PhysicsSystem());
}
onJoin(player: Player) {
const entity = this.createPlayerEntity(player.id);
entity.addComponent(new PlayerComponent());
}
}
设计
- 每个
ECSRoom在Core.worldManager中创建独立的 World Core.update()统一更新 Time 和所有 WorldonTick()只处理状态同步逻辑