1、立项背景和目标
倒水排序(Water Sort)是海外长期热门的益智休闲品类。项目目标是做一款关卡量大、难度曲线可控、能持续产出新关卡的倒水手游,同时解决这个品类"关卡靠人工摆、难度不稳定、容易出现死关"的痛点。
2、核心功能模块
- 核心玩法:每瓶 4 层液体,只能把顶层液体倒入同色或空瓶,4 层同色即完成该瓶,所有颜色归位即通关。
- 关卡机关:问号层(倒出后逐层揭示颜色)、蒙布(满足条件后揭开整瓶)。
- 关卡与难度:程序化生成并验证可解,每 10 关一个难度波形(尾数 4 为 Hard,尾数 9 为 Super Hard),失败重开会自动加载降难版本。
- 道具与经济:加空瓶等道具、金币购买、复活。
- 运营系统:星星宝箱、每日礼物、章节旅程奖励、体力、连击、功能逐步解锁。
- 新手引导:数据驱动,用手指提示逐步教学。
3、业务流程
主界面 → 章节旅程 → 进入关卡 → 先点源瓶再点目标瓶倒水 → 完成的瓶子飞入王冠交付订单 → 通关结算金币和星星 → 星星攒满开宝箱;失败可以复活继续,或重开并加载降难版本。
1、整体架构
倒水规则抽成纯逻辑的规则引擎(GameRuleEngine),客户端运行、关卡生成器、求解器共用同一套规则,从根本上避免"生成时判定可解、玩家玩起来却解不开"。关卡离线生成后导出 JSON,客户端按关卡 ID 加载固定盘面。
2、我负责的模块和结果
- 关卡生成流程:生成已完成盘面 → 反向打乱 → 求解器验证(深度搜索 + 状态哈希去重 + 剪枝 + 节点和时间上限)→ 按瓶数、空瓶、颜色分布、问号压力等维度打 100 分制难度分 → 生成失败降难版本 → 导出 JSON。在 Unity 编辑器里做了批量生成窗口,已产出 200 多个关卡。
- 运行时胜负判定:每次倒水后先做轻量检查,无路可走时立即判负;疑似死局时才异步调用求解器,只有确认无解才判负,求解器超时不会误判玩家失败。
- 表现层:液体填充 Shader(分层液面、晃动)、倒水水流与水花、多瓶同时倒水、圆形收缩转场。
- 新手引导、宝箱、每日礼物、道具购买等系统,以及可以逐瓶手绘的关卡编辑器。
3、难点和解决方案
- 反向打乱不等于可解:问号、蒙布等机关会改变哪些操作可行,所以每个候选关卡都必须再用正向求解器完整验证,没有搜完的一律不标为"可解"。
- 多瓶同时倒入同一个瓶子时液层重叠:第二个源瓶的起始液层设为"目标瓶原有层数 + 第一个源瓶已占层数",按先到先得分配剩余空间。
- 倒水时液面一顿一顿:改为同步填充,并在 Shader 里按累积液量计算液面上限,动画变得连续平滑。
- 不同分辨率下 UI 错位:写了自适应排布组件,等安全区适配完成一帧后再统一计算各区域位置。
- 飞行动画穿帮(闪烁、被瓶子遮挡、飞出屏幕):改用世界坐标插值,切换父节点时保持世界坐标,飞行前先把节点提到最上层。