第 28 章是全集从「写死玩法」到「可编程玩法」的转折。前面各章的副本逻辑都编译在服务端代码里,改一次规则要发一次版本。这一章把副本逻辑抽成脚本包:
manifest.json加脚本与资源,带版本号、依赖与迁移脚本,运行在受限沙箱中,通过统一的触发器模型on(Event) if Condition then Action驱动。它同时要解决四个工程问题:隔离、确定性、热更与可观测。
本章定位
- 全集位置:第 28 章,属「内容与扩展」层,是全集可扩展性的技术基石。
- 难度梯度:高阶。沙箱安全、确定性保证与热更灰度三者都属高风险工程领域。
- 前置章节:第 3 章井字棋与四子棋(房间内核),并综合了第 14 章事件溯源、第 17 章确定性结算、第 27 章世界状态的思路。
- 后续衔接:第 29 章 UGC 内容创作与分享把脚本能力交给玩家,第 35 章动态副本程序化生成则用脚本生成副本内容。
核心验证目标
- 六条设计原则:隔离、确定性、热更与版本化、事件驱动、可观测、安全,构成脚本系统的约束框架。
- 脚本包与实例模型:脚本包含清单、脚本、资源与模式定义,实例持有地图、怪物、机关、任务进度与时间轴状态。
- 沙箱资源限制:CPU 用指令计数或时间片中断,内存设虚拟机堆上限,时钟暴露受控的 now() 并可注入回放时钟,随机数可播种复现。
- 触发器引擎:事件源、条件、行为、效果四段式,支持声明式配置或内嵌脚本,带节流毫秒数防止风暴。
- 热更与灰度:脚本包以整体为单位发布,支持蓝绿与灰度发布,向下兼容的数据迁移脚本保证旧存档可用。
- 可观测与安全:脚本级指标(执行耗时、内存峰值、触发频率、错误栈)加结构化日志与分布式追踪,禁用危险库、限制 FFI 与文件网络访问,并对脚本包做签名校验。
技术栈建议
| 层次 | 推荐选型 | 说明 |
|---|---|---|
| 服务端 | Go(gopher-lua、yaegi、quickjs-go) | Go 生态脚本引擎选择丰富 |
| 备选 | Rust(mlua、rquickjs)或 Java(GraalVM Polyglot) | Rust 适合性能与安全要求高的场景 |
| 协议 | TCP 或 UDP 加 WebSocket | 实时走 WebSocket,管理与发布走 HTTP |
| 调度 | Cron 或 DelayQueue | 定时触发器与副本超时 |
| 基础设施 | 延迟队列、KV、对象存储、发布订阅、KMS | 支撑脚本分发、状态与签名 |
本章文章
| 文章 | 核心内容 |
|---|---|
| 在线联机原型全集:第 28 章 副本脚本系统 | Lua 与 JS 沙箱、事件触发器、热更与版本化、可回放、与房间战斗任务 AI 解耦 |
与相邻章节的关系
- 上一章:第 27 章 协作建造系统 提供可编辑的世界状态,本章提供驱动这些世界的脚本引擎。
- 下一章:第 29 章 UGC 内容创作与分享 把本章的脚本能力开放给玩家,从平台编写走向社区创作。
- 内容生成:第 35 章 动态副本程序化生成 用脚本与算法自动生成副本内容。