《Gone Home》游戏的开发者 Steve Gaynor 在 Twitter 上分享了自己开发游戏时的「为了实现功能,而犯下的令人尴尬罪过」,其他游戏开发者们也纷纷来到这条推特下留言,分享了自己开发游戏时为了解决这些奇葩的 Bug 所开发出的「奇技淫巧」。

在写《Gone Home》的脚本程序时,只用了两个巨大的 Unity 图表,因为那时候我还不知道怎么把它们关联起来。第一个图表运行起来变慢了,我才用了第二个。

《Gone Home》游戏画面
《Gone Home》游戏画面(图片来源:Steam)

在做第一版的《Atom Zombie Smasher》时,我不懂怎么把文件分割开来,所以也是只用了一个巨大的 C# 文件。

《Atom Zombie Smasher》游戏画面
《Atom Zombie Smasher》游戏画面(图片来源:Steam)

我曾经游戏里写过一个 AI 宠物,几轮战斗之后,它就不想战斗了。原因是 AI 把自身写进了自己的敌人列表,几回合之后它的威胁值不断上升,就开始攻击自己了。

我曾搞过一个游戏扩展包,但是我把路堵死了,玩家无法进入这个扩展包的内容。

我的第一款游戏《Earthworm Jim 3D》没用编程语言来写。于是我在条件判断的地方,在空中放了看不见的洗衣机,来充当条件的定时触发器。Debug 的时候真的是噩梦。

《Earthworm Jim 3D》游戏画面
《Earthworm Jim 3D》游戏画面(图片来源:Steam)

在《Pirates of the Burning Sea》的一个任务里,需要点火烧掉一艘船。由于船只无法和火焰的粒子效果互动,而 NPC 可以。于是就在点火时弄了一个小小的 NPC 来点火。

《Pirates of the Burning Sea》游戏画面
《Pirates of the Burning Sea》游戏画面(图片来源:官方网站)

《Hot Tin Roof》里的转换平台其实是 90° 旋转的推拉门,垂直升降板和碾碎机也都是推拉门。

《Hot Tin Roof: The Cat That Wore A Fedora》游戏画面
《Hot Tin Roof: The Cat That Wore A Fedora》游戏画面(图片来源:Steam)

如果游戏开始时,玩家就在地面上,那游戏的物理引擎会出问题。所以我只好设定成玩家开始时在离地 0.01 个单位的地方,然后掉回地面。

做了个 VR CES 展台,玩家得坐在椅子中间,身体向后靠才能正常游戏。由于参展时间紧迫,没来得及做这方面的电路修改,所以每次一个玩家玩完,我们就得悄悄地调整椅子的位置。

在这个世纪初,内容生成工具总是要花费很长时间来编译和运行。于是我把程序重新写了一遍,运行得如闪电般迅速。那群人生气了,因为我揭开了他们的秘密。

《The Walking Dead: Michonne》里有一个十二行的对话,是我拼凑了其他场景里的对话,以此来修补剧情漏洞。

《The Walking Dead: Michonne》游戏画面
《The Walking Dead: Michonne》游戏画面(图片来源:Steam)

最近的一个项目里,玩家按下左键后,实际情况是游戏里除了玩家操作的部分,都向右移动了。

一家游戏公司,在给游戏角色做对口型的动画时遇到了难题,于是干脆在角色说话时,镜头转向不说话的角色。

《Baldur’s Gate》是在 Debug 模式下发售的,因为它一编译就出错。

《Baldur’s Gate》原作封面
《Baldur’s Gate》原作封面(图片来源:Wikipedia)

在《Seedship》里,处理单复数文本实在是太麻烦了,所以我干脆让游戏里的杀人数和幸存数永远不可能是 1 人。

《Seedship》网页版标题画面
《Seedship》网页版标题画面(图片来源:官方网站)

我在学编程时,不会用 for 循环,于是代码变得特别长。

做了一个足球比赛游戏,设定上如果你进入了比赛区域,比赛场上所有的活动敌人都会移除。但是我万万没想到,我把足球也设定成了敌人。这关没人能过。

《Scribblenauts》在发布前两天,我和一个程序员用 Google 翻译加了 5 种(还是 7 种?)语言,游戏的文本量并不大。

《Scribblenauts》原作封面
《Scribblenauts》原作封面(图片来源:Wikipedia)

道路渲染太困难了,就把渲染方法加了钝化。《Paratopic》里的汽车,其实是一把枪。

《Paratopic》游戏画面
《Paratopic》游戏画面(图片来源:Steam)

《Fable 2》里的狗不会转身,因为没有做动画。所以有时候这只狗想去某个地方时,会一直在转圈。后来这个 Bug 一直没有打算解决,大家都觉得「狗才会修 Bug」。

《Fable II》游戏画面
《Fable II》游戏画面(图片来源:Xbox)

在《Firewatch》的自由漫游模式中,我们想要加入时间流逝的效果,但是游戏本身的引擎并不支持。所以我们给亨利加了一个水车触发器,会缓慢绕着亨利旋转。

《Firewatch》中的森林场景
《Firewatch》游戏画面(图片来源:Steam)

《Aurion》的游戏文本只有一个 15000 行的 csv 文件,文本翻译后,游戏就无法正常更新了。

《Aurion: Legacy of the Kori-Odan》游戏画面
《Aurion: Legacy of the Kori-Odan》游戏画面(图片来源:Steam)

在《Getting Over It with Bennett Foddy》里,主场景的名字叫「Mian」。

《Getting Over It with Bennett Foddy》游戏画面
《Getting Over It with Bennett Foddy》游戏画面(图片来源:Steam)

我不懂怎么让枪头出现子弹的效果,只好让子弹生成在玩家屏幕中间,用大量的游戏特效掩盖。

在《State of Decay 2》里,我们无法给单个任务以外的东西设置变量,于是就给角色附加一些看不见的属性,来表征角色在任务中发生的事情。

《State of Decay 2》游戏画面
《State of Decay 2》游戏画面(图片来源:Steam)

早期的 Vlambeer 游戏里,要想让 Boss 随机登场,就在建筑物的屋顶上方的随机位置生成 Boss,让它掉下来。如果不巧从屋顶上摔下去了,那就重新生成一个。

有一个占位用的场景,弄了一只猫在里面。这样就不必找人来配音了,直接让我家的猫叫几声就好了。

我记不起游戏引擎里强制杀死角色的功能怎么实现,于是就给必死角色加了 100000 英尺的坠落伤害。

头盔和完整的角色面部总是不能很好地兼容,于是就把头盔能看到的面部给剪切下来,剩下的部分删掉。

想给角色加上恐怖片式的抽搐移动,但是不知道如何实现。于是弄了 2 套模型,让他们互相碰撞报错。

在《Drakensang》中弄了个「机智」的 AI,是用的「反向仇恨系统」,会优先攻击仇恨度低的角色。

《Drakensang》游戏画面
《Drakensang》游戏画面(图片来源:Steam)

17 岁那年做了个交互式冒险游戏,因为不懂得如何储存变量,就将信息保存在剪贴板上。

我想在游戏的关卡中加入陷阱地砖,不过没搞懂如何实现,于是就在那边放了一盏灯来困住玩家。

早些年做游戏时,我把我的《Dungeons & Dragons》角色给塞在了游戏文件深处。直到第一次编译游戏文件时,团队花了 20 分钟才搞清楚到底出了什么错。

《Dungeons & Dragons》主题图
《Dungeons & Dragons》主题图(图片来源:官方网站)