29 · MOD、UGC 与可扩展性
29 · MOD、UGC 与可扩展性
MOD 支持是乘法级的生命周期延长,也是乘法级的维护负担。 关键不是"支不支持",而是支持到哪一层。
1. 先决策:支持到哪一层
| 层级 | 内容 | 玩家门槛 | 你的成本 | 风险 |
|---|---|---|---|---|
| L0 不支持 | — | — | 零 | 无 |
| L1 数据 MOD | 改数值/配置/贴图/文本 | 极低 | 低 ✅ | 低 |
| L2 脚本 MOD | 写逻辑、加机制 | 中 | 中 | 中(崩溃归因) |
| L3 引擎级 MOD | 改底层、反编译 | 高 | 高 | 高(兼容噩梦) |
| L4 官方 UGC | 内置编辑器 + 分享平台 | 低 | 很高 | 中(审核、法律) |
独立游戏建议:
- 默认做 L1(数据外置的副产品,几乎零成本)
- 有余力做 L2(需要 API 设计与沙箱)
- L3 顺其自然(不主动支持,但别刻意封堵)
- L4 只有明确需要时才做(关卡编辑器是很大的工程)
判断依据:你的游戏是否天然是平台? 关卡制/模拟/沙盒类做 L4 收益高;线性叙事类做 L4 收益低。
2. 数据驱动程度 = MOD 能力的前提
MOD 能力不是后来加的,是架构决定的。
| 架构选择 | MOD 友好度 |
|---|---|
| 所有数值在外部数据源(JSON/表格) | ✅ L1 免费获得 |
| 数值硬编码在代码里 | ❌ 无法做 MOD |
| 内容用统一数据结构(卡牌/物品/敌人同构) | ✅ 易扩展 |
| 每类内容都是特例代码 | ❌ 扩展成本高 |
| 有事件/钩子系统 | ✅ L2 前提 |
| 逻辑与表现分离 | ✅ 必要 |
反向要求(写进 templates/02 系统规格单):
- 参数外置
- 内容数据同构(同类内容结构一致)
- 无硬编码的"特例"
- 逻辑与表现分离
- 有稳定的事件钩子
这些要求在 systems/08(参数外置)与 production/24(可测试性)里已经要求过 —— MOD 友好是它们的副产品,不是额外工作。
3. 官方 API 设计原则
| 原则 | 说明 |
|---|---|
| 稳定 | 已发布的 API 不轻易破坏性变更 |
| 版本化 | API 带版本号,MOD 声明兼容版本 |
| 最小面 | 只暴露必要的接口(暴露越多,兼容负担越大) |
| 文档 + 示例 | 没有示例的 API 等于不存在 |
| 沙箱 | 脚本 MOD 不能访问文件系统/网络/任意内存 |
| 错误隔离 | MOD 崩溃不能拖垮游戏(捕获异常,禁用该 MOD) |
| 可调试 | MOD 开发者需要日志与错误提示 |
版本化策略:
api_version: 2.1
min_game_version: 1.3
游戏启动时校验,MOD 不兼容则禁用并提示(而非崩溃)。
4. UGC 内容管线(若做 L4)
[编辑器] → [本地测试] → [导出文件] → [分享] → [发现] → [游玩] → [评分/举报]
| 环节 | 要求 |
|---|---|
| 编辑器 | 必须比"写代码"简单 10 倍;有实时预览 |
| 本地测试 | 一键从编辑器进入试玩 |
| 导出格式 | 单一文件、自包含、可版本化 |
| 分享 | 支持本地文件 + 平台创意工坊 |
| 发现 | 排序、筛选、标签、推荐(否则 UGC 会沉没) |
| 审核 | 举报 + 自动扫描 + 人工抽查 |
| 兼容 | 游戏更新后旧 UGC 不能全废(版本标记 + 降级) |
UGC 的死亡原因:不是编辑器难用,是没有发现机制。 做了 1000 个 UGC 但没有排序与推荐 → 玩家只看前 10 个 → 创作者失去动力。
5. UGC 的经济与法律
| 项 | 要点 |
|---|---|
| 内容归属 | 在 EULA 里明确:玩家创作内容的授权范围 |
| 是否允许收费 | 通常不允许(会引入支付、税务、退款问题) |
| 审核责任 | 平台需承担一定的内容审核责任 |
| 年龄分级 | UGC 内容可能改变游戏分级(需标注) |
| IP 风险 | 玩家可能上传侵权内容 → 需要举报与下架机制 |
| 创作者激励 | 比赛、官方推荐、署名(而非分成) |
独立游戏建议:UGC 用署名 + 官方推荐激励,不用金钱分成。 金钱分成会引入税务、支付、争议处理,成本远超收益。
6. 可扩展性对系统设计的反向要求
| 要求 | 原因 |
|---|---|
| 内容同构 | 新内容能复用同一套系统(否则每个 MOD 都要改代码) |
| 无特例 | 特例无法被 MOD 覆盖,且是涌现的敌人(见 principles/04) |
| 数据与逻辑分离 | 数据可替换,逻辑可复用 |
| 事件钩子 | MOD 需要在关键节点插入行为 |
| 可观测 | MOD 需要读取状态 |
| 失败隔离 | MOD 的错误不能污染主逻辑 |
| 存档兼容 | 移除 MOD 后存档不能损坏(或明确提示) |
存档兼容是最容易忽略的:玩家装了 MOD 玩 50 小时,移除 MOD 后存档崩了 → 差评。 方案:存档记录依赖的 MOD 列表,加载时校验并提示。
7. 反模式
| 症状 | 修法 |
|---|---|
| 数值硬编码还想支持 MOD | 先做参数外置 |
| 主动做 L4 但无发现机制 | 编辑器 + 排序 + 推荐 缺一不可 |
| API 频繁破坏性变更 | 版本化 + 兼容层 |
| 脚本 MOD 无沙箱 | 安全风险;必须沙箱 |
| MOD 崩溃拖垮游戏 | 异常隔离 + 自动禁用 |
| 无 MOD 冲突检测 | 提示冲突的 MOD 列表 |
| 移除 MOD 后存档损坏 | 存档记录依赖列表 + 校验 |
| 无 API 文档与示例 | 等于没有 API |
| UGC 收费分成 | 引入税务/支付/争议,不值 |
| 游戏更新后旧 UGC 全废 | 版本标记 + 降级策略 |
| 用 L3 支持作为卖点 | 反编译级支持无法承诺 |
8. 交付物
- MOD 层级决策(L0–L4 + 理由)
- 架构友好度自检(六项:参数外置/同构/无特例/逻辑分离/钩子/可观测)
- API 规格(版本化、最小面、沙箱、错误隔离、文档示例)
- 若做 UGC:编辑器规格 + 分享格式 + 发现机制 + 审核流程
- EULA 相关内容条款要点
9. 参考
systems/08-numbers-and-formulas.md(参数外置)production/24-testing-and-qa.md(确定性、隔离、可观测)- 案例:Stardew Valley(大型 MOD 生态)、Rimworld(官方支持)、Factorio(API 文档标杆)、Baba Is You(关卡编辑器)