关于 deploy-worlds
deploy-worlds 是面向 Decentraland 场景作者的部署指南,说明如何将场景发布到个人 Worlds,并管理配置、存储与访问。它涵盖 Creator Hub 和 CLI 流程,也介绍多场景 Worlds。
主要功能
- 01配置 World 名称与 Places 元数据
- 02通过命令或 Creator Hub 部署
- 03检查存储预算与上传大小
- 04设置天空盒时间
- 05部署和管理多场景 World
适用场景
- 01将场景发布到 Decentraland World
- 02发布前检查场景大小与元数据
- 03为 World 设置多场景布局
- 04排查名称所有权或部署问题
MCP 相关
指南提到使用 unity-explorer MCP 截取缩略图,用于 World 的发现元数据。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ decentraland/ sdk-skills --skill deploy-worlds安装后在 Claude Code 中输入/deploy-worlds确认已加载。
详细介绍
部署到 Decentraland Worlds
未安装在 Creator Hub Agent 中。 Creator Hub 的技能安装器会拒绝安装此技能,而且由于该目录中只有
SKILL.md,因此会完全跳过它——它不会到达应用内嵌的 AI 助手。Creator Hub 通过自己的 UI 负责发布。如果你是 Creator Hub 助手,且用户要求发布,请引导他们使用应用的发布流程。在 Creator Hub 之外(Claude Code、Cursor、SDK Agent),此技能可正常工作。
Worlds 是不与 LAND 绑定的个人 3D 空间。它们没有地块限制,并会自动列在 Places 页面上。
要求
要发布到 World,用户必须拥有以下任一项:
- Decentraland NAME(例如,
my-name.dcl.eth) - ENS 域名(例如,
my-name.eth)
为部署签名的钱包必须拥有该 NAME,或通过访问控制列表(ACL)获得授权。
存储预算
部署到 Worlds 的场景会占用同一钱包所拥有的所有 Worlds 共用的存储预算。预算根据钱包持有的资产动态计算:
- 每个拥有的 Decentraland NAME 可增加 100 MB(并同时获得一个 World)。
- 每块拥有的 LAND 地块可额外增加 100 MB。
- 钱包中每持有 2,000 MANA,可再增加 100 MB。
- ENS 域名 World 的固定上限为 36 MB,无法扩展。
用户可以按需将预算分配到多个 World。在 Creator Hub 的 Manage 部分查看用量(点击 View Details 查看明细),或在 Builder 的 Worlds 标签页查看。
如果超出预算(例如出售/转让资产后),在 Worlds 无法访问之前有 48 小时的宽限期可用于释放空间。可通过获取更多 MANA/NAME/LAND 或取消部署场景来恢复访问权限。
发布前就要核算上传大小,不要等到发布后再做:在 deploy-scene 的部署前检查清单中执行大小检查(意外占用空间的通常是内嵌 2048 px 纹理贴图的大型 GLB 文件;项目的 bin/index.js 是开发版,通常比 deploy 上传的压缩 bundle 大几 MB)。
1. 配置 scene.json
在 scene.json 中添加 worldConfiguration 部分:
{
"worldConfiguration": {
"name": "my-name.dcl.eth"
}
}
name 字段必须与部署钱包拥有的 Decentraland NAME 或 ENS 域名一致。
选择不列入 Places
所有 Worlds 都会自动列在 Places 页面上。要选择不列入:
{
"worldConfiguration": {
"name": "my-name.dcl.eth",
"placesConfig": {
"optOut": true
}
}
}
发现信息
除非选择不列入,否则 Worlds 都会列在 Places 上,因此此处适用与 Genesis City 发现功能相同的元数据。发布前请确认以下四项均已设置——根据场景推断并填写你能确定的信息,只就剩余信息询问用户:
display.title— World 的名称display.description— 用一两句话说明它是什么tags— 根级数组,包含 1-3 个 Places-dApp 类别,类别须从预定义列表中选择:"art"、"game"、"casino"、"social"、"music"、"fashion"、"crypto"、"education"、"shop"、"business"、"sports"、"parkour"display.navmapThumbnail—.png/.jpg,16:9,建议尺寸为 1920x1080 px;重要内容应放在中央 1080x1080 的正方形区域内,因为缩略图的正方形裁剪图会显示这一区域。确认文件存在,并使用sips -g pixelWidth -g pixelHeight <path>(macOS)或magick identify -format "%wx%h\n" <path>检查其尺寸。然后裁剪中央正方形,并查看裁剪图,而非完整画面:在完整画面中看起来正常的边到边文字,裁剪后可能会有问题(裁剪命令见 deploy-scene 的部署前检查清单)。使用 unity-explorer MCP 自行截取,不要让用户提供——完整规格和操作流程见 deploy-scene 技能(“缩略图”部分)
2. 部署
使用 /deploy 命令——它会自动检测 scene.json 中的 worldConfiguration,并自动部署到 Worlds 内容服务端。
也可以通过 CLI 手动部署:
npx @dcl/sdk-commands deploy --target-content https://worlds-content-server.decentraland.org
系统会提示用户使用其钱包为部署签名。系统会自动运行验证,以允许或拒绝该场景。
项目根目录下 .dclignore 匹配的文件不会上传——请将 Blender 源文件、概念艺术和 Markdown 文档等工作文件列在其中,让 World 保持轻量。请参阅 deploy-scene 技能中的 .dclignore 章节。
通过 Creator Hub
- 在 Creator Hub 中打开场景项目
- 点击 Publish 按钮(右上角)
- 选择 PUBLISH TO WORLD
- 选择要发布到的 NAME 或 ENS 域名
3. 访问 World
部署成功后,/deploy 命令会自动输出访问 URL。
要分享给玩家的链接是 Web /jump 链接,无论玩家是否安装了桌面客户端,都可以使用:
https://decentraland.org/jump?realm=NAME.dcl.eth
这是规范路径。旧版 https://decentraland.org/play/world/NAME.dcl.eth 格式只会重定向到该链接(HTTP 301)——请勿生成 /play URL。对于 Genesis City 场景,对应的链接为 https://decentraland.org/jump?position=x,y。Creator Hub 的发布后面板会显示并复制这一精确链接,而其 Jump In 按钮则会单独通过 decentraland://?realm=NAME.dcl.eth&dclenv=<env> 打开桌面客户端(creator-hub 4305bb17c)——为玩家编写内容时,优先使用 Web 链接;仅当确定目标用户已安装客户端时,才使用深层链接。
还可使用 https://decentraland.zone/bevy-web?realm=NAME.dcl.eth 在浏览器中打开 Bevy 客户端。
在 Decentraland 内部,使用聊天框命令:
/goto NAME.dcl.eth
完整的 scene.json 示例
{
"ecs7": true,
"runtimeVersion": "7",
"display": {
"title": "My World",
"description": "A personal 3D space",
"navmapThumbnail": "images/thumbnail.png"
},
"tags": ["social"],
"scene": {
"parcels": ["0,0"],
"base": "0,0"
},
"main": "bin/index.js",
"worldConfiguration": {
"name": "my-name.dcl.eth"
}
}
World 配置选项
除了 name 和 placesConfig 外,worldConfiguration 还支持天空盒和小地图自定义:
"worldConfiguration": {
"name": "my-name.dcl.eth",
"skyboxConfig": {
"fixedTime": 43200
},
"placesConfig": {
"optOut": false
}
}
skyboxConfig.fixedTime——已通过引擎测试场景和当前文档验证。skyboxConfig.textures、miniMapConfig(visible/dataImage/estateImage)——[未验证:引擎测试场景和当前场景元数据文档中均未提及;使用前请对照 js-sdk-toolchain 场景架构确认]。
skyboxConfig.fixedTime 的取值:
取值为午夜起算的秒数;一整天为 86400 秒。
| 取值 | 时段 |
|---|---|
0 | 午夜 |
21600 | 上午 6 点(日出) |
43200 | 正午 |
64800 | 下午 6 点(日落) |
86400 | 全天(最大值) |
任何大于 86400 的值都会被视为午夜。省略 fixedTime 可启用动态昼夜循环。
worldConfiguration.skyboxConfig.fixedTime 已在引擎测试场景中验证可用;如果两者都存在,它的优先级高于顶层 skyboxConfig.fixedTime。运行时控制请参阅 lighting-environment 技能(其中的 SkyboxTime 组件会覆盖这两个 JSON 值)。
多场景 World
一个 World 可以托管多个相互独立、位于不同坐标的场景。添加或移除场景时,World 会动态扩展或收缩,场景之间的空隙由环境填充。
**通过 Creator Hub 启用:**首次发布时,打开 Multi-Scene World (advanced) 开关。
通过 CLI 部署:
npm run deploy -- --multi-scene --target-content https://worlds-content-server.decentraland.org
启用后,World Owner 可以:
- 将其他场景发布到同一 World 的不同地块
- 添加拥有部署权限的协作者(可访问所有地块或指定坐标)
- 通过 World 设置中的 Layout 标签管理布局(移除场景、查看 World 地图)
- 设置 World 出生位置(玩家进入的地块)
**协作者提示:**拥有“所有地块”访问权限的协作者可以覆盖 World 中的任何场景,包括所有者发布的场景。
协作者部署时,使用常规 deploy 流程——发布流程只会显示你有权访问的地块。
发布后转换
World 会像 Genesis City 场景一样进行资源包转换——每次发布后,3D 模型都会在服务器端压缩。转换通常只需几秒(非常大的场景或服务器繁忙时会更久);场景可玩后,Jump In 按钮便会显示。转换持续运行几分钟仍未完成,表示出现故障,而非正常排队。如需查看转换状态端点和 /detectabs 聊天命令,请参阅 deploy-scene 技能中的“发布后:资源包转换”。发布前,可在预览中使用 Compress Assets(Creator Hub > Desktop Client 中的 Play Options)或 --asset-bundles,以便发现转换问题。
本次会话中已加载 World 的任何人都会继续看到缓存版本,直到完全关闭并重新进入 Decentraland——仅重新加载场景并不足够。
World 元数据与场景元数据
World 及其中发布的每个场景都分别拥有两套独立的名称、描述和缩略图。弄错这一点通常会导致“我改了描述,但 Places 仍显示旧内容”。
| 场景元数据 | World 元数据 | |
|---|---|---|
| 存储位置 | 场景项目的 scene.json | World 自身 |
| 编辑方式 | 在 Scene Editor 中编辑场景设置 | 在 Creator Hub 的 Manage 标签页下编辑 World 的 Settings |
| 上传时机 | 每次发布场景时一并上传 | 仅在此处编辑时上传(或按下文所述上传) |
| 显示位置 | 场景中 | Decentraland Places 和 World 内的信息界面 |
它们的交互方式取决于 World 中包含多少个场景:
- 空 World — 发布第一个场景时,会使用该场景的元数据填充 World 的元数据。
- 单场景 World — 每次发布都会用场景的元数据覆盖 World 的元数据。因此,在 Manage 标签页中所做的更改会在下次发布时被静默还原;请改为编辑场景设置。实际上,此处可以完全忽略 World 元数据。
- 多场景 World — 两者完全独立。发布场景不会更改 World 元数据,Manage 标签页是唯一可以编辑 World 元数据的位置。
故障排除
| 错误 | 原因 | 解决方案 |
|---|---|---|
| “NAME not found” 或 “NAME not owned” | 为部署签名的钱包不拥有 worldConfiguration.name 中的 NAME/ENS | 在 https://builder.decentraland.org/names 验证 NAME 所有权。用于签名的钱包必须拥有完全匹配的 NAME |
| ENS 解析失败 | ENS 域名未注册或已过期 | 在 https://app.ens.domains 检查 ENS 注册状态 |
| “Scene too large” | 场景超出 World 存储预算(参见上文的存储预算) | 首先,将所有工作文件(Blender/FBX 源文件、概念图、文档)添加到项目根目录中的 .dclignore,以免上传——参见 deploy-scene 中的 .dclignore 部分。然后减小资源大小。在 Creator Hub 的 Manage 标签页或 Builder 的 Worlds 标签页中检查剩余预算 |
| 部署成功但 World 为空 | main 字段配置错误 | 确保 main 为 "bin/index.js",且代码已成功编译 |
| World 未显示在 Places 中 | 传播延迟 | 部署后等待几分钟。如果通过 placesConfig.optOut 选择退出,则不会显示 |
示例场景
- https://github.com/decentraland/sdk7-test-scenes/tree/main/scenes/3,0-skybox-world-json — 通过
worldConfiguration.skyboxConfig.fixedTime设置固定天空盒时间,并使用getSceneInformation读取该时间的 World 场景。
要部署到 Genesis City? 请参阅 deploy-scene 技能。
与 Genesis City 的主要区别
- 没有地块限制 — World 不受 LAND 所有权限制
- 必须拥有 NAME/ENS — 必须拥有 Decentraland NAME 或 ENS 域名,而非 LAND
- 部署目标不同 — 使用
--target-content https://worlds-content-server.decentraland.org - 自动列入 Places — 除非通过
placesConfig.optOut选择退出