Appearance
场景捆绑包 ZIP 格式
用于导入导出场景及其引用的场景资源文件。
ZIP 结构
text
scene_bundle.zip
├─ scene.json # 场景元数据与定义
└─ assets/
├─ scene_asset_xxx/ # 每个场景资源一个子目录
│ ├─ asset.json # 资源元数据
│ └─ files/ # 资源原始文件
│ ├─ model3.json
│ ├─ textures/
│ │ ├─ tex_00.png
│ │ └─ tex_01.png
│ └─ motions/
│ └─ idle.motion3.json
└─ scene_asset_yyy/
├─ asset.json
└─ files/
└─ bg.webpscene.json
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
version | number | 是 | 固定为 1 |
id | string | 是 | 场景 UUID(用于导入冲突检测) |
name | string | 是 | 场景名称 |
definition | object | 是 | 场景定义对象,结构与场景编辑器中一致。包含 nodes / animationGroups / rules 等字段。 |
asset.json
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
version | number | 是 | 固定为 1 |
id | string | 是 | 资源 UUID |
displayName | string | 是 | 资源显示名 |
kind | string | 是 | 资源类型:cubism / spine / image / image_variant / video / audio |
entryPath | string | 是 | 入口文件在 files/ 下的相对路径,如 model3.json |
metadata | object | 否 | 资源元数据(动画列表、表情列表、差分定义、状态/动作预设等) |
导入行为
- 导入时按 UUID 检测冲突:若本地已存在同 UUID 的场景或场景资源,弹出确认对话框让用户选择覆盖或导入为副本。
- 导入为副本时会生成新的 UUID,并用 ID 映射表替换
scene.json中的assetId引用。 definition中所有assetId引用会在导入时自动重新映射。- 导入后需要手动挂载到人格或群聊才能使用。
最小示例
json
// scene.json
{
"version": 1,
"id": "scene_abc123",
"name": "咖啡店背景",
"definition": {
"version": 1,
"nodes": [
{
"id": "scene_camera",
"kind": "camera",
"assetId": "",
"x": 0,
"y": 0
},
{
"id": "node_bg",
"kind": "image",
"assetId": "scene_asset_bg01",
"x": 0.5,
"y": 0.5,
"scaleX": 1,
"scaleY": 1,
"fit": "cover"
}
],
"animationGroups": [],
"rules": []
}
}json
// asset.json (assets/scene_asset_bg01/asset.json)
{
"version": 1,
"id": "scene_asset_bg01",
"displayName": "咖啡店背景图",
"kind": "image",
"entryPath": "bg.webp",
"metadata": {}
}AI 生成约束
scene.json中的definition对应SceneDefinition对象,必须包含nodes节点数组。- 每个节点的
kind必须是合法值:cubism/spine/image/image_variant/video/audio/slot/camera。 camera节点 ID 固定为scene_camera,且每个场景只能有一个。- 非
camera/slot节点必须有assetId且不为空。 - 如果 ZIP 中不包含某
assetId对应的资源,导入时该节点会标记为资源缺失。 - ZIP 内所有路径使用
/分隔。
常见错误
definition.nodes为[]→ 场景有效但渲染结果为空- 节点引用的
assetId在 ZIP 中没有对应资源 → 导入成功但节点资源缺失 asset.json中kind写成了中文如"图片"→ 必须使用英文枚举值entryPath指向的文件在files/下不存在 → 资源导入后入口文件缺失