下载 App

开发日志 05|怎样确认世界真的能走通:自动自检与浏览器试玩

10/201 浏览综合

《一念万物》的关卡依靠世界规则演化。水要往下游走,花要等环境合适,鸟要找到落脚处,天气还可能在时间线上变化。一次手动通关可以确认某条路线有效,却很难保证公共规则改动后,其他关卡与后续段都没有受到影响。
项目因此把验证与关卡数据一起维护,用自动自检检查规则,再用浏览器实操检查玩家面对的流程。
TapTap
图 1|验证方法示意。自动自检、构建与实操分别提供不同证据,不能相互替代。

用已知操作路线重现结果

关卡数据中的 route 记录一条已知路线,部分关卡还包含 alt 和 alt2。动作可以是拖动、轻点、滑动或等待。自检创建世界,执行这些动作,通过 step(dt) 推进模拟时间,再检查是否进入预期阶段、最后是否收束。
第一关的路线包含移走溪中石头、等待水位变化,再把石头放入池塘并等待鸟落下。它验证的是同一世界里连续发生的两段结果,而不是分别创建两个已经满足条件的场景。
世界演化只通过 step(dt) 推进,使检查无需按现实时间等完所有变化。时间线、生物状态与水流也必须跟着这个入口推进,避免有些逻辑依赖界面帧或独立动画而被漏掉。
已知路线证明至少存在一条可走通的路径;替代路线扩大覆盖,但两者都不能证明所有可能操作都合理,也不能直接判断谜题难度。

还要验证“什么都不做”

有些段设计成等待就会自然过去,有些段必须由玩家改变条件。数据用 idle 标记预期,自检逐段创建对应状态,放着不操作,再比较结果。
这能发现两类问题:本应需要干预的段意外自行完成,或本应自然发生的变化一直无法成立。对以等待为一种操作的游戏,两类结果都必须明确。
稳定检测也不能过早。水头还在推进、气温还在变化,后果尚未显现,此时不能只因为某些生物暂时停住就宣告和谐。检查过程需要覆盖这些渐进状态。

通关之后的画面也属于结果

后续修正为关卡屏设置 World.hold = true,世界发出完成信号后停止演化,保留通关面板背后的和谐状态。否则,玩家刚读到收束文字,鸟又离开、环境继续改变,画面可能已经不再展示刚才的结果。
自检在已知路线收束后继续推进 90 秒,确认停住的世界仍然满足条件。这里验证的是收束冻结行为,并不表示同样的世界在不冻结时一定能维持 90 秒。自在园与终章继续演化,采用不同的结束体验。
把这项区别写清楚,能防止测试通过被误读为更强的承诺。

自在园与专项检查补足公共规则

没有通关目标的自在园,不能用“是否完成”作为验收标准。它的检查关注取放与因果:石头拿入能阻溪,放回能复流,灯能被移动并开关,相关环境变化继续使用公共规则。
布局也有专项检查。溪口在池塘最低水位与满水时都要保持连接,等待鸟必须有环飞对象,路径范围要合理。第一关另检查渐进水头,以及鸟不能在岸上的石头落脚、石头进入水中后可以落脚。
手势修复也增加了相应检查:长按能够显示名称且不消耗干预,轻点之后仍可拖动,有效操作才计次。自检不只验证最后通关,还需要验证这些容易被结果掩盖的过程。
TapTap
图 2|2026-10-12 截图工具将架上物件按预设位置取入并推进世界后的实机画面。它展示自在园取放场景,不单独证明阻水与复流断言通过;规则结论仍以自检结果为依据。

导出成功之后,还要实际打开游戏

项目的 check 包括字体缺字校验、编辑器导入、广告桥接测试、启动检查与世界自检。export 生成 Web 包。构建成功能说明导出流程完成,但看不出按钮是否太小、提示是否难找、英文大字号是否溢出。
2026 年 10 月 7 日的实际试玩从新玩家入口完成第 1、2 关,并抽查其他关卡、自在园、终章及多个界面。完整自检通过,实际操作仍发现了轻点误扣次数与图鉴空状态等问题,随后修复并复验。这正说明两种验证各有作用。
画面实现变化则使用逐关截图比对;性能变化使用基准与浏览器测量。规则、视觉、输入和耗时需要各自对应的证据。
当前验证记录仍明确保留真机触控、声音听感、弱网与宿主环境的未覆盖范围。一个可信的开发结果既要记录已经通过的检查,也要说明检查没有回答什么。只有这样,下次改动才能知道该重复哪些步骤,以及哪些问题还需要继续到真实设备上确认。
开发日志 04|一次轻点为什么用掉了唯一机会:试玩带来的修正截图
开发日志 04|一次轻点为什么用掉了唯一机会:试玩带来的修正
2026 年 10 月 7 日的玩家视角检查里,第 12 关出现了一个很直接的问题:轻点溪中石头,没有移动,接着再拖同一块石头,石头却不走了。点击“回到清晨”以后,重新拖动又可以正常恢复水流。 当时画面没有清楚说明机会已经用完,玩家容易把它理解成触摸失效。检查代码后确认,可拖物在按下时就消耗干预,尚未判断有没有发生位移。 图 1|2026-10-07 修复前的浏览器记录。复现步骤为轻点石头后尝试拖
官方
4 赞
开发日志 03|不用贴图,怎样画出一个会变化的水墨世界截图
开发日志 03|不用贴图,怎样画出一个会变化的水墨世界
《一念万物》的水墨画面由程序绘制。树、石头、池塘、鸟和鱼的画法集中在 Paint.gd,四季使用不同配色,再叠加水墨与宣纸着色器。这样做让物件外观能够随着世界状态变化,同时也带来了一个很实际的问题:每帧重新画大量笔触,浏览器能否承受? 从形状到笔触 画面主要使用笔触 stroke、brush 和墨块 wash。它们让边缘、宽度与浓淡有变化,避免所有物件都由等宽线和正圆构成。四季调色板分别控制天空、
官方
4 赞
开发日志 01|怎样设计“一念”引发的连锁变化截图
开发日志 01|怎样设计“一念”引发的连锁变化
《一念万物》的核心循环是“观察 → 一念 → 涌现”。玩家挪动一件东西,世界随后自己发生变化。把这个想法落成可玩的关卡,首先需要回答一个问题:玩家怎样看出,眼前的变化确实来自刚才那一下操作? 第一关“水中石”是一个具体例子。开场时,石头挡在溪里,下游池塘水浅。玩家把石头拖到岸边,溪流恢复,水逐渐进入池塘,鱼有了足够的水,周围植物也受到湿度变化的影响。这里没有一个“移走石头后播放通关动画”的专属脚本
官方
4 赞
开发日志 02|48 关共用一个世界:把关卡写成数据截图
开发日志 02|48 关共用一个世界:把关卡写成数据
《一念万物》有 48 关,分为春夏秋冬,每关还有后续段。如果给每关单独写一套逻辑,类似的水、风、鸟和植物规则很快就会分叉:某一关改好了,另一关仍然沿用旧行为。项目因此把世界演化集中在 World.gd,关卡只描述初始条件和目标。 图 1|依据代码绘制的结构示意。关卡、终章与自在园使用同一个引擎,各自通过数据定义条件与目标。 先确定规则与数据的边界 Data/levels.json 保存关卡对象、位
官方
4 赞