用途:在 Decentraland 场景中让玩家之间共享状态,默认玩家交互互不共享,需显式选择同步方式。
主要能力与选择依据:syncEntity 同步所有玩家可见且对新加入者持久的状态(门、开关、记分板、电梯);MessageBus 发送瞬时事件(聊天、音效、粒子),后加入者收不到历史消息;fetch 读写外部服务器数据;signedFetch 携带加密签名证明玩家身份;WebSocket 用于与服务端的实时双向通信。可组合使用,如 syncEntity 管世界状态、MessageBus 管特效、fetch 管持久化。
必要用法:导入 engine、Transform 等来自 @dcl/sdk/ecs,syncEntity 来自 @dcl/sdk/network,签名为 syncEntity(entity, componentIds[], syncId?)。预定义实体应声明在 main-entities.ts 并在 src/index.ts 调用,且需要唯一数字 syncId(建议用枚举避免冲突);运行时生成的实体用 engine.addEntity() 创建后立即 syncEntity,可不给 syncId。自定义组件用 engine.defineComponent 定义,支持 Schemas 的 Boolean、Int、Float、String、Int64、Vector3 等类型。父子关系须用 parentEntity() 而非直接设置 Transform.parent。使用 isStateSyncronized() 判断同步是否就绪(注意 SDK 中拼写为 Syncronized)。网络请求须放在 executeTask 内,因为不支持顶层 await。
适用场景:多人游戏、共享道具与计分、实时聊天等。
限制:状态仅在场景内至少有一名玩家时保留,场景清空即重置,需要跨场景持久化须存到自建服务器;实体需显式 syncEntity 才会同步;冲突采用最后写入者胜出;场景完全客户端运行,无服务端代码,需要校验或防作弊需参考 authoritative-server;每个同步实体占用场景实体预算;自定义 schema 必须各客户端一致;时间戳等大数须用 Schemas.Int64,用 Schemas.Number 会损坏。
Decentraland 运行于 QuickJS 沙箱,无 Node.js API(fs、http、path、process),网络通信只能用 fetch 与 WebSocket。测试可开多个浏览器窗口,每个窗口为独立玩家;不需要多人的 Worlds 可用 fixedAdapter: offline:offline。技能中其余细节暂未提供。