过去7个月里,我完全独立开发了一款2D增量六边形解谜肉鸽游戏,并在不同WebGL平台与超过1万名玩家进行试玩测试后,最近不得不对核心玩法系统做出相当重大的调整。

该项目使用Unity构建,目前作为免费Steam试玩版发布,有兴趣了解系统运作的朋友可以访问:

https://store.steampowered.com/app/4692090/Unstable_Nuclear_Reactor_Demo/

此外,我想分享一些在Unity端遇到的问题以及我的解决思路。

构建六边形网格

核心玩法围绕六边形网格展开,原子可以合并成更高阶元素。挑战之一是要让网格足够灵活,能支持不同棋盘尺寸和环状配置,而无需硬编码每个位置。

我没有把棋盘视为一组互不相关的GameObject,而是将逻辑网格状态与视觉表现分离。

这让多个系统更容易在此基础上构建:

  • 查找相邻六边形
  • 验证方块能否放置
  • 检测可能的合并
  • 处理连锁反应
  • 管理不同环的大小
  • 添加与特定方块交互的工具

这也让改变棋盘配置变得更简单,无需重写玩法逻辑。

处理连锁反应

比较有趣的部分之一是实现大型合并链。

普通合并可能触发另一个合并,进而再触发一个,所以我需要一个系统,能在不依赖大量嵌套调用的前提下解决这些交互。

我最终将合并过程视为一系列游戏状态变化:

  1. 识别有效合并。
  2. 更新逻辑网格。
  3. 创建/更新生成的原子。
  4. 检查受影响的相邻单元格。
  5. 将新合并加入队列。
  6. 继续解析,直到没有有效反应。

当连锁组合涉及许多方块时,这一点变得尤为重要。

工具与玩家状态

游戏还有几种修改常规规则的工具,包括移除、交换或修改原子的工具。

我遇到的一个问题是,最初我将解锁的工具视为自动可用。试玩后发现,这大大降低了游戏的策略性,因为玩家可能同时拥有过多选项。

我改变了系统,让已解锁工具和已装备工具成为独立状态。

玩家可以永久解锁工具,但自行选择是否当前装备。

这听起来像是个小UI改动,但需要将工具的进度状态与活跃的游戏状态分离开。

在不移除随机性的前提下修复随机性

试玩中最大的反馈之一是,某些对局可能因为糟糕的随机数生成而变得令人沮丧。

我不想完全移除随机性,因为不确定性是肉鸽结构的重要组成部分。

于是,我增加了暂存槽,玩家可以临时存放原子或工具。

有趣的是,这还必须与现有的资源和棋盘系统协同工作。存放的物品不是棋盘上的普通方块,所以我必须确保游戏在处理其存储、使用或丢弃时能正确管理其生命周期。

这给了玩家更多控制权,同时没有完全消除随机性。

为什么将玩法逻辑与视觉效果分离

完全独立开发让这一点变得尤为重要。

当玩法系统与GameObject紧密耦合时,修改一个机制很快就会变成同时修改UI代码、动画、输入处理和网格逻辑。

保持逻辑状态与表现分离让我能更快迭代。

例如,游戏可以在视觉动画实际完成之前,就判定一个原子从一个逻辑六边形移动到了另一个。

随着我添加工具、连锁反应、教程、升级和不同游戏模式,这种分离变得越来越有用。

从1万多次测试中学到的

最大的教训其实与Unity无关。

一个在我作为开发者测试时完美运行的机制,对初次接触的人来说可能感觉完全不同。

最近的工作很多不是添加新内容,而是减少摩擦:

  • 更好的教程
  • 更好的升级界面
  • 对工具更可控
  • 减少令人沮丧的随机性
  • 更好地处理玩家意外操作
  • 修复通过试玩发现的边缘情况

完全独立开发这个项目也迫使我构建易于修改的系统,而不仅仅是只运行一次的系统。

我仍在不断迭代,所以很想知道其他Unity开发者是如何处理类似问题的。