我用 21 天开发了一款自己满意的作品

聚光灯 Game Jam

大家好,我是 Agoo,一个用业余时间做独立游戏的开发者,尤其喜欢解谜游戏。

最初决定参加“聚光灯 GameJam”完全是因为比赛有奖金,而且只要完赛就有奖金,这太吸引人了。报名的时候,只是想着做个小游戏参与一下,结果题目(Light)揭晓后,灵感爆发,冒出一个“天才般的”叙事设定,就想做一款采用实时像素风光照的、重叙事轻解谜的游戏。至少在当时想到的时候,我都佩服我自己。当然,最后项目的走向完全背道而驰,变成了一个重解谜、零叙事的游戏,O(∩_∩)O。

不过最终版本我还是很满意的,因为它的解谜很有趣,我太喜欢了。我还有好多想做的关卡没时间做,还有几个机制没能实现出来(比如黑光机制有个严重的 Bug,会导致游戏崩溃,最后只能当成装饰使用了)。可惜了当初的叙事设定,我觉得它非常符合这次的比赛主题,未来如果继续开发《光注》,可能会再加回这些设定和叙事,虽说这块不是我的强项。

第一周(10 月 8 日-10 月 14 日)

这周所有时间基本都用在做像素光照上,真是程序员思维,上来就想直接写代码。由于所涉都是技术相关,所以非常顺利,毕竟是自己的专业。其实有做像素光照这个想法,是因为我很早就看过一些文章,不过不是关于光照的,而是 2D 视野计算的——当时就觉得效果很酷,只是平时开发基本用不上。等看到这次 Game Jam 主题是 Light,这不撞枪口上了嘛,马上就把文章翻出来学(chao)习(xi)了。


1. 计算光照区域

既然需要用光照来解谜,那不如自己实现光照吧,毕竟通过传统光照算法不好去控制和获取光照实际照射的区域。

你知道吗?其实计算光照区域和计算视野是一个意思,那么按照程序员的传统美德,我找到一个巨人的肩膀了(俗称复制代码,肩膀在这《2d Visibility》),很快在 Unity 实现了如下效果。

图片

 感谢巨人,这个肩膀还挺结实的


2. 制作场景

做 2D 独立游戏场景,我推荐 LDtk 关卡编辑器,是由《死亡细胞》(Dead Cells)的开发者构建的(可以算是进击的巨人了)。

第一步:先把 LDtk 的示例场景导入 Unity。

图片

 这是 LDtk 的示例场景,不是我做的哦


第二步:把场景的阻挡格子转为阻挡光照的线段。

图片

 这个线段还可以优化下


最后一步:把光源丢进去看看。

图片

感觉还不错


3. 实现遮罩

第一步:用光照结果生成一个 Mesh,然后将这个光照 Mesh 渲染到一张 RenderTexture 中,再用这张贴图作为遮罩去渲染场景。

图片

 效果出来了


第二步:给光源加点参数,包括灯光颜色、光源半径、光的强度等,再加个圆形的平滑遮罩,完美!

图片

 有点恐怖是怎么回事?


第三步:再加个光源看看。

图片

 光源叠加的部分会更亮


4. 加上像素风后处理

首先,给摄像机加上 PixelPerfect,然后再加上像素 Dither 效果,像素感直接拉满。了解 Dither 技术可以看这里《Retro Dither Effect In 2 Minutes》,需要科学上网。

图片

 光源过渡的地方添加抖动渐变效果,建议放大看看


5. 光照残留

考虑到如果场景全黑,玩家探索起来会很困难,所以我设计了光照照过的区域会“残留”下来,类似战争迷雾的效果。当光源不再照射时,这些区域不会完全变黑。

实现方法基本参考了战争迷雾的实现,就是把光照区域渲染到一张贴图里,但渲染时不清理贴图,这样就能保留光照的“残留”效果。

图片

 如此一来,玩起来就简单多了


6. 聚光灯

“聚光灯 Game Jam”怎么能缺少聚光灯呢,这不就来了。

聚光灯的特性是角度越小,光的强度越高,照射距离也越远;相反,角度越大,照射范围越广,但照射距离较短。

图片


7. 光照检测

终于到了这一步。

整个光照系统的实现是为了方便检测不同地方的光照强度和颜色等。要做到这一点,需要从光照贴图里获取信息,也就是说,在生成光照贴图时就需要把必要的信息写入贴图中。

看下图,角色头顶的光注条会实时显示光的强度和颜色。当被多个光源照射时,强度会增加,颜色也会叠加。这与解谜玩法紧密结合。

图片

 谁不喜欢成为聚光灯下的主角呢


第二周(10 月 15 日-10 月 21 日)

这周是最痛苦的一周。我先实现出剧情系统,以及一些简单的谜题机关,然后想着要赶紧做关卡了。结果不出意外,玩法一点都不吸引人。我发现自己做不好强叙事:个人没有制作美术和音乐资产的能力,叙事时经常找不到合适的素材,单靠文本来叙事太单薄了,而且轻解谜也十分没意思,没有让人玩下去的冲动。

这周的后半基本都在思考玩法,想了好多,都有这样那样的问题。加上时间紧,我知道如果这周还不能把玩法定下来,最后一周基本不可能把游戏做完。

当时每天都很焦虑,我甚至开始和 AI 聊天,把我的现状告诉它,问它有什么玩法建议。不出意外,AI 的回答非常敷衍,来来去去都是那些最简单、最笼统的玩法。不过在第二周最后一天,AI 的其中一个回答里提到了光线接力,我沿着这个思路往下走,答案就是现在的《光注》了!


1. 寻路系统

由于最初的想法是强叙事,设定上会有一名同伴跟随着玩家,所以做了寻路和跟随系统。结果《光注》的实际玩法和寻路可以说有天然冲突,所以这个系统最后完全没用上。

图片

他叫塔普,设定上会一直喋喋不休的


2. 剧情对话系统

要做强叙事,当然要有对话系统,我之前做《mota24》时用过 Yarn Spinner,这次也沿用了之前的系统。可惜最后成品是零叙事的——主要是玩法的原因,《光注》的机制需要不断切换角色,这导致关卡流程中几乎无法叙事。

图片

可怜的塔普,最后成了一个普通 NPC


3. 和 AI 聊天

下面是和 AI 聊了挺久之后,AI 给出的一份策划案,有需要的拿去,哈哈。

图片

第三周(10 月 22 日-10 月 28 日)

这周是最耗体力的一周。

在想到接力玩法后,我快速做了一个关卡出来,结果非常好玩!它的解谜要点很独特,有点推箱子的感觉,玩家必须时刻关注角色的位置。一些看起来非常简单的操作,在《光注》里就可以做成很有意思的谜题。

例如下面关卡演示视频中的 1:47 附近,玩家的目标是操控一个角色踩在机关上把门打开,另一个角色走进去。但由于玩家一次只能控制一个角色,且切换角色时双方之间不能有阻挡,这就要求开门的角色必须借助其他角色或者机关把光传递给门外的角色,最终完成谜题。


图片

最后,这个关卡几乎原封不动放在游戏里了

(B站视频:BV1dH1cY2ELc)


回头来看,这一周真是灵感爆发,想到了很多有意思的谜题和机制。可惜受限于时间,只实现了其中的一部分。由于玩法是第二周最后一天才确定的,所以还需要花很多时间去开发与玩法相关的系统,基本是一半时间开发,一半时间设计关卡,时间太紧了,以至于只能压缩睡眠时间。我到这才理解为什么会叫做极限游戏开发。

这周没时间写开发日志,但考虑到完赛奖,咬咬牙还是录了 2 个关卡实况,φ(゜▽゜*)♪。


一些关卡截图

图片

教程关卡之一


图片

N 多柱子关


图片

灯塔关


最后一天

结束前一天,还天真地想着最后一天可以再做 2 个关卡,结果当然是没时间,因为要做完赛清单啊。整理用到的素材花了不少时间,因为我都是东拼西凑的用,而且自己也做了一些修改,要把素材翻出来对比下。还要做个宣传片,这真的有点难为程序员了(为了完赛奖)。最后看了《10 分钟学会达芬奇》,硬把宣传片剪出来,其中只用到 3 个技巧:剪、过渡、加字。

图片

速成宣传片


写这篇文章时,其实离比赛结束还有几个小时,还要再做一关吗?还是放过自己,就接受这是游戏的最终模样吧。因为我觉得游戏已经还不错了,静待最后的结果就好。


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