下载 App
开发者日志 04 · 把玩法藏起来
《绿洲涌现》开发日志 · 第 4 篇
一个反直觉的决定:不做教程
游戏有固沙、种植、防护链、水预算、天气、洪水、养殖、章节验收……一套下来十来个系统。常规做法是做一个教程关,一条条教。
我们没做。原因是:治沙本身就是"慢慢发现规律"的过程。 如果开局就把所有规则糊在玩家脸上,那种探索感就没了。
替代方案是章节引导 + 逐层揭示。
引导系统:只推下一步
界面上永远只显示"现在该做什么",而不是"全部能做什么":
第一章 · 第1/5项 · 进行中
第一道沙障 · 新铺 8 块草方格
0 / 8 [领取 +80] [选择铺设]
引导不是静态文本,而是实时读取游戏状态后给出的建议。同一句"还差 8 块",会随情况变成完全不同的指引:
| 情况 | 引导文案 |
|---|---|
| 正常 | 还差8块;在未保留流沙铺草方格。 |
| 有幼苗未成活 | 还差12块成活;已有5块幼苗,先供水养护。 |
| 资金不足 | 铺设资金不足8;等待收入,巡护可用时可补充资金。 |
| 无可施工地块 | 当前无可施工流沙;天然保留可维持。 |
这套逻辑在 ChapterGuide.Describe() 里,是整个项目里最"啰嗦"但最值得的一段代码。
长文本去哪了
早期版本的界面非常拥挤——每个面板里塞满了规则说明,占了大量空间,沙漠反而被挤小了。
玩家反馈很直接:“无关的文字太多,边上一圈文字占据太多空间,必须在横屏手机上一屏内显示整个沙漠。”
于是我们做了一次彻底的信息分层:
| 信息类型 | 去哪 |
|---|---|
| 动态状态(当前水、压力、进度) | 主界面常驻 |
| 短提示(下一步做什么) | 引导卡 |
| 长篇规则说明 | 「查看规则」弹窗 |
比如洪水面板,原本有三段共 264px 的规则文字,现在压缩成一个按钮:
lua复制
luaButton("查看洪水规则", function() self:ShowRules("洪水 · 调蓄规则", { { body = "低洼通道:6 → 16 → 26 → 36 → 46 → 47 → 48。水纹只沿这七格;防风绿带不是堤坝。" }, { body = "可选工程,不占地、不拆植被。容量24,最多截留1.5/秒……" }, { body = "洪水、调蓄水与生态水分账:未转入生态或生产库,不改善水预算……" }, }) end, false, { id = "floodRulesEntry", ... })
效果:横屏沙漠绘图区从 245px 涨到 279px(+14%)。
逐层揭示:让引导"看得见"
引导说"点这个按钮",但按钮可能在滚动区域外——玩家看不到。所以我们实现了逐层揭示:引导要指向某个控件时,先把它所在的所有滚动容器滚到能完整显示的位置,再让玩家点击。
这带来一个测试上的挑战:怎么验证"揭示后目标真的可见"?我们的做法是断言内到外的增量——从最内层滚动容器开始,逐层向上检查目标矩形是否完整落在每一层的可见裁剪区内:
lua复制
lualocal full = box.x >= clip.x - 1e-6 and box.y >= clip.y - 1e-6 and box.x + box.w <= clip.x + clip.w + 1e-6 and box.y + box.h <= clip.y + clip.h + 1e-6 V.assert(full, "引导逐层揭示保留完整目标高度:" .. widget.props.id)
一个被玩家骂出来的修复
上线预览后收到反馈:“点击方块区域,整个屏幕的列表会突然往上滚动。”
排查后发现,是"设施导航"功能惹的祸——点击地图上的设施图标时,代码会自动把侧栏滚动到对应工程卡片。逻辑本身没错(想让玩家立刻看到相关内容),但体感极差:玩家只是想点一下看看,结果整个界面跳了。
修复很干脆:点击只切页签、停掉惯性,绝不改变滚动位置。滚动只能来自玩家主动划动或滚轮。
lua复制
lua-- 点击不滚动:只切换页签并停掉惯性;id 保留给调用方语义,不再用于定位滚动。 function View:FocusGuideTarget(tab, id) self:SwitchTab(tab) UI.Layout() local side = self.root and self.root:FindById("sidebarScroll") if side then side:SetState({velocityX=0, velocityY=0, isDragging=false}) end end
教训:"帮玩家滚动"是一种打扰。 导航可以,但视口位置是玩家的领地。
这一篇的教训
引导的目标不是告诉玩家所有规则,而是让玩家在想问"接下来呢"的时候,恰好看到答案。



