> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/creator/content-creator-zh/chang-jing-sdk7/fa-bu/publishing.md).

# 发布

如何发布我的项目？

## 开始之前

请确保以下事项：

* 你的场景符合所有 [场景限制](/creator/content-creator-zh/chang-jing-sdk7/you-hua/scene-limitations.md)。其中大多数会在你每次运行场景预览时进行验证。
* 如果你希望你的场景在移动端玩家上运行良好，请先在真机上预览并测试——见 [面向移动端构建](/creator/content-creator-zh/wei-yi-dong-duan-gou-jian/yi-dong-ke-hu-duan/overview.md) 和 [在移动端预览](/creator/content-creator-zh/wei-yi-dong-duan-gou-jian/kai-fa/preview-on-mobile.md)。一旦发布，你的场景就可以通过 Decentraland 移动应用访问，方式与桌面端相同。
* 你拥有一个 [Metamask](https://metamask.io/) 账户，并将你的 LAND 地块分配给它。
* 你拥有所需数量的相邻 LAND 地块或一个 Decentraland NAME。否则，你可以在 [市场](https://market.decentraland.org) 购买 LAND，或者在 [市场](https://decentraland.org/shop/items?category=names).

{% hint style="warning" %}
\*\*📔 注意\*\*：多地块场景只能部署到相邻的地块。
{% endhint %}

{% hint style="danger" %}
**❗警告**：在规划现场活动时，不要在活动开始前临时对场景做最后一刻的更改。请至少在活动开始前一小时发布最终版本。

每次发布后，系统会运行一个内部流程，在所有 3D 模型可渲染之前对其进行优化。这通常只需几秒钟，但对于非常大的场景或服务器繁忙时可能会更久。在完成之前，玩家看到的仍是你场景的上一个版本。
{% endhint %}

## 检查场景数据

在部署时，CLI 会从 *scene.json* 文件中读取信息，以确定要将你的场景部署到哪里。

打开你场景的 *scene.json* 文件并填写以下数据：

* **标题**：标题会在玩家进入你的场景时显示在小地图下方的 UI 中，也会显示在传送弹窗上。
* **描述**：玩家在你的场景中会看到什么的描述。这会显示在传送弹窗上。
* **navmapThumbnail**：代表你场景的图片。这会显示在传送弹窗上。图片应为 *.png* 或 *.jpg* 图像，推荐尺寸为 *228x160* 像素。
* **地块**：你的场景将占用的地块坐标
* **基础**：将被视为场景 \[0,0] 坐标的地块坐标。如果你的场景包含多个地块，它应是左下角（西南角）地块。
* **spawnPoints**：场景内的一组坐标（相对于场景的基础地块），玩家会在此生成。默认情况下，玩家会在 *0,0,0* 场景位置（左下角）生成。可使用此项将玩家放在特定位置，或设置一个区域，以防止玩家首次出现时彼此重叠。
* **标签**：描述你场景的一组标签。这些标签有助于玩家通过更容易找到他们感兴趣的内容来探索 Decentraland。 [查看可用类别列表](/creator/content-creator-zh/chang-jing-sdk7/xiang-mu-lei-xing/scene-metadata.md#categories).
* **分级**：这用于对你场景的内容进行分类。Decentraland 是一个 18+ 平台，因此要设置的值是 `一个` 成人。参见 [年龄分级](/creator/content-creator-zh/chang-jing-sdk7/xiang-mu-lei-xing/scene-metadata.md#age-rating).

{% hint style="warning" %}
**📔 注意**：参见 [场景元数据](/creator/content-creator-zh/chang-jing-sdk7/xiang-mu-lei-xing/scene-metadata.md) ，以了解如何设置这些参数的更多详情。
{% endhint %}

## 发布场景

### 在 Creator Hub 中使用 Scene Editor

Creator Hub 中的场景编辑器提供了发布场景的便捷方式。请确保你已经 [安装了 Creator Hub](/creator/content-creator-zh/chang-jing-bian-ji-qi/kai-shi-shi-yong/editor-installation.md).

1. 打开你的场景项目。
2. 点击 **发布** 右上角按钮。
3. 系统会提示你是否要发布到 **WORLD** 或 **LAND**.
   * 选择 **发布到 WORLD** ，以让你的场景在你的一个 [WORLD](/creator/content-creator-zh/chang-jing-sdk7/fa-bu/publishing-options.md#decentraland-worlds)中可用。然后选择要发布到你的哪些 NAME 或 ENS 域。
   * 选择 **发布到 LAND** ，如果你拥有土地，或已被所有者授予部署权限。然后在地图上选择你想部署到的地块。你被允许部署的地块会以粉色显示。
   * 选择 **替代服务器** 发布到 [自定义服务器](#custom-servers).

![](https://2460066822-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-a9b358ccf604ec11addf4852ce36c321e35745e0%2Fpublish-options.png?alt=media)

4. 这会在浏览器中打开一个新标签页，显示上传详情。使用你的钱包对部署进行签名。这只是一个用于证明所有权的签名，免费且不涉及任何区块链交易。
   * 对于 Metamask 浏览器账户中的 LAND，请确认部署。然后在 Metamask 浏览器扩展中签署消息。
   * 对于与可通过 Wallet Connect 使用的钱包关联的 LAND，请点击 **连接钱包**，然后使用你的移动设备扫描二维码，并按照 Wallet Connect 中的步骤操作。

### 通过 CLI

1. 使用与你在 Decentraland 中地块关联的相同公共地址登录你的 Metamask 账户。
2. 运行 `npm run deploy` 来自场景文件夹。

{% hint style="info" %}
\*\*💡 提示\*\*：如果你的项目文件夹中有不想部署的文件，请在部署前将它们列入 \_.dclignore\_ 文件。
{% endhint %}

3. 浏览器标签页将会打开，显示你要部署到哪些地块。点击 **签名并部署**.
4. Metamask 会打开，提示你需要签名。点击 **签名** 以确认此操作。

{% hint style="info" %}
**💡 提示**：如果你正在实现持续集成流程，即你的场景变更会自动部署，那么你可以将 `export DCL_PRIVATE_KEY` 环境变量设置为某个具有部署权限账户的私钥。
{% endhint %}

{% hint style="info" %}
**💡 提示**: `npm run deploy` 运行一个 `npm run build`，它会比运行 `npm run start`时更严格地检查场景中的类型错误。如果这些错误无法避免（例如：它们发生在外部库中）且不会影响场景，你可以使用 `npm run deploy -- --skip-build` 来跳过 `npm run build` 步骤并按原样部署场景。
{% endhint %}

## 发布到 Worlds

要将你的场景发布到 Decentraland World，你需要拥有一个 Decentraland NAME 或 ENS 域。请参见 [发布选项](/creator/content-creator-zh/chang-jing-sdk7/fa-bu/publishing-options.md#decentraland-worlds) 了解如何获取它。

### 配置 scene.json

你需要指定部署要在哪个 **名称** 上进行。请在你的 `scene.json`:

```json
{
	"worldConfiguration": {
		"name": "my-name.dcl.eth"
	}
}
```

该 **名称** 中指定的 `scene.json` 可以是 Decentraland NAME 或 ENS 域。它必须由签署部署的钱包拥有，或由通过访问控制列表（ACL）获得权限的任意钱包拥有。

请记住以下几点：

* 签署部署的钱包必须拥有在 `scene.json` 文件
* 中指定的 NAME
* 所有 World 默认都会列在 Places 页面中，除非你按下述方式选择退出

### 世界元数据

World 有自己独立的名称、描述和缩略图，与发布到其中的场景元数据分开。当你发布到一个空的 World，或发布到只包含一个场景的 World 时，World 的元数据会在每次发布时更新为与场景元数据一致。如果该 World 包含多个场景，其元数据是独立的：发布某个场景不会更改它，而且只能在 Creator Hub 的 **管理** 部分进行编辑。参见 [世界元数据与场景元数据](/creator/content-creator-zh/chang-jing-bian-ji-qi/fa-bu/publish-scene.md#world-metadata-vs-scene-metadata).

### World 存储预算

部署到 World 的场景会计入一个存储预算，该预算在你钱包拥有的所有 World 之间共享。该预算会随着你持有的 Decentraland 资产增加：

* 你拥有的每个 Decentraland NAME 可增加 100 MB。
* 你拥有的每个 LAND 地块可额外增加 100 MB。
* 钱包中每持有 2,000 MANA，可额外增加 100 MB。

你可以自由地在各个 World 之间分配这部分预算。例如，若预算为 500 MB，你可以部署一个 300 MB 的场景和一个 200 MB 的场景，或者五个 100 MB 的场景。发布到 ENS 域的 World 不会占用这部分预算，而是改为每个 World 有固定的 36 MB 上限。

你可以在两个地方查看已使用了多少预算以及还剩多少：

* 该 **管理** 部分。点击 **查看详情** 可查看你的 MANA、LAND 和 NAME 持有量如何累计。
* 该 **Worlds** 选项卡中查看你已使用和剩余的存储额度。 [Builder](https://decentraland.org/builder/worlds).

如果你超出预算（例如在出售或转移资产后），你有 48 小时来腾出空间或增加预算，然后你的 World 才会变得无法访问。参见 [World 大小限制](/creator/content-creator-zh/chang-jing-sdk7/xiang-mu-lei-xing/kinds-of-project.md#size-limits) 了解更多详情。

### 多场景 World

默认情况下，通过 CLI 部署到 world 时，你的场景会被视为单场景 world。如果你的 world 已经包含一个场景，部署新场景会覆盖旧场景，即使坐标不同也是如此。

要将其作为多场景 world 部署，请在部署命令中添加参数 `--multi-scene` ：

`npm run deploy -- --multi-scene --target-content https://worlds-content-server.decentraland.org`

使用此参数时，如果你正在发布的场景与该 world 中现有场景的坐标不同，这些场景将会共存。

{% hint style="warning" %}
\*\*📔 注意\*\*：如果你对一个并不属于你的 world 拥有操作员权限，并且只被授予了该 world 中特定地块的权限，那么你将只能发布到这些地块，不能影响该 world 其他地块上的内容。
{% endhint %}

### 从 Places 列表中选择退出

如果你希望你的 World 不被 Places 索引，可以在你的 `scene.json`:

```json
{
	"worldConfiguration": {
		"name": "my-name.dcl.eth",
		"placesConfig": {
			"optOut": true
		}
	}
}
```

### 在 Creator Hub 中使用 Scene Editor

1. 打开你的场景项目。
2. 点击 **发布** 右上角按钮。
3. 选择 **发布到 WORLD**.
4. 选择要发布到你的哪些 NAME 或 ENS 域。

### 通过 CLI

使用以下命令：

```bash
npm run deploy -- --target-content https://worlds-content-server.decentraland.org
```

运行该命令后，系统会提示你使用钱包对部署进行签名，并会执行一系列验证来允许或拒绝该场景。

### 访问 World

场景上传到 Worlds 服务器后，你可以使用 Decentraland Explorer 通过以下 URL 访问它： `decentraland://?realm=NAME.dcl.eth`，其中 `NAME` 应替换为你部署到的 Decentraland NAME 或 ENS 域。

在 Decentraland 已打开的情况下，你还可以通过输入 `/goto NAME.dcl.eth` 聊天框中的命令跳转到某个 world。

参见 [设为可发现](/creator/content-creator-zh/chang-jing-sdk7/fa-bu/make-discoverable.md) 了解更多关于如何让你的 World 可被发现的信息。

### 将 World 迁移到 Genesis City

如果你是 LAND 所有者，并希望将 World 场景部署到 Genesis City，你可以通过将场景重新部署到去中心化的 Catalyst 网络来实现，该网络是 Genesis City 的内容服务器。

需要记住的事项：

* 移除 `worldConfiguration` 部分来自 `scene.json`
* World 的大小限制（根据持有量动态变化）与 LAND 地块的限制不同（每个地块 15MB），因此请确保你的场景大小适合部署到 Genesis City！

## 从硬件钱包发布

与其把你的 LAND 代币存放在 Metamask 账户中，你可能会觉得将它们存放在硬件钱包设备里更安全，例如 [Ledger](https://www.ledger.com/) 或 [Trezor](https://trezor.io/)，它们是物理连接到你的电脑上的。

如果你使用这些设备之一，可以将硬件钱包连接到 Metamask，以便启用消息签名，同时更安全地保存代币。参见 [这篇来自 Metamask 的文章](https://metamask.zendesk.com/hc/en-us/articles/360020394612-How-to-connect-a-Trezor-or-Ledger-Hardware-Wallet) 了解连接账户的说明。

一旦你的硬件钱包可以通过 Metamask 使用，你就可以按照与代币存放在 Metamask 账户中相同的步骤进行部署。

## 场景覆盖

当一个新场景被部署时，它会覆盖它所占用地块上的旧内容。

如果一个占据多个地块的场景只被另一个场景部分覆盖，那么它的所有地块都会被覆盖或清除。

假设你将场景部署在 *一个* 两个地块上 *\[100, 100]* 和 *\[100, 101]*。然后你把地块 *\[100, 101]* 卖给一位拥有相邻土地并部署了一个大型场景（*B*）到多个地块的用户，其中包括 *\[100, 101]*.

你的场景 *一个* 无法只在一个地块中部分渲染，因此 *\[100, 100]* 不会显示任何内容。你必须创建场景 *一个* 的新版本，使其只占用一个地块，并仅部署到地块 *\[100, 100]*.

## 什么是内容服务器

内容服务器是一个由社区拥有的服务器网络，文件系统采用内容寻址方式，这意味着每个文件是通过其内容来识别的，而不是通过任意的文件名。

我们使用内容服务器以类似 BitTorrent 的方式托管和分发所有场景内容，从而保持 Decentraland 网络的分布式特性。

1. 内容服务器存储并分发渲染你场景所需的所有资源。
2. 该 `npm run deploy` 命令会将这些资源链接到你在 **scene.json** 文件中指定的 LAND 地块。每当你重新部署场景时，内容服务器都会更新记录，将这些地块指向最新内容。部署不涉及任何区块链交易，你只需使用钱包签署新的场景实体以证明所有权。

服务器每个副本上的信息都是可验证的，因为每个场景都由 LAND 所有者的哈希签名。这意味着，托管服务器副本的人无法篡改内容来显示非法内容。社区还可以通过 DAO 投票批准或移除这些服务器中的任何一个。

## 自定义服务器

你可以将内容部署到一个不属于官方 DAO 维护的 catalyst 服务器网络的自定义服务器上。为此，你无需拥有任何 LAND 或 NAME 代币，因为你可以将服务器配置为使用你偏好的任何验证逻辑，以控制谁可以在何处部署。自定义服务器可以选择包含官方服务器中的内容（你可以覆盖它），或者从空白状态开始，发布完全新的内容。

请参见 [catalyst-owner 仓库](https://github.com/decentraland/catalyst-owner) 了解更多关于你自己的服务器可以做什么以及如何设置它。

{% hint style="warning" %}
**📔 注意**：玩家需要手动输入一个 URL 才能访问你的自定义服务器。来自 [奖励服务器](/creator/content-creator-zh/jiang-li/getting-started.md) 之类服务的某些验证在这些情况下可能会失败，因为这些服务通常要求请求来自官方服务器。
{% endhint %}

玩家绝不会被自动引导到这个服务器，访问它的唯一方式是显式输入 URL 连接到它。

### 通过 CLI

要部署到自定义服务器，请运行：

`npm run deploy -- --target <CUSTOM SERVER DOMAIN>`

在你的自定义服务器上输入已部署场景的 URL 将取决于其托管所在的域。

## 验证部署是否成功

一旦你部署了场景，这些更改可能需要几分钟才能传播到网络中的各个内容服务器。如果你在部署后立刻进入 Decentraland，你可能会暂时仍然看到你内容的上一个版本。

如果使用 CLI 进行部署，签名 dapp 将开始显示确认信息，表示你内容的新版本已传播到网络中的所有服务器。

你会看到构成 Decentraland 内容网络的每台服务器列表。对于每台服务器，它会显示该地块上最后一次上传更改的时间戳。每台服务器对应一个不同的 realm。你可以在 [catalyst 监控界面](https://decentraland.github.io/catalyst-monitor/).

传播只是其中一部分：在上传后，场景的 3D 模型会被转换为针对各个平台（Windows 和 Mac）优化的资源包。在转换完成之前，系统会有意向玩家提供你场景最后一个可完整运行的版本。这通常只需几秒钟，但对于非常大的场景或服务器繁忙时可能会更久。你可以直接查询转换进度，见 [检查转换状态](/creator/content-creator-zh/chang-jing-bian-ji-qi/fa-bu/publish-scene.md#check-the-conversion-status).

你也可以随时在命令行控制台中运行以下命令来获取传播信息：

`npx @dcl/opscli pointer-consistency --pointer 0,0`

{% hint style="warning" %}
**📔 注意**：请使用你场景的坐标替换 `0,0`。如果你的场景有多个地块，其中任意一个地块都会产生相同的输出。如果坐标以负数开头，请在坐标开头加上 `\` ，以防止命令行将 `-` 字符误解析。
{% endhint %}

## 自动部署

如果你经常修改场景内容，并希望实现精简的发布流程，你可以通过 GitHub action 自动化部署你的场景。

为此，你必须先将场景存储在一个 GitHub 项目中。然后你可以设置一个 [GitHub action](https://docs.github.com/en/actions) ，使用以下脚本，每当合并到 `main` 分支时都会运行。该脚本会安装所有依赖、构建项目，然后将其部署到 Decentraland。

```yaml
name: 部署到 DCL PROD

on:
  push:
    branches:
      - main

env:
  DCL_PRIVATE_KEY: ${{ secrets.DCL_PRIVATE_KEY }}

jobs:
  deploy:
    name: 部署
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: 安装 npm 包
        run: |
          npm install
      - name: 构建场景
        run: |
          npm run build
      - name: 部署场景
        run: |
          npm run deploy
```

> 重要：要让此流程运行，你必须在 GitHub 中将某个钱包的私钥设置为环境变量，用于对部署进行签名。与往常一样，请务必小心保护私钥安全。切勿使用实际拥有土地代币的账户私钥，因为那会带来严重的安全风险。相反，应将操作员权限委派给一个不持有任何有价值代币的临时钱包。如果这个私钥泄露，你可以很容易地从该账户撤销这些操作员权限并设置一个新钱包。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.decentraland.org/creator/content-creator-zh/chang-jing-sdk7/fa-bu/publishing.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
