Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
5.8 KiB
5.8 KiB
@esengine/ecs-framework
2.5.1
Patch Changes
-
#392
a08a84bThanks @esengine! - fix(sync): Decoder 现在使用 GlobalComponentRegistry 查找组件 | Decoder now uses GlobalComponentRegistry for component lookup问题 | Problem:
Decoder.ts有自己独立的componentRegistryMap,与GlobalComponentRegistry完全分离。这导致通过@ECSComponent装饰器注册的组件在网络反序列化时找不到,产生 "Unknown component type" 错误。@sync装饰器使用constructor.name作为typeId,而不是@ECSComponent装饰器指定的名称,导致编码和解码使用不同的类型 ID。Decoder.tshad its own localcomponentRegistryMap that was completely separate fromGlobalComponentRegistry. This caused components registered via@ECSComponentdecorator to not be found during network deserialization, resulting in "Unknown component type" errors.@syncdecorator usedconstructor.nameastypeIdinstead of the name specified by@ECSComponentdecorator, causing encoding and decoding to use different type IDs.
修改 | Changes:
- 从 Decoder.ts 中移除本地
componentRegistry - 更新
decodeEntity和decodeSpawn使用GlobalComponentRegistry.getComponentType() - 移除已废弃的
registerSyncComponent和autoRegisterSyncComponent函数 - 更新
@sync装饰器使用getComponentTypeName()获取组件类型名称 - 更新
@ECSComponent装饰器同步更新SYNC_METADATA.typeId - Removed local
componentRegistryfrom Decoder.ts - Updated
decodeEntityanddecodeSpawnto useGlobalComponentRegistry.getComponentType() - Removed deprecated
registerSyncComponentandautoRegisterSyncComponentfunctions - Updated
@syncdecorator to usegetComponentTypeName()for component type name - Updated
@ECSComponentdecorator to sync updateSYNC_METADATA.typeId
现在使用
@ECSComponent装饰器的组件会自动可用于网络同步解码,无需手动注册。Now
@ECSComponentdecorated components are automatically available for network sync decoding without any manual registration.
2.5.0
Minor Changes
-
#390
1f297acThanks @esengine! - 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()只处理状态同步逻辑