为期一月
数不清有多少个游戏项目胎死腹中。
作为一个中年游戏开发者,我在工作中已经完成了不少项目,对自己的编程技能也很有信心。然而迄今为止,我独立开发的项目中,只有一款益智小游戏成功发布,其它都因各种原因停滞了。回顾这段经历,我总结了几点原因:
为了改变这种状况,我决定限定一个月时间,做出并发布一款游戏(类似于一个月的 Game Jam)。由于时间有限,游戏选型从以下几种考虑:
最终,游戏会以免费形式发布在 itch.io 平台。如果受欢迎,我会再花一个月时间完善并重新发布游戏;如果反响不佳,下个月就去开发新游戏。通过这种方法,我希望验证一些萦绕多年的玩法 idea。
第一个尝试的目标就是复刻胖老鼠工作室的《24 层魔塔》,其实之前曾经尝试过几次,但最终都没有完成发布。
这款“魔塔”是多少人的童年回忆呢
这次的《mota24》基本是对原版的完美复刻:素材都来自原版,数值和流程(包括所有隐藏要素)也基本还原。此外,还改进了 UI 界面,优化了操作手感,加入了存读档功能,支持基本游戏设置(全屏、音乐音效)。同时,提供英文版本。
虽然只是复刻,但项目过程中我也思考了很多,关于魔塔玩法的本质,现代魔塔的问题,魔塔玩法应该怎么衍生......后续应该会再次基于这个项目开发新的类魔塔游戏。
回顾这一个月的时间,第一周效率爆棚,游戏的核心玩法基本都在这一周完成。当时还天真地觉得一个月有点太长。
第二周效率减半,基本在确定 UI 的美术风格和 UX 排版,制作了大部分界面。由于这不是我擅长的部分,所以效率比较低,但最终结果还算满意。
第三周效率再减半,主要在做魔塔的对话系统和触发器编辑。虽然胖老鼠版魔塔的事件已经算挺简单,但还是花了不少时间确定方案。当时的考虑是,在能覆盖所有事件类型的基础上尽量简单(因为开发时间有限,如果不设 Deadline,我可能会在这里花大量时间写一个复杂的框架)。
第四周效率再减半。这周生病,每天要花半天时间在医院理疗,同时公司项目上线,要优先处理上线项目的 Bug。最后集中在周末两天全力开发《mota24》,效率爆棚——修复了大部分 Bug,完成了大部分周边工作,如鸣谢、游戏设置、游戏开场和结束的滚屏、游戏 icon、Splash Screen、打包、itch.io 的页面等。
到这里,终于在一个月内完成了最初的目标。
再看“魔塔”这个品类,起源于上世纪 90 年代的日本游戏《魔法の塔》(Tower of the Sorcerer) ,是极简的 RPG,虽然简单,但涉及的系统相当全面,非常适合作为游戏开发入门项目。由于此次限定一个月,时间紧张,开发工具的选择与此前项目有很大区别,以下是我在《mota24》项目中使用的几个实用插件和工具。
https://ldtk.io/
LDtk(Level Designer Toolkit)是一个现代化的 2D 关卡编辑器,由《死亡细胞》(Dead Cell)的开发者开发。它是一款快速、免费的开源工具,专为游戏开发者设计。很多时候,相比 Unity 自带的 Tilemap,LDtk 更为好用,还可以用来配置关卡事件。
虽然在 LDtk 里可以通过给 Entity 增加自定义字段来配置数据和逻辑,但我个人建议将 LDtk 作为一个简单的关卡编辑器使用,逻辑和数据在 LDtk 外部配置。因为当涉及 LDtk 不擅长的领域时,使用起来会比较别扭。
《魔塔》的地形和阻挡等基本 Tilemap 编辑就不多说了。下面以魔塔的怪物和公主为例,重点介绍我是如何使用 LDtk 的 Entity 的。
下图可以看到,所有怪物都是单独的 Entity。怪物有两个字段:MonsterId 表示怪物 ID,与配置表关联;AnimFrames 表示动画帧数,Unity 的导入器会根据这个帧数从图集中读取对应的 Sprite 来生成帧动画。
对于怪物、物品等在关卡中大量复用的 Entity,我在 LDtk 中只配置 ID,在导入 Unity 时自动绑定对应脚本,怪物属性等数据通过 Excel 配置,根据 ID 对应。
然而,《魔塔》中还有很多 NPC,特点是不复用,每位 NPC 都是独特的,有自己的对话和逻辑,并与关卡中的其它 Entity 关联。
如图所示,公主有三个字段: 对应 Unity 的脚本名字(通过反射绑定),TargetStair 关联一个楼梯(与公主对话后,这个楼梯需要显示出来),AnimFrames 表示动画帧数。
LDtk to unity 支持自定义导入后处理(https://cammin.github.io/LDtkToUnity/documentation/Topics/topic_CustomImporting.html),我在后处理中根据 Entity 的属性绑定对应的脚本,不同脚本会根据需求读取 Entity 的字段。
这个方案的好处在于,我不会手动修改 LDtk 导入后的内容,所有修改都在后处理脚本中完成。这样每次在 LDtk 中修改关卡内容后,切回 Unity,等待导入结束就可以直接运行游戏了,不需要额外处理,可以减少操作失误。
https://luban.doc.code-philosophy.com/
Luban 是一个强大且易用的游戏配置解决方案,专为处理游戏项目中的复杂配置工作流而设计。它支持多种文件类型(如 Excel、JSON、XML 等)和多种导出格式(如 binary、JSON、XML 等),并且兼容主流编程语言(如 C#、Java、Go、C++ 等)。Luban 提供了丰富的数据校验功能和良好的跨平台能力,支持 Unity、Unreal、Cocos2d-x、Godot 等主流游戏引擎。此外,它还具有清晰优雅的生成管线设计,方便开发者进行二次开发和定制。
在多年的开发中,我尝试过许多不同的数据配置方案,踩了不少坑后,现在只使用纯文本格式配置(如 JSON)或 Excel。不建议使用可视化配置方式,如 ableObject,或自己写 Editor 窗口来配置,或类似插件。
选择 Luban 的主要原因有几点:支持复杂类型(列表、类),支持数据校验、支持枚举、支持代码生成。
如图所示,这是 mota24 的 bean 表(可以理解为面向对象的类定义), 导表后会生成对应的 C# 代码 ,这个功能非常好用,可保证配置表和代码一致。
下图是枚举定义表。
下图是物品表,可以看到复杂类型的配置方式。虽然乍一看可能不好懂,但习惯后其实非常直观。
Luban 的复杂类型配置方式有多种,可以根据自己的喜好选择:https://luban.doc.code-philosophy.com/docs/manual/exceladvanced
缺点可能是上手难度较大。Luban 的文档一看就是程序员写的,通篇都是技术理论,对于非技术人员来说,有点难啃。希望官方能优化文档,增加更多的示例项目,优化使用流程。
Yarn Spinner
https://www.yarnspinner.dev/
Yarn Spinner 是一个友好的对话编写工具,专为游戏开发者设计。它允许作家以类似电影剧本的形式创作交互式对话,并将其无缝集成到游戏中。Yarn Spinner 提供了丰富的功能,包括台词展示、分支选项以及通过自定义指令与游戏引擎进行交互。它兼容 Unity、Unreal 等主流游戏引擎,极大地简化了对话系统的开发过程。
对于对话配置,我的观点和数据配置一样,最好是纯文本的配置方式,这比可视化配置对话要好用太多了。可视化对话配置工具一般用结点和连线表示对话,看起来直观,但当配置需求变大后,工具往往不能完美满足需求。例如,基于正则表达式的文本搜索和替换、多行编辑、多语言等功能。基于文本的配置方式则没有这些问题,只要熟悉一款 IDE 就能高效操作文本,省去了工具的学习成本(功能越全的可视化编辑器,学习成本也越高)。当然,这只是个人推荐,实际应用时还是根据自己的习惯做选择。
《魔塔》的对话需求并不简单。下图是 15 层神秘老人的对话,涉及条件判断、对话分支、读写游戏数据以及调用游戏函数等。
Yarn Spinner 的优点是写对话就像写小说一样,不需要频繁操作鼠标,直接一行一行写文本即可。VSCode 有插件,能校验语法,也能校验脚本导出的自定义函数的使用,所以不用担心写错。
总结
这三个工具我都是第一次使用,可能在用法上不太专业,如果大家有更好的建议,欢迎分享。这些工具对这个项目帮助很大,如果我选择自己做工具,mota24 这个项目估计很难在一个月内完成。
这三个工具也符合我对好工具的标准:基于文本(LDtk 完全基于 JSON,理论上可以直接编辑其 JSON 文件),与引擎没有强耦合(可以适配不同引擎,自研引擎也可以使用)。
此前,一直无法完成一个游戏项目让我非常焦虑,甚至对自己失去了信心。有时会怀疑自己是否适合走独立开发这条路,尤其是现在人到中年,是否还应该继续坚持。希望通过一个月做一款游戏的方式,能让我找回自信。如果还是做不到,或许也该考虑是否要继续走独立开发这条路。欢迎大家来监督和指正。
下一款游戏计划是一款小解谜游戏,估计 7 月 8 日启动,加油吧。