=> GuardHei

Illusory Walls Ahead

F+ or Deferred? Which one should I choose?


Here we go again!

48小时,一款游戏

概述

七月份逛论坛的时候意外发现了国外的一个游戏开发比赛Ludum Dare,了解了之后才知道这是目前游戏界最长寿的比赛之一,至今已经举办了十来年了。再一看,8月11号的时候就有一场比赛,于是一拍脑袋就参加了。

机制

Ludum Dare每次比赛分为两个赛组,一个是最传统的Compo,另一个是现在比较流行的Jam。

CompoLudum Dare刚开始举办的时候就有的比赛机制,要求参赛人员独立一人在48小时内开发出一款符合当期比赛主题的游戏,其中除了代码可以使用第三方库以外,所有的音效,美工素材必须都是在这48小时内有参赛者制作出来的。

Jam是目前大部分游戏开发大赛都有的机制,要求一个不大于4人的开发团队在72小时内开发出一款符合主题的游戏,素材可以酌情使用免费的第三方素材,但是必须注明。

很明显可以看出CompoJam要难上不少。事实上,每次作品提交数量统计,Jam的参赛作品数量基本上是Compo的1.5~2倍。而且Jam的作品往往有更好的卖相。

由于我只有一个人,所以第一次直接就挑战了Compo组。

# 比赛过程

确定主题

每一期比赛都会让网友提交一些主题,然后一轮轮票选出最终的比赛主题。我一开始提交了一个Fragile的主题上去,竟然莫名其妙的到了最后一轮,不过很可惜,最终出来的主题是Running Out Of Space。

这个主题有不少中结构方法,当天就有人发了个帖子提供了三种最常见的思路:

  1. 一个不断缩小的物理空间
  2. 电子产品的存储空间不足
  3. 跑出宇宙

我一开始不太喜欢这个题目,因为可供切题的点不多,基本就是这三种,很难有什么创意。最开始我的构想是一个无尽奔跑的游戏,同时还会有一个以玩家为中心,不断缩小的圈子,玩家需要把自己在圈子缩小到不能忍受前把自己抛出去。但是这个机制有些细节方面不好敲定,同时我个人也觉得没什么创意,所以就搁置了。

大概半个小时后,我啃着早餐,脑子里突然就有了灵感,决定做一个白细胞抗击癌症的游戏。游戏的本质是一个俯视视角的双摇杆射击游戏。大概机制如下:

  1. 玩家扮演一个白细胞,在人体内有限的空间里活动
  2. 每过一段时间一些肿瘤细胞会在这个空间里形成,妨碍玩家的移动,还有一些肿瘤细胞会不停生成病变的细胞进攻玩家的白细胞
  3. 玩家可以射出淋巴细胞消灭肿瘤细胞和病变细胞
  4. 玩家也可以使用化疗清除全场的病变细胞以及玩家周围的肿瘤细胞,同时玩家自己也会收到伤害
  5. 玩家的健康值低于0即游戏失败

大概就是这么一个思路,其中Running Out Of Space的体现就是肿瘤细胞会不断填充有限的空间,如果玩家不消灭这些肿瘤的话,最后就会无路可走。

当然了游戏是用Unity引擎做的。

游戏特点

确定好主题直接开干。我非常清楚我这个主题不算特别的创新(事实上最后也有不少的双摇杆射击的游戏,但是一般都是人为的缩小空间,而不是还能提供个合理解释的),亮点只能在美工和操作上面找。  美工方面我一开始就决定了走3D的道路。我知道我自己不怎么会建模,但是比起2D的像素画,简单的3D几何体配上合理的色彩搭配更有感觉。所以基本上美术风格就确定了,低多边形风格的角色模型。我当初还想用MagicaVoxel建一些简易的模型,后来发现时间实在不够,直接用立方体块代替了😂。

操作方面就是一个大学问了,不过幸好这段时间一直还在开发另一款项目,里面就有一些射击武器手感的制作,我稍微总结了一下,大概是这几点:

  1. 武器收到后坐力影响的变化 – 位移与旋转
  2. 后坐力导致的屏幕震动
  3. 武器射击的音效
  4. 细胞被击中的停滞
  5. 细胞被击中导致的反方向冲力
  6. 细胞被击中溅出的血,当然这里应该叫做细胞液 /斜眼笑
  7. 细胞溅出的血(细胞液)在地上或者墙面附着
  8. 细胞死亡时的爆体效果

我不可能详细说明每一点我是具体怎么实现的,但是会把大概思路提供一下。顺便一提,下篇博客我大概会讲解一下血迹在物体上附着的实现。

技术实现

下面就说下上面每个点是怎么实现的以及其他的技术准备:

  1. 并没有使用动画。动画一个最大的问题在于不方便调整参数,如果觉得后坐的距离不合适,调整得到专门的界面,不够快捷。而且我也不想使用动画状态机,因为这意味着性能的降低以及引入一个新的部件。最后我是使用协程Coroutine来解决所有的动画的。这样只要暴露三个参数在Inspector上:后坐时间,后坐距离,后坐抬角,就可以轻松的实现更改。当然问题就在于写一套这个方案还是有点费事的,并且需要手动处理细胞被销毁或者回收时候对协程的暂停。
  2. 游戏里的相机直接使用了Cinemachine进行管理,当然最后结果有点问题,有时候镜头会瞬移,估计哪里设置没调好,不过不是恶性bug,触发几率也不高。撤回话题,Cinemachine新出了一个preview的功能,就是Impulse Module。正好也是之前那个项目碰到了,所以写好的工具类代码直接挪过来用,省了不少时间。
  3. 后面音效部分统一讲
  4. 对于病变细胞,我是使用preview的Navigation Set寻路移动到玩家位置的,所以就是将细胞的NavMeshAgent直接在一段时间内的velocity设为0。我一开始还想做被击中时身体向后倾仰的效果,但是发现会在因为这不是寻路导致的倾斜角而被NavMeshAgent给覆盖,也就没时间找替代方案了。
  5. 和4的解决方案类似,给NavMeshAgent的velocity赋一个子弹前进方向的速度。当然方向的三维矢量标准化之类的你们自己酌情加上。
  6. 这个是直接使用粒子效果的,一次emission。值得一提的是我把血液也做成小立方体,保证美术风格的一致性。另外,着色器使用的是Alpha Blend的混合模式,能体现血液的一定透明性,更像液体。
  7. 具体实现是可以讲一大章的,简单来说用一个没有shape,没有emission,没有velocity,没有duration的粒子系统来渲染所有的血迹,这样做的好处是可以自动GPU Instancing,渲染效率极高。然后一个血迹用一个Alpha Additive的平面网格Quad制作,根据溅到地方表面的世界空间法线调整朝向。
  8. 这个我还是用了一个挺傻的方法做的。手动用n个带刚体和碰撞盒的立方体搭一个通用的爆炸模型。在细胞死亡的时候把原来的模型用这个替换掉,然后施加一个Explosion Force

最后要提一下,为了保证效率,所有的细胞,粒子效果,爆炸效果都用了对象池管理,提高性能,所以在设计的时候就得考虑到物体的初始化和状态回收的问题。

音效

嘿嘿嘿,这大概是每届比赛最好玩的地方。在比赛前我就意识到了这个问题–不能像以前那样用免费音效了。我找了一些可能的解决方案都失败了,包括srfx这种简易的8bit风格音效制作器和wwise这种商业级别的声音引擎。,不是太简单就是太复杂。

后来我意识到我应该从日常生活着手 /斜眼笑,然后搞出来了:

  1. 射击的音效因为考虑到主要体现的是子弹快速飞出去,所以需要一个破空的声音,这玩意儿不是很好制作,我试了快速挥裤子/T恤/枕头,最后发现抖毛巾的效果最好。
  2. 血液的效果主要在于那个汁液飞溅的感觉。我看很多人说是录什么切橙子的声音,然而家里没有,最好我拿了一个吸管插到一瓶半满的芬达里(一定要是半满!这样才有嘶嘶的空气声),吸了一口,然后发现这个效果非常棒。
  3. BGM我还是比较拿手的,GarageBand上面开搞,3个小时搞定。灵感来自生化危机的主题曲吧,用了日式的筝琴,风格有些诡异的感觉。

其他

这些搞好之后已经第二天了。然后又陆陆续续地制作了几种敌人的攻击方式。一种是自爆,还有一种我称之为凑到跟前转转转,都是协程做的动画,耗了不少时间。等到这些都搞好了,大概是晚上11:30左右,距离6:00提交作品还有六个半小时。但是我突然意识到我还没有做任何UI界面,也没有做杀敌统计,结束界面,玩法介绍等等的东西。最好赶紧糊了一个ui上去,除了血条以外就是简单的Text,然后配色调成和游戏统一的。最后再用ppt出几个艺术字做为按钮(什么重玩,退出之类的),当然也出个logo。这些都搞好已经凌晨1点了,游戏操作介绍是不可能细搞了,直接在开始界面左侧贴一堆文字上去,简单粗暴。然后构建项目。。。然后电脑就崩了!还好之前记得保存了,打包好项目开始上传作品。

提交

由于第一次参赛,没有想到提交是一个相当耗时的流程。首先需要你先一个简介,为了让我的游戏看上去吸引人,我忍着睡意写了个快3000词的介绍,包括玩法,机制以及一些开发心得(事实证明玩家还是很乐意看的)。然后自己再玩几把游戏截图扔到网上,同时再查一遍bug(虽然后面又冒出了不少)。由于Ludum Dare自己不提供游戏的存储服务,我还得另找一个网站存。我用的是比较主流的Itch.io,然后花时间把这个网站上的界面再编辑一遍。这个时候已经凌晨2:30了。我开始把源码往GitHub上面传,然后项目有点大,GitHub连接又不是那么好就一直卡在30%的进度。后来实在等不了,把项目直接打个zip包扔到Itch.io上去了。最后我终于可以睡觉了。

事后

第二天一起床就发现被人@了,然后意识到我没有把我的Itch.io页面设置成public。还好才是评比开始的第4个小时,赶紧设置回去。

然后又被不少人吐槽了各种各样的问题,包括震动的有点过火了以及奇怪的移动方式(其实是个bug)。不过大部分人都对音效和画面表示比较赞,基本上积极的还是比较多的。

游戏名叫Bloody Cell,来源是英国佬的Bloody Hell。

前几天修好bug后把源码又传上了GitHub,顺便贴下相关链接,logo和游戏截图:

Ludum Dare作品页面 Itch.io游戏页面 GitHub源码

logo screenshot1 screenshot2 screenshot3

总结

  1. 时间确实蛮赶的
  2. 一定要尽早确定游戏的特点,后面是不可能有时间增加特性的,只有减少特性省时间的
  3. 音效一定要发挥你的创造力 /斜眼笑
  4. 代码看能不能使用现成的,毕竟是规则允许的
  5. 不要想着飙技术,没有时间的
  6. 不一定要特别创新,但是得让玩家操作的舒服
  7. 提交一定要预留充足的时间
Recent Articles

在Unity中实现场景中动态血迹效果

概述 上一篇博客聊到了关于如何制作溅出的血迹附着在场景上的效果。大概效果参见下图: 上面这张图上可以很明显看到红色和紫色的血迹在地上遗留,这次主要就是要实现这个效果。问题那实现这个效果主要有哪些问题需要解决呢? 如何以较低的成本获得不同的血的形状? 如何知道血迹应该放置在哪里? 如何使血迹能贴合地附着在物体的表面 如何有效率地绘制大片大片的血迹实现一个可能的做法(但是很明显不是本篇重点)如果是以前做过fps游戏的读者可能看到这个问题第一反应是直接把血迹贴图画在物...…

UnityContinue
Earlier Articles

Unity优化——渲染与画面(一)

概述 游戏做出来后结果只能跑20-30fps无疑是令人悲伤的,所以游戏优化显得非常重要。最近我也在对这就是IB这个项目进行优化(虽然项目才在一半不到的开发进度),有了不少感慨,这里可以拿出来探讨探讨。我真的有必要优化吗?优化是一个费时费力的事(大部分情况下),于是不少开发者只要看到运行效率只要不是不能接受就忽视了优化这个环节。某种意义上来说,过优化确实是不必要以及有害的,会大大地降低了开发效率。但是在很多情况下,虽然目前表现尚可,但由于代码安排得不合理,很有可能在后续的开发过程...…

UnityContinue