mcpField
C
create-scene

create-scene

github.com/decentraland开发4290 次安装今天更新
代码仓库

关于 create-scene

用于创建 Decentraland SDK7 场景的工作流技能,涵盖项目初始化、资产选择和场景配置,并说明如何区分复合场景实体与 TypeScript 逻辑。

主要功能

  1. 01引导创建 SDK7 场景
  2. 02使用 /init 初始化项目
  3. 03选择 3D 模型和声音
  4. 04在复合文件中定义初始实体
  5. 05配置场景元数据与地块

适用场景

  1. 01开始创建 Decentraland 场景
  2. 02添加已批准的模型和声音
  3. 03将静态实体与场景逻辑分开

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/decentraland/sdk-skills --skill create-scene

安装后在 Claude Code 中输入/create-scene确认已加载。

附带文件references/entity-validation-rules.md

详细介绍

创建新的 Decentraland SDK7 场景

运行时限制: Decentraland 在 QuickJS 沙盒中运行。不能使用 Node.js API(fs、http、path、process)。异步操作请使用 SDK 的 executeTask() + fetch()。详情请参阅 scene-runtime 技能。

重要 — 生成任何代码前请阅读: 所有初始场景实体(场景加载时存在的所有内容)都放在 assets/scene/main.composite 中,绝不能放在 src/index.ts 中。规则、决策表和原因请参阅“Composite 与 TypeScript — 实体应放在哪里”(步骤 4)。

当用户想要创建新场景时,请按以下步骤操作:

1. 询问用户想要构建什么

如果用户尚未描述场景,请询问:

  • 想要什么类型的场景?(画廊、游戏、社交空间、互动艺术等)
  • 有多少个地块?(默认:1 个地块 = 16x16 米)
  • 有什么特定功能?(3D 模型、交互、多用户、UI)

2. 使用 /init 搭建项目框架

始终先运行 /init。 该命令会使用官方的 @dcl/sdk-commands init 创建 scene.json、package.json、tsconfig.json 和 src/index.ts,并采用正确且最新的配置,同时自动安装依赖。

切勿手动创建 scene.json、package.json 或 tsconfig.json——SDK 模板可能会随版本变化,手写副本会逐渐过时。

jsx 和 jsxImportSource tsconfig 设置已由 /init 添加——请勿修改。

3. 查找匹配的 3D 资源

重要:只有当提示明确要求添加新模型时,才从以下免费目录获取模型。始终向用户确认是否希望在场景中添加新模型。

编写场景代码前,请检查资源目录,查找符合用户主题的免费模型:

  1. 搜索 {baseDir}/../add-3d-models/references/model-catalog.md(包含 8,800 多个模型及其描述、尺寸、动画和下载 URL)
  2. 阅读 {baseDir}/../audio-video/references/audio-catalog.md(50 种免费音频,包括音乐、环境音、音效、游戏机制音效等)
  3. 向用户推荐匹配的模型和音效
  4. 将选定的模型下载到场景的 assets/Models/ 目录:
    mkdir -p assets/Models
    curl -o assets/Models/arcade_machine.glb "https://models.dclregenesislabs.xyz/blobs/bafybei..."
    

重要:GltfContainer 仅适用于本地文件。模型 src 字段绝不能使用外部 URL。

重要:始终下载到 assets/Models/。切勿写入场景根目录。

现有文件夹优先。 如果场景已有 assets/scene/Models/(旧版布局),或 assets/asset-packs/(Creator Hub 资源包)/ assets/custom/(Creator Hub 自定义项目)下已有资源,请复用这些路径,而不是另建 assets/Models/。assets/Audio/、assets/Images/ 和 assets/Videos/ 也遵循同样的规则。

完成条件: 用户批准的每个模型都存在于 assets/Models/(或依据上述优先规则使用已有资源文件夹)中;每个文件都非空,且以 glTF 魔数开头(head -c 4 file.glb)——如果 curl 保存的是 HTML 错误页面,则不符合此检查;并且没有下载的文件位于项目根目录。如果用户拒绝添加新模型,则无需下载任何内容即可完成此步骤。

4. 自定义生成的文件

/init 完成后,根据用户的需求自定义生成的文件:

scene.json

更新 display 字段和地块:

  • display.title — 设置场景名称
  • display.description — 设置简短描述
  • tags — 根级数组,包含 1-3 个预定义类别(参见下方的 标签(场景类别))。始终设置此项,即使用户从未提及类别:根据场景的主题和用途推断(射击游戏场 → ["game"],艺术装置 → ["art"],舞蹈俱乐部 → ["music", "social"])。这些标签用于 Places dApp 中的发现;没有标签的场景在那里会被归为未分类
  • scene.parcels — 对于多地块场景,列出所有地块(例如,2x2 场景使用 ["0,0", "0,1", "1,0", "1,1"])
  • scene.base — 设置为西南角的地块
Composite 与 TypeScript——实体应放在哪里

绝不要在 TypeScript 中创建初始场景实体。它们必须放在 assets/scene/main.composite 中。 如果你发现自己正在用 engine.addEntity() 添加景物或静态道具,请停下来——改为将其放入 composite。

使用 .composite 的情况使用 .ts(index.ts)的情况
场景加载时存在的所有实体(模型、灯光、基础几何体、文本、音频)在运行时动态生成的实体(例如,弹丸、克隆体、按需出现的 NPC)
静态和装饰性对象数量或是否存在取决于运行时状态的实体
之后需要添加行为的实体(在代码中按名称或标签获取)在创作时无法确定其身份或结构的实体
Creator Hub 应能显示并通过可视化方式编辑的任何内容—

原因: Composite 资源加载更快,可在 Creator Hub 中通过可视化方式编辑,并能让 TypeScript 代码专注于逻辑,而不是构建场景。

assets/scene/main.composite

创建 assets/scene/main.composite,并在其中定义初始场景实体。完整格式请参见 {baseDir}/../composites/composite-reference.md。

正在编辑现有场景? 如果场景已在 Creator Hub 中打开,请通过 Creator Hub MCP(技能:creator-hub-mcp)进行修改——绝不要直接编辑文件,因为编辑器的自动保存会覆盖修改。只有在无法使用 MCP 时,才先阅读 composite 参考文档中的“编辑现有 composite(编辑模式)”部分。如果场景已在 Creator Hub 中打开,main.composite 中已经包含 inspector::* 组件;添加新实体时若未在 inspector::Nodes 中注册,这些实体仍会渲染在世界中,但不会显示在 Creator Hub 的实体树中,也无法选中。参考文档详细说明了准确的操作步骤。

最简示例——一个带名称的方块。各组件会在其 data 映射中共用实体 ID,因此实体 512 的所有数据都位于 "512" 键下:

{
	"version": 1,
	"components": [
		{
			"name": "core::Transform",
			"data": {
				"512": {
					"json": {
						"position": { "x": 8, "y": 1, "z": 8 },
						"scale": { "x": 1, "y": 1, "z": 1 },
						"rotation": { "x": 0, "y": 0, "z": 0, "w": 1 },
						"parent": 0
					}
				}
			}
		},
		{
			"name": "core::MeshRenderer",
			"data": { "512": { "json": { "mesh": { "$case": "box", "box": {} } } } }
		},
		{
			"name": "core-schema::Name",
			"data": { "512": { "json": { "value": "BlueCube" } } }
		}
	]
}

有关多实体场景、带碰撞掩码的 GLB 模型、标签以及完整的组件分组模式,请参见 {baseDir}/../composites/composite-reference.md。

IMPORTANT:放置地板实体时,务必将 y 位置设为 0.01 或更高,避免与默认地面发生 z-fighting。

  • 单地块场景的中心位于地面高度的 (8, 0, 8)。
  • Y 轴朝上;地面高度为 Y=0。地板和可行走表面应位于 Y ≥ 0,因为玩家无法下降到地面以下,但实体可以放置在负 Y 位置——将对象置于地下是隐藏对象的有效技巧。
src/index.ts

index.ts 仅用于:

  • 为 composite 实体添加行为和交互(按名称或标签获取实体)
  • 动态生成的实体(例如,敌人、弹丸、克隆体)
  • 系统、游戏逻辑、UI

若要为 composite 实体添加交互,请按名称或标签查找它——不要在代码中重新创建它:

import { engine, pointerEventsSystem, InputAction } from '@dcl/sdk/ecs'
import { EntityNames } from '../assets/scene/entity-names'

export function main() {
	// Fetch an entity defined in the composite — never re-create it here
	const cube = engine.getEntityOrNullByName(EntityNames.BlueCube)
	if (cube) {
		pointerEventsSystem.onPointerDown(
			{
				entity: cube,
				opts: { button: InputAction.IA_PRIMARY, hoverText: 'Click me' },
			},
			() => {
				console.log('Cube clicked!')
			}
		)
	}
}

若要按标签获取实体组(engine.getEntitiesByTag),或在运行时添加/移除标签,请参见 {baseDir}/../composites/composite-reference.md 中的“在代码中引用 Composite 实体”部分。

scene.json 参考

所有有效的 scene.json 字段:

字段必填说明
ecs7约定字段在 SDK7 场景中为 true。由 init 写入;构建过程只会验证 runtimeVersion,但请保留此字段以兼容工具
runtimeVersion是必须为 "7"
main是必须为 "bin/index.js"——编译后的输出路径
display.title建议填写在地图和 Places 中显示的场景名称
display.description建议填写用于帮助用户发现场景的简短描述
display.navmapThumbnail建议填写在地图弹窗和传送确认界面中显示的缩略图。格式为 .png/.jpg,推荐使用 16:9、1920x1080 px;正方形裁剪只会显示中央 1080x1080 区域,因此请将重要内容放在该区域内——规格和截图流程请参阅 deploy-scene 技能
tags建议填写根级 string[]。场景在 Places dApp 中的类别。最多 3 个,须从预定义列表中选择(见下文)
scene.parcels是"x,y" 坐标字符串数组
scene.base是原点地块(通常为西南角)
spawnPoints可选玩家进入时出现的位置(见下文)
requiredPermissions可选权限数组(例如 "ALLOW_MEDIA_HOSTNAMES")
allowedMediaHostnames可选外部媒体的允许名单域名
featureToggles可选启用/禁用 SDK 功能
worldConfiguration可选用于 Worlds 部署(参阅 deploy-worlds 技能)
landscapeTerrain可选布尔值,默认值为 true。根级字段。仅适用于 Worlds(单场景 Worlds;在 Genesis City 中会被忽略)。设为 false 可禁用场景周围自动生成的草地/树木/海洋景观——适用于开放水域/太空场景,也可释放渲染预算。本地预览中同样适用。在 Creator Hub 中,此项是 Scene Inspector 设置中的开关(也是预览菜单选项);场景级别的 false 会覆盖预览偏好设置。
标签(场景类别)

根级别的 tags 数组用于存放场景的类别。Places dApp 会用这些类别对地点进行分组,方便玩家按兴趣浏览——未添加标签的场景不会出现在任何类别中。

规则:

  • 每个场景最多 3 个类别。
  • 值必须来自以下预定义列表——任意字符串都不属于类别:

"art"、"game"、"casino"、"social"、"music"、"fashion"、"crypto"、"education"、"shop"、"business"、"sports"、"parkour"

"tags": ["game", "casino"]
必需权限

场景使用以下功能时,请将对应权限添加到 requiredPermissions:

运行时可识别的权限字符串正好有 7 个(协议枚举名称会去掉 PI_ 前缀):

权限需要时机
ALLOW_TO_MOVE_PLAYER_INSIDE_SCENEmovePlayerTo(在场景内移动玩家)
ALLOW_TO_TRIGGER_AVATAR_EMOTEtriggerEmote 和 triggerSceneEmote
ALLOW_MEDIA_HOSTNAMES [LEGACY]外部视频/音频流——不需要(见下文)
USE_WEB3_API区块链交互
USE_FETCHHTTP 请求(fetch/signedFetch)
USE_WEBSOCKETWebSocket 连接
OPEN_EXTERNAL_LINKopenExternalUrl(在浏览器中打开 URL)

基于实际情况的注意事项(来自引擎测试场景): 权限执行并不一致,因此应根据_意图_声明正确的权限,而不要依赖权限来阻止操作。80,-4-restricted-actions 场景只声明了 ALLOW_TO_MOVE_PLAYER_INSIDE_SCENE + ALLOW_TO_TRIGGER_AVATAR_EMOTE,但仍可在没有 OPEN_EXTERNAL_LINK 的情况下成功运行 openExternalUrl、openNftDialog、teleportTo 和 changeRealm。66,6-signed-fetch 场景在 requiredPermissions 为空时调用了 signedFetch。引擎团队始终会声明权限的只有 movePlayerTo 和表情功能。teleportTo(跳转到其他 Genesis City 坐标)不需要权限——较新的 teleportTo({ realm }) 形式也一样;它取代了 [DEPRECATED] changeRealm(见 scene-runtime),这两个功能都没有专属权限。

[LEGACY] ALLOW_MEDIA_HOSTNAMES 和 allowedMediaHostnames 都不是必需的——新场景请勿添加。@dcl/schemas 中仍保留此权限字符串,但当前没有任何客户端会执行该权限:unity-explorer 将主机名检查置于 CHECK_ALLOWED_MEDIA_HOSTNAMES 编译定义之后,而任何构建配置都未设置该定义(SceneData.TryGetMediaUrl 会直接进行普通 URL 语法检查);bevy-explorer 则完全没有相关执行逻辑。只有已停用的 Web 客户端会执行该权限。当前客户端无需此权限即可播放外部媒体。如果旧场景仍声明了该权限,请按以下方式将域名加入白名单:

"requiredPermissions": ["ALLOW_MEDIA_HOSTNAMES"],
"allowedMediaHostnames": ["youtube.com", "www.youtube.com", "player.vimeo.com", "twitch.tv"]
功能开关
"featureToggles": {
  "voiceChat": "enabled",
  "portableExperiences": "enabled"
}

有效值:"enabled"、"disabled"。对于 portableExperiences,还可使用 "hideUi"。

出生点

配置玩家进入场景的位置和方式:

{
	"spawnPoints": [
		{
			"name": "spawn1",
			"default": true,
			"position": { "x": [1, 5], "y": [0, 0], "z": [2, 4] },
			"cameraTarget": { "x": 8, "y": 1, "z": 8 }
		}
	]
}
  • 位置范围(例如 [1, 5])会让玩家在该范围内随机出生
  • cameraTarget 会设置玩家出生时的摄像机朝向——将其指向场景的焦点区域
  • 固定出生点:在所有三个轴上都使用单个数值(例如 "position": { "x": 8, "y": 0, "z": 8 })
  • position 是一个完整对象联合类型(@dcl/schemas 的 SinglePosition | MultiPosition):三个轴要么全是数字,要么全是 [min, max] 数组。像 "x": [1, 5], "y": 0 这样的混合写法会在构建时验证失败,且错误信息不会说明原因。
多地块布局
布局Parcels 数组使用场景
单地块["0,0"]小型游戏、画廊、单房间体验
条形["0,0", "1,0", "2,0"]走廊、赛车赛道、线性旅程
L 形["0,0", "1,0", "0,1"]转角建筑、拆分式体验
2x2 正方形["0,0", "1,0", "0,1", "1,1"]开放广场、竞技场、中型游戏
3x3 正方形从 "0,0" 到 "2,2" 的 9 个地块大型游戏、多房间建筑

基准地块: 始终将 scene.base 设置为西南角(x、y 最小)的地块。

边界: 每个地块为 16m x 16m;2x2 场景占据 32m x 32m。所有场景的高度上限均为 330 米,与地块数量无关。⚠️ 放置在约 200 m 以上的内容可能会出现多人同步问题,请将与游戏玩法相关的内容放在此高度以下。

  • 始终根据地块边界验证实体位置。 默认基准地块位于左下角,有效范围为 0 ≤ x ≤ 16*parcelsWide 和 0 ≤ z ≤ 16*parcelsDeep。任何 X 或 Z 坐标为负数的位置都在场景之外。 完全位于边界外的实体不会渲染,也不会显示错误;跨越边界的模型仍会渲染位于边界内的部分。边界检查使用世界坐标,因此父级移出边界后,其子级也会随之消失;超出高度上限的实体同样会被隐藏。只有列出每个地块时,多地块场景才是矩形;L 形地块集合中的“空缺”区域位于边界外。(参见示例场景 5,90-scene-bounds-check。)

更改现有场景中的地块: 修改 scene.parcels 会移动整个场景的坐标边界——靠近当前边界的实体可能会在修改后落到边界之外(不可见)。编辑此字段前,请先说明拟议的更改,并与用户确认。参见 sdk-scenes 技能中的“Agent 行为指南”部分({baseDir}/../sdk-scenes/SKILL.md)。

完成条件: (1) main.composite 可解析为 JSON,且任何组件的 data 映射中出现的每个实体 ID 都有 core::Transform 和 core-schema::Name 条目;(2) 每个组合位置都位于地块边界内(0 ≤ x ≤ 16·width、0 ≤ z ≤ 16·depth)——完全放在边界外的实体会被静默隐藏,跨越边界的模型只会渲染位于边界内的部分;(3) src/index.ts 中不包含用于加载时场景布置的 engine.addEntity()——搜索 engine.addEntity,并确认每个匹配项都是运行时生成;(4) scene.json 包含 "runtimeVersion": "7",且 scene.base 是 scene.parcels 的成员;(5) npm run build 以状态码 0 退出。

5. 创建后的步骤

自定义文件后:

  1. 使用 preview 工具启动预览服务器(或手动运行 npx @dcl/sdk-commands start --bevy-web)
  2. 场景将在浏览器中打开,地址为 http://localhost:8000
预览 CLI 标志
标志类型描述
--web(别名 --bevy-web)布尔值在 Bevy Web 浏览器客户端 decentraland.org/bevy-web/ 中打开预览,而不是在 Desktop Explorer 中打开。Chromium 142+ 要求授予本地网络访问权限,以便页面访问 localhost 预览服务——当浏览器询问是否允许访问设备上的应用时,点击“允许”。
--mcp布尔值在 Explorer 中启用 MCP 服务(作为深层链接参数传递)
--mcp-port数字Explorer 中 MCP 服务的端口
--multi-instance布尔值允许同时运行多个 Explorer 实例
--no-client布尔值禁止自动启动(桌面深层链接、浏览器、移动端 QR);如果桌面 Explorer 自行连接,文件监视器仍会向其发送通知
--asset-bundles布尔值在 Desktop Explorer 中本地将场景的 3D 模型转换为优化的资源包,使转换后的渲染效果与生产环境一致。大型场景首次运行可能需要几分钟;转换后的模型会缓存。作为 local-ab=true 传入深层链接——--local-ab 是深层链接参数,不是 CLI 标志。请参阅 optimize-scene(“本地资源包预览”)。
-- <args>透传独立的 -- 后面的参数会原样作为查询参数传入 Explorer 深层链接(--key=value、--key value、单独的 --key = true)

--web-explorer 已移除。--web3 和 --no-debug(别名 -d)已弃用且不执行任何操作,仅为向后兼容而保留——请勿在新场景中使用。

Creator Hub 播放设置(与上述 CLI 标志等效)。编辑器标题栏中的分栏按钮标为 Play(播放图标 + “Play”);其下拉箭头会打开 Play Options 弹出面板。以下是 creator-hub 8830cf6f 版本中的确切字符串:

弹出面板列出两个客户端选项,可通过单选按钮选择:

  • Desktop Client(默认)——Unity Desktop Explorer。将鼠标悬停在此行上会打开侧边弹出菜单,其中包含以下仅适用于桌面端的切换项。
  • Web (Bevy) ——Bevy Web 客户端;等效于 --web。没有自己的切换项。

Desktop Client 侧边弹出菜单中的切换项:

  • 启用地形景观:显示周围的景观。如果场景自身设置了 landscapeTerrain: false 来隐藏景观,则此选项会被禁用(并强制关闭)。
  • 多实例预览:等同于 --multi-instance。允许第二个 Explorer 窗口与第一个窗口同时运行。仅当项目使用 @dcl/sdk 7.20.4 或更高版本时显示。
  • 启用 MCP 服务:启动时开启 MCP 自动化服务,等同于 --mcp。仅当项目使用 @dcl/sdk 7.25.0 或更高版本时显示。请参阅 unity-explorer-mcp 技能。
  • 压缩资源:预览时按生产环境中的方式压缩资源,等同于 --asset-bundles。首次运行可能较慢;结果会缓存。Linux 上会隐藏此选项(该平台没有随附 Unity 桌面客户端),使用早于此标志版本的 @dcl/sdk-commands 的场景也会隐藏此选项。

分隔线下方的 显示移动端二维码 是一个按钮(不是复选框),点击后会打开移动端预览二维码。

⚠️ “打开调试控制台”复选框已移除(creator-hub 8830cf6f)——调试控制台现在默认开启,现有安装也曾进行过一次性升级以将其开启。请勿告知用户勾选此项。跳过身份验证界面也不再显示在弹出菜单中;此选项会保持开启,除非 --multi-instance 强制要求每个窗口单独登录。

Creator Hub 中的 Bevy 渲染器:“设置” > “场景渲染器”下拉菜单——“Babylon(默认)” / “Bevy(实验性)”(在 creator-hub b3dfea1b 中从“Bevy(预览版)”重新命名);开关名称为 “启用 Bevy 场景渲染器”。该选项位于设置 > 实验性中;截至 Creator Hub 0.50.0,此页面仅包含这一开关——AI 助手已移至独立的“设置 > AI”选项卡,UI 编辑器也已成为稳定功能,不再需要任何设置。Bevy 编辑器支持 gizmo、多选、自由飞行摄像机、生成点可视化、拖放资源、动画片段下拉菜单、锁定/隐藏实体、截图和热重载。自 9ef6501a 起,它还会加载自定义物品,并在视口中显示悬停提示(实体的 PointerEvents hoverText,例如“按 E”)。

推荐使用 Bevy 编辑器前,需要了解以下限制:

  • “指标”选项卡不可用(“场景指标仅适用于 Babylon 渲染器”)。运行场景预览以查看指标。
  • editor_screenshot(Creator Hub MCP)在 Bevy 下会报错。
  • 打开 UI 编辑器的 2D 模式会冻结场景(参见 build-ui)。

及时更新项目根目录中的 .dclignore。 此文件列出了部署时不会上传的文件和扩展名。只要项目包含工作文件——Blender/FBX 源文件、草稿模型、概念图、电子表格、Markdown 笔记——就应主动将其(或其扩展名)添加到 .dclignore,确保部署后的场景保持精简。请参阅 deploy-scene 技能中的 .dclignore 部分。

完成标准: 预览服务可在 http://localhost:8000 响应,且场景渲染时控制台中没有错误。

使用 AI 进行 Vibe 编码

AI 助手(Cursor、Claude Code 等)可以根据自然语言提示词构建完整场景。请先安装 Decentraland SDK skills,让 AI 了解 SDK 的常用模式:

npx skills add decentraland/sdk-skills --all

要更新现有 skills 并下载上次安装后新增的 skills,请重新运行同一条命令。不要使用 npx skills update——它只会刷新磁盘上已有的 skills,并且会静默跳过新增的 skills。

Creator Hub 还内置了 AI 助手(Settings > AI > Enable AI Assistant),它会调用用户自己安装的 claude、codex、cursor-agent 或 gemini CLI,并预加载这些 skills、预先配置编辑器的 MCP 服务,因此可以直接在打开的场景中实时编辑实体。该功能已退出 Experimental,并且从 Creator Hub 0.50.0 起默认启用;四种提供方都可以使用场景工具。也可以在 Settings > AI > Expose AI assistant MCP server 中,将同一 MCP 服务开放给外部工具(Claude Code、Cursor、Codex、Claude Desktop)。详见 creator-hub-mcp skill。

官方快速入门教程采用以 Script 组件为先的工作流:在 Creator Hub 中为实体附加 Script 组件,编写一个包含 constructor(src, entity)、start() 和 update(dt) 的类,并使用 this.entity 引用其所属实体。这样可以让行为保持独立,并能在不同实体之间重复使用。详情请参阅 script-components skill。

交叉参考

  • 准备好部署了吗?请参阅 deploy-scene skill(Genesis City)或 deploy-worlds skill(个人 Worlds)。要发布到 World?World 的名称、描述和缩略图与 scene.json 中的内容相互独立——在单场景 World 中,每次发布都会用场景中的内容覆盖 World 的对应内容;请参阅 deploy-worlds > “World 元数据与场景元数据”。请至少在现场活动开始前一小时发布——资产包转换本身通常只需几秒,但预留时间可以应对意外情况
  • 需要针对地块限制进行优化吗?请参阅 optimize-scene skill。启用 Compress Assets(Play Options > Desktop Client)或使用 --asset-bundles,在发布前通过生产质量的资产包进行预览
  • 目标平台是移动设备?这些限制会在编写代码之前影响场景架构,而不是之后:
    • 一组额外的固定场景限制,不会随地块数量变化(8 个光源、8 个 VFX 发射器、25,000 个活动粒子)——参阅 optimize-scene > 移动场景限制。可在 Creator Hub 中通过 Preview > Show QR Code for Mobile 查看,无需构建设备版本
    • TweenSequence 在移动设备上完全不会播放动画——因此不要使用它来制作移动平台或巡逻路径;应通过系统驱动多段运动(animations-tweens)
    • 在移动设备上,Draco 压缩的 GLB 会静默加载失败,除非场景已包含优化后的资产;但预览不会包含这类资产——导出时不要使用 Draco(add-3d-models)
    • 除此之外,还有移动、碰撞和表情动作方面的差异:参阅 advanced-input > 移动设备注意事项、player-physics(每个碰撞体至少要有 1 cm 厚;不可见的阻挡体可能完全无法阻挡)
  • 正在规划游戏?请参阅 game-design skill,了解设计模式和性能预算
  • 验证实体组件组合:请参阅 {baseDir}/references/entity-validation-rules.md,了解组件之间的依赖关系、互斥关系和常见错误配置

示例场景

展示 scene.json 配置的引擎团队测试场景:

评论

支持 Markdown