> 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/mian-xiang-yi-dong-duan-gou-jian/yi-dong-ke-hu-duan/overview.md) 和 [在移动端预览](/creator/content-creator-zh/mian-xiang-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* 图片，16:9 比例，推荐尺寸为 *1920x1080* 像素。请将任何关键内容保留在中心 *1080x1080* 方形区域内，因为平台的某些部分会显示其方形裁切。参见 [场景缩略图](/creator/content-creator-zh/chang-jing-sdk7/xiang-mu-lei-xing/scene-metadata.md#scene-thumbnail).
* **地块**：你的场景将占用的地块坐标
* **基点**：将被视为场景 \[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 中的 Scene Editor 提供了一种轻松发布场景的方法。请确保你已经 [安装了 Creator Hub](/creator/content-creator-zh/chang-jing-bian-ji-qi/ru-men/editor-installation.md).

1. 打开你的场景项目。
2. 点击 **发布** 按钮在右上角。
3. 系统会提示你是否要发布到 **WORLD** 或 **LAND**.
   * 选择 **PUBLISH TO WORLD** ，将你的场景发布到你的某个 [WORLDs](/creator/content-creator-zh/chang-jing-sdk7/fa-bu/publishing-options.md#decentraland-worlds)中。然后选择要发布到哪个 NAME 或 ENS 域名。
   * 选择 **PUBLISH TO 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\&token=8790912e-6224-459d-94da-4d3d86816f2e)

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

你需要指定部署将要基于哪个 **name** 进行。请在你的 `scene.json`:

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

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

请记住以下几点：

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

### 世界元数据

World 拥有自己独立的名称、描述和缩略图，与发布到其中的场景元数据分开。当你发布到一个空的 World，或一个只包含单个场景的 World 时，该 World 的元数据会在每次发布时更新为该场景的元数据。如果 World 包含多个场景，其元数据是独立的：发布场景不会更改它，而且它只能在 Creator Hub 的 **管理** 部分中编辑。参见 [World 元数据与场景元数据](/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。

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

* 该 **管理** Creator Hub 的 **查看详情** 部分。点击
* 该 **Worlds** 选项卡中，位于 [Builder](https://decentraland.org/builder/worlds).

以查看你的 MANA、LAND 和 NAME 持有量如何合计。如果你超出预算（例如在出售或转移资产后），你有 48 小时来释放空间或增加预算，否则你的 World 将无法访问。参见 [Worlds 大小限制](/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. 选择 **PUBLISH TO 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 Actions 自动部署你的场景。

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

```yaml
name: Deploy to DCL PROD

on:
  push:
    branches:
      - main

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

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install npm packages
        run: |
          npm install
      - name: Build scene
        run: |
          npm run build
      - name: Deploy scene
        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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
