《诺亚的困境》开发日志 #2:编程总结与回顾

360影视 日韩动漫 2025-04-30 10:02 2

摘要:在上一篇开发日志的结尾,我说争取 4 月更新下一篇,没想到真的是 4 月,只不过是 2025 年的 4 月…… 好吧,距离上一篇开发日志已经过去了整整一年,可以说是在《诺亚的困境》所有内容做完以后,我才终于有了时间继续写,也可以说是因为开发过程中迭代的速度非常

在上一篇开发日志的结尾,我说争取 4 月更新下一篇,没想到真的是 4 月,只不过是 2025 年的 4 月…… 好吧,距离上一篇开发日志已经过去了整整一年,可以说是在《诺亚的困境》所有内容做完以后,我才终于有了时间继续写,也可以说是因为开发过程中迭代的速度非常快,以至于没法在途中停下来总结任何东西——今天做出的决定,很可能第二天就会被推翻。总之,在现在,游戏做完后发售前的这一小段时间里,我会趁热打铁,尝试把《诺亚》的开发日志系列补完。

第二篇开发日志想先聊聊编程。在制作《诺亚》的过程中,并没有遇到什么值得拿出来单独说的技术方面的挑战,因此,这篇文章将会从相对宏观的角度来进行变成方面的总结与回顾。

因为《诺亚》是我辞职后全职做的第一款游戏,也是我用 Unity 引擎开发的第一款商业游戏,所以我在项目开始时就给自己定了一个主线任务和一个支线任务。主线任务,毫无疑问,就是好好地用 Unity 引擎把这款游戏做完发售——不要中途放弃,也不要做到一半换引擎。而支线任务,则是在做这款游戏的过程中,建立起泛用的代码库,以达成将来“游戏越做越快”的效果。对于收入尚未稳定的全职独立游戏开发者来说,速度就是生命。

之所以早早地就产生了这个想法,是因为即便我只做完过一款商业游戏,但在数个失败的原型开发中也已经尝够了反复重写某些功能的痛苦滋味。于是,这次一边做,一边把那些几乎所有类型的游戏都会需要的功能写成了可方便重复利用的模块。具体列表如下:

1. 标题画面

2. 游戏设置

3. 存档读档

4. 音频管理

5. Scene 管理

6. UI 管理

7. UI 泛用面板

8. 本地化相关

9. Steam 相关

10. 商店系统

11. 背包系统

12. 对话系统

13. 文字外观处理

14. 手柄支持相关

15. Credits 画面

有了这些代码库,相当于我做下一款游戏时,这 15 个部分的代码都几乎不用写了,节省下来的时间是巨大的。就算主线任务完成后赚不到钱,起码这个支线任务还可以给我带来实际收益,也算是做了一点风险控制吧。《诺亚》之后,我定的目标是在 6 个月之内做完下一款游戏并发售,要是没有这些前期准备,肯定难以达成。如果你以后也想全职做独立游戏,不妨考虑从上述方向开始积累代码库。

虽然说做《诺亚》没有遇到什么技术上的挑战,但依然踩了数个印象深刻的坑,其中不乏早就略有耳闻但没怎么当回事,于是“Learn it the hard way”的例子,现在记下来也是为了提醒未来的自己不要重蹈覆辙。如果你也(用 Unity)做游戏,说不定可以参考一下(即使踩坑是一种必然)。

1. 做 Roguelike 游戏不要用 UnityEngine.Random,要用 System.Random。如果用了前者将难以还原随机状态,也就是难以实现自定义随机种子的功能。

2. 做 Roguelike 游戏时,除了该用 Scriptable Object 来承载数值,在取得数值时还应避免直接 reference,而应采用 getter 函数,这样处理数值时会灵活很多。

3. 不要用 Unity 自带菜单来新建 UI 元素,而要采用自制的 prefab。这样本地化对应、文字外观处理都会很方便,不然可能要手动一个个去改。

4. 在写任何代码前先确认这款游戏是否需要支持手柄,如果需要,提前思考要怎么对应手柄与键鼠在游戏中的无缝切换,后期才加的话会非常辛苦。

5. 如果发现自己总是在重复写一些类似的代码,大概率会有不需要重复的、更好的写法。

最后两条其实也可以说是隶属于写代码的最佳实践(Best Practice)。我不认为自己是一个优秀的程序员,我对自身的定义也从来不是程序员而是游戏开发者,这当中的区别是游戏开发者写代码通常不会考虑什么是最佳实践,比起写完美的代码,还是快点把游戏做出来更重要。

在完成了两款商业游戏后,我发现写游戏代码既不应该追求极致的速度而写得无比 dirty,也不应追求完美的最佳实践而把大量时间花费在构建代码上面,而是应该找到介于这两者之间的一个 Sweet Spot,一个平衡点——对于一些关键且固定的部分,就应该像上述第 4 点一样,提前做慎密的代码构筑;而对于一些无关紧要或者经常迭代改变的部分,可能只有在达到了某种复杂程度后才需要去做代码优化。而为了找到这个平衡点,为了拥有判断哪些部分应该细致哪些部分可以随意的能力,除了多做游戏积累经验以外,似乎也没有什么提前学习的好办法——有一些坑不自己踩过永远不知道痛。所以,Make (and finish) more games!

关于编程,好像能说的也就这么多了,其实之后移植 Switch 应该会遇到一些技术上的挑战,不过因为 NDA 也无法写成文章,那就聊到这里吧。再附上这次项目使用了的 Unity 第三方插件列表:

1. DOTween Pro

用来处理所有的动画,有免费版,对我来说是做每款游戏必备的插件。

2. Odin Inspector

用于提高与 Editor 互动效率的效率软件,贵但好用,每款游戏都能用。

3. Dialogue System for Unity

用来处理所有对话和本地化,贵但好用,如果没有对话,我会直接使用 Unity 官方的 Localization Package 来做本地化。

4. All in 1 Sprite Shader

用来美化 2D 图片的视觉效果,不用自己写 Shader,省时省力。

5. LeanPool

提供 Pooling 相关的功能,省时省力。

6. Damage Numbers Pro

用于生成所有的文字反馈,有丰富的自定义功能,省时省力。

7. Text Animator

用来 Animate 一些 UI 文本,有预览,很直观,省时省力。

8. RIDEr

这不是插件,而是 IDE,用 Rider 写码可以说为我节省了一半以上的 debug 和 refactoring 时间,对我来说也是必备软件。

之后的开发日志将会聊到《诺亚》的其他方面,包括游戏设计。这次项目的主要挑战不在技术而在设计上,对设计感兴趣的朋友可以留意一下,应该近期就会发布了。计划中的开发日志系列如下:

1. 《诺亚的困境》开发日志#1:数独与方舟(关于原型与立项) - 已发布

2. 《诺亚的困境》开发日志#2:编程总结与回顾(关于编程) - 已发布

3. 《诺亚的困境》开发日志#3:设计总结与回顾(关于游戏设计与 UI 设计)

4. 《诺亚的困境》开发日志#4:氛围与声音(关于作曲与音效)

5. 《诺亚的困境》开发日志#5:海上的百年孤独(关于美术与世界观)

最后,我的第二款独立游戏《诺亚的困境》将会在下个月(2025 年 5 月)于 Steam 发售,现在加入愿望单可以第一时间收到发售通知噢。敬请期待!

(写于 2025 年 4 月 15 日)

* 本文为用户投稿,不代表 indienova 观点。

来源:老污年

相关推荐