用途
Smart Wearables 是用于制作 Decentraland 智能可穿戴设备的技能。智能可穿戴设备由可穿戴物品与一个 SDK7 场景组成,该场景在玩家装备该物品时作为便携体验运行,玩家走到哪里代码就运行到哪里。项目是普通 SDK7 项目加上 wearable.json;代码、可穿戴 GLB、缩略图及资源一起打包为 zip 上传到 Builder。
项目结构
用 npx @dcl/sdk-commands init --project smart-wearable 初始化项目。工具链以是否存在 wearable.json 来判断是否为智能可穿戴项目。
关键文件:
wearable.json:Builder 元数据,需严格遵循 schema。scene.json:需设置"isPortableExperience": true,"main": "bin/index.js";scene.parcels仅本地预览使用。thumbnail.png:256×256 PNG,透明背景。models/male/*.glb、models/female/*.glb:体型不同时每种体型一个 GLB;刚性配饰可共用。src/index.ts:玩家装备时运行 main()。package.json:可选添加"pack": "sdk-commands pack-smart-wearable"。.dclignore:与普通场景一致,未被忽略的文件都会进入 zip。
wearable.json 规则
顶层只允许 id、name、description、rarity、data、mapping。旧版字段 menuBarIcon、model、bodyShape、collectionAddress 应移除。必填 name、data。description 最多 64 字符,超长是常见报错原因。rarity 取值:unique(1)、mythic(10)、exotic(50)、legendary(100)、epic(1000)、rare(5000)、uncommon(10000)、common(100000)。id 为 UUID,分叉项目时需重新生成。data 必须包含 replaces、hides、tags、representations、category;可选 removesDefaultHiding、blockVrmExport。representations 需覆盖 BaseMale 与 BaseFemale,mainFile 须在 contents 中。category 可选值包括 eyebrows、eyes、facial_hair、hair、mouth、upper_body、lower_body、feet、earring、eyewear、hat、helmet、mask、tiara、top_head、skin、hands_wear。本地可用 Ajv 校验,需启用 { $data: true }。
大小限制
解压后总大小必须小于 3 MB(MAX_SMART_WEARABLE_FILE_SIZE),Builder 会拒绝超限文件。npm run pack 超过 2 MB 仅提示但仍生成 zip,成功打包不代表合规。每次打包后用 unzip -l smart-wearable.zip 查看总大小。Creator Hub 编辑时可能自动生成约 4 MB 的缩略图并写入 scene.json,需将其加入 .dclignore 并将 navmapThumbnail 置空。还应忽略 blender/、*.blend、renders 及 zip 本身。控制体积:GLB 内用 JPEG 而非 PNG 纹理、短 mp3 音频、移除未用 npm 库。
预览与发布差异
npm run start 或 Creator Hub Play 以普通场景运行代码,而非便携体验;依赖当前场景的物理冲量、输入等在离开地块后失效,发布后则随处可用。预览中可穿戴模型可能不显示。真实测试需上传 Builder、加入收藏集、点击 See in Decentraland(Sepolia)装备。预览仍适合快速调优玩法。
效果可见性
代码仅在穿戴者客户端运行。代码创建的实体、模型、UI、粒子、AudioSource 仅穿戴者可见;可穿戴模型本身、triggerSceneEmote/triggerEmote 表情、表情文件中的道具与骨骼粒子、物理冲量/移动设置对所有人可见。场景表情无音频,仅 Builder 上传的表情有音频;目前无法让智能可穿戴设备的声音被他人听到。穿戴者专属声音用 AvatarAttach(AAPT_POSITION)加循环 AudioSource,切换 playing。移动中技能需用 AvatarMask.AM_UPPER_BODY 遮罩表情,stopEmote 停止。
多人限制
智能可穿戴设备目前无内置多人同步:MessageBus、syncEntity/CRDT、Multiplayer Server 均不可用,每个穿戴者运行独立代码副本。他人仅能看到穿戴者头像的位置、移动及表情(含道具)。共享状态唯一方式是第三方服务器(WebSocket/fetch),且对未穿戴者仍不可见。
运行时行为
便携体验始终被视为当前场景,物理冲量、持续力、inputSystem 随处可用。宿主场景可禁用便携体验或设置 hideUi;AvatarLocomotionSettings 以场景值为准。加载顺序不确定,main() 中不应假设附近有其他玩家。物理参数:角色质量 1,冲量即速度变化 m/s;外部速度阻力 1.5/s,上限 50 m/s;向上冲量先清零下落速度;约 6 初始加每 0.1 秒 0.8 可持续约 4–5 m/s 爬升。
预加载
在 main() 创建一个 AssetLoad 实体列出表情 .glb 和音频文件。音频进入 AudioSource 缓存,首次播放即时。表情 .glb 由模型加载器下载,预加载消除下载等待但首次 triggerSceneEmote 仍需初始化。注册 assetLoadLoadingStateSystem 记录 FINISHED_WITH_ERROR/NOT_FOUND 以捕获错误路径。
打包上传
npm run pack 生成 smart-wearable.zip,确认解压总大小小于 3 MB、无源文件及自动缩略图。Builder → Collections → 集合 → New item 拖入 zip,自动识别。上传前需准备 ≤4 MB、≤15 秒的 mp4 展示视频。在 item editor 检查 hides/replaces、描述、标签。通过 See in Decentraland 在 Sepolia 测试,再发布集合(需 Curation Committee 审核)。
上传前检查清单
- wearable.json 仅含允许顶层键;description ≤64 字符;data 五个必填键齐全;覆盖两种体型;UUID 为新生成。
- 每个 GLB 符合类别限制;两种体型均已导出并引用。
- thumbnail.png 256 像素方形、透明。
- .dclignore 覆盖 blender/、assets/Images、*.zip;navmapThumbnail 为空。
unzip -l总大小 <3 MB。- 面向他人的效果放在表情道具中,而非 ParticleSystem/实体;声音仅穿戴者可闻并已告知用户。
- 已通过 See in Decentraland 在预览地块之外测试。