我是一名全栈开发者,使用Python和JavaScript,有近9年的开发经验。我的经验主要是与GIS系统、数据库和Web应用相关。从小我就想制作一个游戏,记得在12岁的时候尝试过使用Unity制作一个游戏,但当时没有足够的可访问的教程。我的学术项目总是回归到游戏。

我制作过一个基于文本的游戏引擎,Snake和2048,但从未认真尝试过自己的原创想法。上周晚上,我躺在床上想玩GregTech,但我没有勇气开始一个新的Minecraft模组,所以我想出了我理想的游戏!学习的最佳时机是现在,所以我决定通过制作我的理想游戏来学习游戏开发,而不是遵循一个通用的教程。

我选择了Godot和C#因为我想学习一个新的语言,因为它已经有一段时间了。

TL;DR: 我正在制作一个2D工厂游戏。我的第一周主要花在基础上,例如库存、采矿、放置和JSON驱动的内容以及将模拟分离于呈现上。我的最大担忧是过度工程化在我没有证明游戏循环之前。

我的梦幻游戏是什么?

它已经有了一个名字:Makwright。它是一个2D工厂游戏。它受到了Factorio的规模的启发,但通过GregTech中的工业时代的进度。

我喜欢从蒸汽动力到不同电压等级的进度。然而,我一直觉得GregTech有时缺乏“工厂一直在生长”的感觉。可以有很多等待的阶段。我的计划是让工厂本身促进进度,而不是主要依赖于研究。

会有一个清晰的进度路径。一个简单的例子是钢材将作为LV机器的组成部分。

我有很多经验在玩工厂游戏,并且这是我的最爱的类型,因为我喜欢系统、流程和相互关联的机制。这项项目更进一步这些兴趣,同时也迫使我学习游戏开发特定的技能。

如果我要说实话,我只是想这个游戏存在,所以我正在制作它!

我在第一周做了什么?

在第一周,我决定从意义的基础开始,以便将来特性的实现变得更容易。结果,目前还没有什么“游戏”。所以,我做了什么?

  • 添加了一个简单的玩家精灵(目前是一个红色的方块,但我不确定为什么它是红色的,而不是绿色的,因为绿色是我最喜欢的颜色)。
  • 创建了一个可以放置和移除的网格。
  • 添加了资源节点,资源有有限的数量(目前,只有铁矿石)。
  • 使资源节点可以采矿,显示采矿进度的可见覆盖。
  • 创建了一个基于栈的库存,库存有一个十个槽的热键,玩家可以使用数字键选择物品并将其放置到世界中。
  • 使物品、配方和可放置的对象从JSON中加载,而不是硬编码,这应该使它们以后更容易改变和平衡。
  • 添加了启动验证来验证JSON数据。
  • 我故意选择了在所有验证检查和报告每个问题而不是在第一次失败时停止。
  • 放置和移除对象原本会直接改变世界,但我现在已经将这些动作移到命令对象中。
  • 我添加了撤销和重做功能,主要是为了证明系统可以反向改变。
  • 我尝试将模拟数据保留在平常的C#类中尽可能多,而Godot节点负责输入处理和呈现。

我的经验如何影响项目?

如您所见,目前还没有多少游戏视觉效果。我的经验推动了从一开始就建立可扩展的后端系统。

会有人认为这些系统可能需要重构,但我试图将它们足够分离,以便未来更改变得可管理。

而不是直接进入开发,我定义了我的MVP(最小可行产品)应该包含什么。希望这可以阻止范围膨胀杀死游戏的早期版本。然后我创建了一个基本的Jira回报单并将工作分成小的、可交付的块。

在我的日常工作中,我已经习惯了这样做,所以它已经成为第二天性了。

另一个我从一开始就做的事情是写文档。

我记录了我做出的架构决策、每个类负责什么以及我完成了什么的日常开发日志。

我知道,项目如何快速变得难以理解。

缺少在我的个人开发工作流程中的代码审查。

我认为代码审查对于软件开发是至关重要的。

它们有助于教会好实践并及早捕捉问题。

因为我是唯一一个人制作这个游戏,所以我寻找了一种自动化的代码审查工具,可以重现部分反馈循环。

它已经教会我很多关于防御性的C#,并且在问题成为问题之前捕捉了几个潜在的空指针错误。

我仍然审查它的评论,并决定它们是否适合项目,但有一个第二次过我的拉取请求已经有用了,尤其是在学习C#和Godot的同时。

我的最大风险

我觉得我的主要“风险”(不太商业化)是过度工程化系统在我没有证明游戏循环之前。

如果我花费太多时间在底层系统上,而游戏最终不够有趣,我可能需要扔掉或重塑大部分我建立的内容。

我认为这个本能来自于在职业生涯的大部分时间里工作在相同的专业系统上。

我知道这个系统里里外都清楚,能够预测边缘案例的出现。

在工作中,我们围绕用户需求来构建,而这个游戏开发的早期阶段感觉更像是基于氛围。

我的最终教训是:我要开始问:“这个系统会给游戏带来什么有意义的东西?”

下一步是什么?

我的目标是下周创建我的第一个功能的机器:

  1. 接受一个或多个输入。
  2. 处理它们。
  3. 产生一个或多个输出。

一旦这个存在,我将有我的第一个简单的生产链,并且可以测试我设计的系统是否能一起工作。

我也打算改进呈现,以便我可以开始展示游戏的实际内容,而不是仅仅描述背后的系统。

最后,我有几个问题:

  • 如何让系统专注的开发者(如我)避免在自己的第一款游戏中过度工程化?
  • 如果您可以与自己交谈,正在制作自己的第一款游戏时,您会给自己什么单一的建议?