下载 App

开发日志 01|怎样设计“一念”引发的连锁变化

10/178 浏览综合
《一念万物》的核心循环是“观察 → 一念 → 涌现”。玩家挪动一件东西,世界随后自己发生变化。把这个想法落成可玩的关卡,首先需要回答一个问题:玩家怎样看出,眼前的变化确实来自刚才那一下操作?
第一关“水中石”是一个具体例子。开场时,石头挡在溪里,下游池塘水浅。玩家把石头拖到岸边,溪流恢复,水逐渐进入池塘,鱼有了足够的水,周围植物也受到湿度变化的影响。这里没有一个“移走石头后播放通关动画”的专属脚本。石头是否阻水、溪是否流动、池塘怎样涨水、鱼是否安全,分别由世界规则计算。
TapTap
图 1|2026-10-12 当前版本实机截图。开场石头位于上游,浅水池与下游溪形成需要恢复的水路。

让过程能被看见

一条因果链如果变化太快,玩家就只会看到操作前后的两幅图,很难读出中间发生了什么。第一关后续调整了水的节奏:溪流数据设置 front_speed 为 45 设计像素每秒,flow_rate 为 0.18,池塘的 fill_rate 为 0.06。水头推进、流量变化和池塘涨水分别控制,水从上游向下游走,不会一解除阻挡就瞬间铺满整条溪。
这几个参数的分工很有用。水头决定“水走到哪里了”,流量和水位速率决定“水来了之后积累得多快”。如果只把池塘涨水放慢,上游水路仍会突然出现;如果只放慢水头,池塘也可能在接通后过快变化。拆开以后,关卡可以通过数据安排观察节奏。
判定也要尊重这个过程。水头还没推进完成时,世界不能被视为稳定。否则,画面里的水还在向前走,系统却已经给出结果,玩家会错过最需要观察的一段。
TapTap
图 2|按已知路线进入第二段后的实机画面。石头仍在岸上,池塘水位已经上升,新来的雀开始寻找水中落脚处。

同一块石头,在下一段有了不同用途

第一段满足溪流恢复、池塘水位达到要求、鱼安全等条件后,世界进入第二段。原来的对象与状态保留下来,池边加入一只等待落脚的雀。玩家这次要把石头从岸上放进池中,为它提供落脚处。
这只鸟配置了 wade,只接受水中的落脚点;石头配置了 perch,能够承载鸟。于是,岸上的石头虽然也能落鸟,却不符合这只鸟的需求。这个区别由通用属性组合表达,不需要在代码里写“第一关第二段例外”。
等待的鸟还配置了围绕池塘的环飞路径。它绕着池飞,既表现“正在寻找落脚点”,也把玩家的注意力带向池塘。环飞没有直接告诉玩家把石头放在哪个坐标,但给出了与需求有关的视觉线索。
TapTap
图 3|同一次路线的收束状态。石头放入池塘后承载雀,上下游仍保持通水;与图 1 对照可以看到,同一件物品的作用随位置改变。

和谐不是把每个东西摆回原位

这一关的两段让石头经历了“移出水路”和“放回水中”。第一段关心通水,第二段关心栖息,同时仍要求上下游保持流动。玩家不能简单记住“石头在水里就是错的”,而要观察它处在什么关系里。
世界的和谐检测同时检查稳定状态与关卡条件。稳定只表示变化暂时平息,不能单独代表成功;关卡条件则说明当前关系是否成立。决定成败的规则不使用随机数,粒子和摆动等表现可以有变化,同样的有效操作仍应得到可复现的结果。
这一轮调整已经把渐进水头、雀绕池飞、岸上不落和入池石头可落纳入自检。它们保证设计关系成立,但不直接证明等待时间对所有玩家都合适。节奏仍需要实际试玩来判断:水走得是否足够清楚,等待是否过长,玩家是否注意到了新来的鸟。
第一关最终承担了两层教学:先让玩家看到一个条件如何沿水路传播,再让玩家发现,物件的作用取决于它与周围世界的关系。
开发日志 04|一次轻点为什么用掉了唯一机会:试玩带来的修正截图
开发日志 04|一次轻点为什么用掉了唯一机会:试玩带来的修正
2026 年 10 月 7 日的玩家视角检查里,第 12 关出现了一个很直接的问题:轻点溪中石头,没有移动,接着再拖同一块石头,石头却不走了。点击“回到清晨”以后,重新拖动又可以正常恢复水流。 当时画面没有清楚说明机会已经用完,玩家容易把它理解成触摸失效。检查代码后确认,可拖物在按下时就消耗干预,尚未判断有没有发生位移。 图 1|2026-10-07 修复前的浏览器记录。复现步骤为轻点石头后尝试拖
官方
4 赞
开发日志 03|不用贴图,怎样画出一个会变化的水墨世界截图
开发日志 03|不用贴图,怎样画出一个会变化的水墨世界
《一念万物》的水墨画面由程序绘制。树、石头、池塘、鸟和鱼的画法集中在 Paint.gd,四季使用不同配色,再叠加水墨与宣纸着色器。这样做让物件外观能够随着世界状态变化,同时也带来了一个很实际的问题:每帧重新画大量笔触,浏览器能否承受? 从形状到笔触 画面主要使用笔触 stroke、brush 和墨块 wash。它们让边缘、宽度与浓淡有变化,避免所有物件都由等宽线和正圆构成。四季调色板分别控制天空、
官方
4 赞
开发日志 02|48 关共用一个世界:把关卡写成数据截图
开发日志 02|48 关共用一个世界:把关卡写成数据
《一念万物》有 48 关,分为春夏秋冬,每关还有后续段。如果给每关单独写一套逻辑,类似的水、风、鸟和植物规则很快就会分叉:某一关改好了,另一关仍然沿用旧行为。项目因此把世界演化集中在 World.gd,关卡只描述初始条件和目标。 图 1|依据代码绘制的结构示意。关卡、终章与自在园使用同一个引擎,各自通过数据定义条件与目标。 先确定规则与数据的边界 Data/levels.json 保存关卡对象、位
官方
4 赞
开发日志 05|怎样确认世界真的能走通:自动自检与浏览器试玩截图
开发日志 05|怎样确认世界真的能走通:自动自检与浏览器试玩
《一念万物》的关卡依靠世界规则演化。水要往下游走,花要等环境合适,鸟要找到落脚处,天气还可能在时间线上变化。一次手动通关可以确认某条路线有效,却很难保证公共规则改动后,其他关卡与后续段都没有受到影响。 项目因此把验证与关卡数据一起维护,用自动自检检查规则,再用浏览器实操检查玩家面对的流程。 图 1|验证方法示意。自动自检、构建与实操分别提供不同证据,不能相互替代。 用已知操作路线重现结果 关卡数据
官方
4 赞