375 lines
8.5 KiB
Markdown
375 lines
8.5 KiB
Markdown
# MetaCore 打包与交付运行时工作流设计
|
||
|
||
生成时间:2026-03-28
|
||
状态:草案
|
||
范围:M4 UI、持久化与打包循环
|
||
|
||
## 目的
|
||
|
||
这份文档用于明确 MetaCore 第一阶段的打包、Cook、运行时交付工作流应该如何设计。
|
||
|
||
目标不是只做到“Player 能单独启动”,而是建立一条真正可交付的链路:
|
||
|
||
- 项目内容如何变成运行时可消费数据
|
||
- 场景、资源、UI、运行时配置如何被带出
|
||
- 打包后客户端如何在独立环境运行
|
||
- 哪些文件属于开发期,哪些属于交付期
|
||
|
||
## 结论先说
|
||
|
||
MetaCore 第一阶段应明确采用下面这条交付链:
|
||
|
||
```text
|
||
项目内容
|
||
-> 资源与场景保存
|
||
-> Cook
|
||
-> 生成运行时所需输出
|
||
-> 打包 Player + 项目内容
|
||
-> 交付 Windows 独立客户端
|
||
```
|
||
|
||
这里必须把两件事分清楚:
|
||
|
||
1. **Editor 项目工作目录**
|
||
2. **交付运行时目录**
|
||
|
||
第一阶段不能再让 `Player` 长期依赖开发期目录的偶然结构或临时 fallback 才能运行。
|
||
|
||
## 当前代码基础
|
||
|
||
当前仓库里已经有较好的基础:
|
||
|
||
- `MetaCore.project.json`
|
||
- Scene 二进制 package 方向
|
||
- Package 服务
|
||
- Cook 服务
|
||
- `CookManifest`
|
||
- Player 能读取项目和启动场景
|
||
- RuntimeData 已有独立二进制文档和项目级 runtime 配置
|
||
|
||
这说明第一阶段不是没有打包基础,而是还缺一套清晰的“交付工作流定义”。
|
||
|
||
当前最需要解决的是:
|
||
|
||
- 什么内容属于交付包
|
||
- Cook 输出和源包之间的关系
|
||
- Player 在交付态下应该从哪里加载内容
|
||
- clean machine 验证应如何定义
|
||
|
||
## 第一阶段设计目标
|
||
|
||
第一阶段打包与交付工作流要满足:
|
||
|
||
- 开发者能从一个项目构建出独立 Windows 客户端
|
||
- 客户端不依赖 Editor 才能运行
|
||
- 启动场景正确加载
|
||
- 场景依赖资源正确带出
|
||
- UI 资源可带出
|
||
- Runtime 配置可带出
|
||
- clean machine 上可运行
|
||
|
||
## 第一阶段角色划分
|
||
|
||
### 1. 项目工作目录
|
||
|
||
这是开发期使用的目录,包含:
|
||
|
||
- `Assets`
|
||
- `Scenes`
|
||
- `Runtime`
|
||
- `Library`
|
||
- `MetaCore.project.json`
|
||
|
||
这部分是创作环境,不是最终交付目录。
|
||
|
||
### 2. Cook 输出目录
|
||
|
||
这是中间产物目录,用于:
|
||
|
||
- 存放 cooked 资源
|
||
- 存放 cooked scene
|
||
- 存放依赖清单
|
||
|
||
第一阶段建议继续使用:
|
||
|
||
- `Library/Cooked/Windows`
|
||
|
||
### 3. 打包输出目录
|
||
|
||
这是最终交付目录。
|
||
|
||
第一阶段建议显式区分出来,例如:
|
||
|
||
- `Build/Windows/<ProjectName>`
|
||
|
||
里面应包含:
|
||
|
||
- `MetaCorePlayer.exe`
|
||
- 运行时内容目录
|
||
- 项目 runtime 描述
|
||
- 必需依赖文件
|
||
|
||
## 第一阶段推荐交付目录结构
|
||
|
||
建议第一阶段打包后输出结构类似:
|
||
|
||
```text
|
||
Build/Windows/<ProjectName>/
|
||
MetaCorePlayer.exe
|
||
Content/
|
||
Scenes/
|
||
Assets/
|
||
UI/
|
||
Runtime/
|
||
Project/
|
||
MetaCore.runtimeproject
|
||
```
|
||
|
||
第一阶段名称可以调整,但结构职责必须清晰。
|
||
|
||
## 第一阶段必须打包的内容
|
||
|
||
### 1. 启动场景
|
||
|
||
必须带出项目定义的 `startup_scene` 对应的 cooked scene。
|
||
|
||
### 2. 场景依赖资源
|
||
|
||
至少要带出:
|
||
|
||
- Mesh 资源
|
||
- Material 资源
|
||
- Texture 资源
|
||
- Prefab 资源
|
||
- Scene 引用的 UI 资源
|
||
|
||
### 3. 运行时配置
|
||
|
||
如果项目使用 RuntimeData 或其他运行时配置,则应带出:
|
||
|
||
- `ProjectRuntime.mcruntimecfg`
|
||
- `DataSources.mcruntime`
|
||
- `Bindings.mcruntime`
|
||
- 后续 UI runtime 配置
|
||
|
||
### 4. 项目运行时描述
|
||
|
||
建议打包时生成一个“运行时项目描述”,用于告诉 `Player`:
|
||
|
||
- 启动场景在哪里
|
||
- 内容根目录在哪里
|
||
- runtime 配置在哪里
|
||
- UI 资源在哪里
|
||
|
||
这和开发期的 `MetaCore.project.json` 不必完全相同。
|
||
|
||
## 项目描述与运行时描述分离建议
|
||
|
||
这是第一阶段很关键的一个设计点。
|
||
|
||
### 开发期项目描述
|
||
|
||
例如:
|
||
|
||
- `MetaCore.project.json`
|
||
|
||
它更适合:
|
||
|
||
- 可读
|
||
- 面向编辑器
|
||
- 面向开发期目录
|
||
|
||
### 运行时项目描述
|
||
|
||
建议打包时生成一个更面向交付的二进制或轻量配置文件,例如:
|
||
|
||
- `MetaCore.runtimeproject`
|
||
|
||
它更适合:
|
||
|
||
- 面向 Player
|
||
- 面向 cooked/packaged 内容
|
||
- 不依赖开发目录结构
|
||
|
||
第一阶段不一定要把这层做得很复杂,但“开发期描述”和“交付期描述”最好现在就区分。
|
||
|
||
## Cook 的职责
|
||
|
||
第一阶段 Cook 应明确负责:
|
||
|
||
- 把源 package 复制或转换为运行时可消费输出
|
||
- 建立 `CookManifest`
|
||
- 确定资源 GUID 与 cooked 路径关系
|
||
- 为打包阶段提供可收集依赖的基础
|
||
|
||
### Cook 不是最终打包
|
||
|
||
这两层要分开:
|
||
|
||
- Cook:生成内容
|
||
- Package/Build:组织交付目录、复制 Player、拼装最终产物
|
||
|
||
## 打包流程建议
|
||
|
||
第一阶段推荐下面这条顺序:
|
||
|
||
1. 解析项目描述
|
||
2. 确定启动场景
|
||
3. Cook 启动场景
|
||
4. 递归收集依赖资源并 Cook
|
||
5. Cook UI 资源
|
||
6. 收集 Runtime 配置
|
||
7. 生成运行时项目描述
|
||
8. 复制 `MetaCorePlayer.exe`
|
||
9. 组装交付目录
|
||
10. 运行最小验证
|
||
|
||
## 第一阶段 Player 行为建议
|
||
|
||
打包后的 `Player` 不应默认去猜开发期路径。
|
||
|
||
建议优先行为:
|
||
|
||
- 读取与自身同目录或指定参数下的运行时项目描述
|
||
- 根据运行时项目描述找到:
|
||
- 启动场景
|
||
- 内容根目录
|
||
- Runtime 配置
|
||
- UI 资源
|
||
|
||
### 仅在开发态允许 fallback
|
||
|
||
例如:
|
||
|
||
- 直接运行仓库里的 `TestProject`
|
||
- 自动猜测 `MetaCore.project.json`
|
||
|
||
这类行为可以保留给开发便利,但不应成为交付态主路径。
|
||
|
||
## 场景与资源的打包策略
|
||
|
||
第一阶段建议:
|
||
|
||
- Scene 以 cooked scene 文件形式带出
|
||
- 资源以 cooked asset 文件形式带出
|
||
- Scene 中只保存 GUID/引用关系
|
||
- Player 运行时通过 runtime 内容索引解析资源
|
||
|
||
不要让交付态仍然需要访问源文件或编辑器期 package 路径推断逻辑。
|
||
|
||
## UI 的打包策略
|
||
|
||
如果第一阶段引入正式 UI 资源工作流,则打包时应同样带出:
|
||
|
||
- UI 文档
|
||
- UI 引用图片资源
|
||
- 必要字体资源
|
||
|
||
Scene 或运行时项目描述应能定位到这些 UI 内容。
|
||
|
||
## RuntimeData 的打包策略
|
||
|
||
RuntimeData 在第一阶段不再是主线,但如果项目启用它,打包时必须作为正式交付内容处理:
|
||
|
||
- runtime project 配置
|
||
- source / binding 配置
|
||
- 必要的 replay 文件或外部连接参数
|
||
|
||
注意:
|
||
|
||
- 开发态的调试 fallback 不应进入正式交付流程
|
||
|
||
## clean machine 验证
|
||
|
||
这是第一阶段打包能力是否成立的真正验收标准。
|
||
|
||
### 验证目标
|
||
|
||
在没有源码、没有编辑器、没有开发期目录结构假设的机器上,最终产物应能:
|
||
|
||
- 启动
|
||
- 读取运行时项目描述
|
||
- 加载启动场景
|
||
- 正确加载资源
|
||
- 正确显示 UI
|
||
- 如果配置了 RuntimeData,则能正确加载相关配置
|
||
|
||
### 最低验证方式
|
||
|
||
第一阶段至少要有一条明确流程:
|
||
|
||
- 将打包目录复制到 clean machine 或近似隔离环境
|
||
- 启动 `MetaCorePlayer.exe`
|
||
- 验证项目主界面和主场景
|
||
|
||
## 错误与诊断
|
||
|
||
交付态必须能对这些问题给出明确提示:
|
||
|
||
- 启动场景缺失
|
||
- cooked 资源缺失
|
||
- UI 文档缺失
|
||
- runtime 配置缺失
|
||
- 运行时项目描述损坏
|
||
|
||
错误不应只表现为黑屏或静默失败。
|
||
|
||
第一阶段至少应做到:
|
||
|
||
- 日志输出
|
||
- 控制台/日志文件
|
||
- 基础错误分类
|
||
|
||
## 推荐实现顺序
|
||
|
||
建议按下面顺序推进:
|
||
|
||
1. 固定运行时项目描述结构
|
||
2. 固定交付目录结构
|
||
3. 打通 Scene 与资源依赖收集
|
||
4. 打通 UI 资源带出
|
||
5. 打通 Runtime 配置带出
|
||
6. 复制 Player 和组装交付目录
|
||
7. 做 clean machine 验证
|
||
8. 再补增量构建与更细的诊断
|
||
|
||
## 第一阶段 Definition of Done
|
||
|
||
下面这些成立时,才能认为第一阶段打包与交付工作流真正成立:
|
||
|
||
- 从项目可以生成独立 Windows 输出目录
|
||
- 输出目录包含 Player 和项目必需内容
|
||
- Player 不依赖 Editor 即可运行
|
||
- 启动场景能正确加载
|
||
- 资源和 UI 能正确显示
|
||
- Runtime 配置能正确读取
|
||
- clean machine 验证通过
|
||
|
||
## 与整体路线的关系
|
||
|
||
这份文档对应第一阶段中的:
|
||
|
||
- `M4 UI、持久化与打包循环`
|
||
|
||
它的位置必须在:
|
||
|
||
- 项目系统
|
||
- 资源导入
|
||
- 场景编辑
|
||
- 材质与光照
|
||
- UI 资源工作流
|
||
|
||
之后。
|
||
|
||
只有这些内容工作流成立后,打包才有意义。
|
||
|
||
## 最终建议
|
||
|
||
第一阶段不要把“能运行 Player”误认为“完成打包”。
|
||
|
||
真正的打包与交付能力,应当是:
|
||
|
||
**能把一个项目稳定转换成独立运行的 Windows 客户端,并在脱离编辑器和源码环境后仍能正确加载场景、资源、UI 和运行时配置。**
|
||
|
||
这一步做实之后,MetaCore 才算真正具备了“项目可交付”的引擎特征。
|