各位UE4开发同仁大家好!我们是Blazing Badger团队,一家位于德国法兰克福的小工作室。我们专为 Epic MegaJam开发了一款名叫《守卫者》(Guardians)的参展游戏。这款游戏荣获了“视觉糖果”和“Allegorithmic”奖,我们对此深感荣幸。Michael Allar玩遍了这场盛会上的所有参展作品,他建议我们写一篇类似“制作过程”的博文,所以就有了这篇文章!
项目起步
自从Blazing Badger团队于2014年4月成立以来,我们就着手开发我们的第一个项目——AIPD。在该项目最终收官之后,我们很高兴地看到Epic Mega Jam的到来——这为我们的游戏创作带来了极大动力。
第一天,我们迎来了一系列的头脑风暴,主题只有一个——“站在巨人的肩膀上”。最后,我们决定采取“双管齐下”的方法:我们要引入两个角色,一个是小潜艇,另一个是巨鲸,它们之间是共栖共生的关系(我们已经有两个不同的巨鲸雏形)。此外,我们还大量借鉴了经典游戏元素,我们将其喻为“站在巨人的肩膀上”。
我们最终决定制作一款类似于“Tempest”(由Dave Theurer原创)的水下游戏。这些工作很简单,一个星期内就能完成,场景中还有很多空间可以容纳一只巨型生物!
技术基础
即使是一款短周期的游戏项目,我们也想有一个坚实的基础,以便我们之后构建游戏流程并添加计分和结果界面等内容。
游戏被分解成众多游戏状态,并使用一个简单的状态机(State Machine)关联在一起。两个初始状态分别是“菜单”(Menu)和“游戏内”(In game),这样我们就可以立即着手实现核心游戏体验。之后,我们添加了结果界面以及计分界面。
由于不同状态之间的过渡很清晰,当特定状态需要数据和actor时,可以很方便地进行初始化和清除。这样,我们在初期就能玩上几轮游戏,而无须重新启动游戏。而这就是“客户”想要的“成品”游戏效果。
我们还设置了一个会话数据结构、一个永久数据结构和一些服务功能。会话数据中包含了“每个游戏内会话”信息,如当前得分。永久数据则包含了“终生”信息,如最高分。
我们的游戏设计师们可以使用这些数据结构来添加更多会话数据或永久数据,然后在每一轮自动清除会话数据,或是将永久数据序列化成游戏存档。
关卡生成器
我们的关卡是基于一个按程序生成的轨迹,这条轨迹则形成了一个虚构管道。所有游戏中的actor都沿着管道的表面移动。环境几何元素放置在该管道的外面。
和游戏的大部分环节一样,我们一开始并不知道能对程序式关卡生成器应用多少迭代和多大程度的精整。也就是说,我们要先将一些东西放置到位,需要的话就继续保留(其实扩展起来也很容易)。我们还必须确保游戏设计师可以很早就开始设计敌人的行为,因此我们必须非常快速地实施某些基本的关卡生成形式。
最重要的在于定义一个坐标系,即使轨迹布局发生变化,这个坐标系也不会改变。我们创建了一个系统,它会根据actor沿关卡轨迹移动的距离以及管道的角度和半径来呈现actor的位置。这样,游戏设计师就可以使用简单而统一的坐标来实施敌人的行为逻辑,而无须考虑最终的轨迹布局。我们还用了一个函数将这些坐标转换为actor变换值(在每个actor标记末尾执行)。
第一个版本的关卡生成器只输出一条直线,如果我们时间不够,那么只需保持现状即可。在经过了一些实验之后,我们得到了一个半径巨大的简单圆形,该半径由一些不同波长的较小正弦波所调制。换句话说,管道会很柔软地整体向右旋转,并在局部位置“随机”向上、向下、向左或向右移动。
为了放置环境几何元素,轨迹被分割成不同长度的分段。每个分段被指派了一个主环境几何元素(比如“墙壁”)来支配分段。其他的环境几何元素类型用于填充分段。我们时间不够,没法添加更多环境类型,但是只使用那些指定的资产就足以让系统运作良好。
玩家控制
玩家控制的实现相当简便而直接,就像实现《守卫者》的其他许多功能一样。由于玩家控制对于游戏体验十分重要,我们在这里添加了一些钟声和汽笛声:玩家的船会有一些短暂的加速或减速。船还会转弯和倾斜,但只是提供一种视觉效果,为的是营造紧密而直接的控制感。如果玩家的船绕着巨鲸旋转,摄像机也随之稍微倾斜,从而增强视觉和感觉上的动感。我们的团队还有一位“振屏”专家,他会在各种地方加入屏幕振动效果,使游戏更富有震撼力。
我们不想为游戏配备手册,因此我们将所有游戏手柄按钮都映射成“开火”,将所有方向轴线都映射成“移动”。因此,无论尝试怎样的直观操作,都不会有问题。键盘控制方面也是一样,我们同样将多个按键映射成“开火”和“移动”。
由于时间有限,我们决定为游戏手柄和键盘采用同一控制方案。但是,在看玩家第一次玩游戏的时候,我们意识到他们喜欢将游戏手柄的控制杆朝着左上方按,因为他们希望玩家的船能够处在管道的左上方。我们曾经就有这样的担心,其实我们之前就应该为游戏手柄设计其他控制方案。
摄像机
我们对摄像机的想法之一,是想让游戏动作位于屏幕中心位置。我们还想要体现出玩家的船与其巨鲸伙伴之间巨大的体量差异,同时也不能遮挡敌人在屏幕中的位置。
我们构建了一个小“工具”,可以用它来调整游戏中的摄像机设置,从而在美术效果和设计需求之间找到一个很好的平衡点。
当我们确定了一个很棒的摄像机设置之后,出现了一个问题。当玩家处在鲸鱼旁边(呈+/- 90度)时,摄像机视野十分“完美”,但是当它以0或180度飞行时,玩家的船就不在摄像机视野范围内了。为了解决这个问题,我们根据玩家角度在CameraMinimumPositionOffset和CameraMaximumPositionOffset之间加入了一个插值。
摄像机的最终移动方式如下:
这部分的蓝图如下(FishAngle为PlayerAngle):
为了在有限时间内展示玩家所处的不同状态,我们只能尽量做一些简单的效果。
我们通过在常规场景纹理和扭曲纹理之间混合调配来实现慢动作效果。我们使用了混合值而非0或1来切换后处理,因此可自动将视觉效果倍增。
其他后处理也采用了类似方式——死亡时会逐渐淡出变灰,当玩家沿着轨迹行进时,在非常昏暗的色调偏移值之间加入一个线性插值,以表示玩家所处环境的逐渐变化。我们本想在这方面多下点功夫……但愿下次能多分配些资源。
用户界面
在UI方面,我们希望做得既简洁又美观。必须看上去华丽而优雅,而且能够快速呈现。
确定使用哪种字体是最重要的一方面,因为好看的字体本身就能吸引眼球。我们最终确定了一种名为“Geo Sans Light”的字体,这种字体满足了我们的全部需要。
我们总共有三个界面。一个主界面,一个任务结果界面和一个计分界面。即使没有背景,优雅的字体和简洁的信息显示也能达到很好的效果,但是我们希望《守卫者》能够给玩家留下很好的第一印象。为此,我们加上了一个小菜单层。
在第一次游戏测试之后,我们迅速意识到在《守卫者》中很难瞄准,尤其是在轨迹不是直线时。我们解决这个问题的一个方法是赋予每个敌人一个构件,当玩家和敌人处于相同的管道角度(+/-角度公差)时,可以看到这个构件。
高效的敌人设计
我们决定制作三种类型的敌人。所有敌人都共享一个共用的父敌人蓝图,该蓝图用于处理生命值/死亡、移动以及注册/取消注册那个负责生成敌人的蓝图。这让我们在实际制作敌人时非常轻松便捷。
基本的“兵锋”敌人类似于“Tempest”类射击游戏中每秒钟都会出现的炮灰型敌人。这种敌人沿着管道壁一侧慢慢滑下来。
“躲闪者”能够承受更多攻击,经常担任吸引火力的滚筒角色。玩家至少需要攻击两下才能让它移动位置。
最后一种是“分裂者”,它会在几秒后分裂成两半。分裂出来的小敌人还会一分为二,如果玩家不予攻击,它最多可以分裂成四个目标。
另外,随着玩家在游戏进程中的不断深入,敌人的数量会变得更多,而且在某种程度上会更具攻击性。这样做的目的是提高玩家得分的难度。每种敌人都有一个参数会受到游戏进程的影响。“兵蜂”的最大下滑速度将会提高。“躲闪者”会滚得更远。“分裂者”的分裂速度会加快。
简化的AI设计
我们已经有了充当对手的敌人,现在要确保它们以正确的方式出现。我们的目标包括三个方面:敌人的生成位置应该“足够随机,但不能杂乱无序”。随着新敌人的出现以及数量的增加,敌人类型的分配也应该随着时间而变化。最后,敌人的数量应该慢慢地让给玩家造成压力。
在生成位置的方面,我们并没有使每个敌人的生成角度完全随机,而是每隔几秒确定一个新的“一般生成方向角度”,然后敌人的生成角度会稍稍偏离那个一般角度。这样将产生很好的成群出击效果,因此在游戏刚开始时,玩家每次只需要关注一个区域,而随着游戏的深入,不断出现的敌人将迫使玩家不得不注意所有区域。
生成计时器使用非常基本的公式来实施,该公式根据游戏开始后经过的时间量来计算“出现下一个敌人的时间”。通过使用一些常量,我们对生成时间进行了细微调整,使得游戏会话进程中的生成时间从“每隔几秒生成一个敌人”逐渐过渡到“每秒出现多个敌人”。
最后,我们对敌人的分配方式进行了简单处理,方法是在整个游戏过程中反复填入具有不同敌人分配方式的“敌人类”数组,随着时间的推移不断加入新敌人。每次要生成敌人时,系统将“重新洗牌”并随机选取一个项。
设计这类“敌人指派”系统是我们游戏设计师的专长。他们在各种本地会议上多次讨论过这个主题。有关详细信息,请查看他们在 slideshare.net上的演示说明。
音乐及音效
刚开始的时候,我们还不太清楚是否有时间为游戏做些音乐。因此,我们决定至少要制作出高品质的背景环境音效。在《守卫者》中,我们将五个不同的音效循环组合在一起,每个循环占据了频谱的不同部分,从而营造出深海环境音效。而程序也会随着时间推移对这些不同循环的混合进行调整,因此背景环境音效永远都不会完全一样。此外,我们还加入了很多单次音效,这些音效大约每分钟触发两次,从而减少环境音效的重复性。
《守卫者》的其余音效大多数取自商业音效库,我们还对这些音效进行了截取和混音,使其更加契合我们的游戏。幸运的是,我们找到了一些很棒的音效样本,使得巨鲸的效果更加逼真。我们一直想加入类似电影“盗梦空间”中的标志性号角音效,因此我们尝试使用了电影的号角音效,结果这个音效真的很适合作为“史诗巨鲸怪物音效”。
我们还制作了原创的游戏内音乐——一首简单的快节奏电子乐曲,以反复的和弦进行为基础。所有音效(不包括低音鼓)都比典型舞曲更柔和,为音效和背景环境音效腾出了空间。我们没时间制作标题/菜单曲目,但这反而变成了好事,在紧张的游戏操作与菜单界面的舒缓氛围之间形成了强烈对比。
环境美化
第一步是创建一个有关调色板和游戏视觉样式的情绪卡(mood board)。为了在很短时间内尽量构建出更多的资产,我们想让游戏保持简洁与风格化。
我们在引擎截屏上绘制环境概念图,这个截屏基于计划好的摄像机角度,并显示了潜在的资产、效果及颜色方案。我们希望关卡中的整个环境会发生变化,但是也不能丢失鱼群和海草等常量因素。这样,我们只需少量资产就可以创造出众多不同环境。令人沮丧的是,我们最终还是没有制作出预期数量的资产,我们只制作了岩石、藻类、海草和漂亮的光线。
为了制作动画效果,我们对藤蔓进行了UV处理,采用沿藤蔓高度走向的正弦波来制作动画效果。我们使用相同的UV渐变朝着藤蔓底部屏蔽动画效果,因此藤蔓的底部动得比较少。波动的方向和强度由集合参数控制,以便于对值进行细微调整。总的来说,设置过程非常简单明了。
为了让移动不是那么整齐划一,我们添加了一个基于纹理的偏移效果使之“遍历”整个游戏世界。另外,因为我们在生成关卡时使用了实例化静态网格,我们添加了一个基于“PerInstanceRandom”的随机动画强度变化效果——既然EPIC如此慷慨地提供了这个,我们没理由不用啊:)
巨鲸
巨鲸是一种巨大的类似古代鲸鱼的海洋生物,自创世纪以来就在海洋中遨游。海洋中充满了各类攻击巨鲸的凶猛生物,因此人类派了一支小分队来保护巨鲸,这条巨鲸可能是地球上最后一条了。
为了营造出古生物的感觉,巨鲸的身体中遍布发光的血管。由于玩家会围绕着巨鲸的头部飞行,所以这部分包含了各种形状和材质,以便其看起来有趣一些。第一个创意(但是后来被弃用了)还包括张开巨鲸的嘴巴(群体攻击),将其发光的眼睛作为生命槽。
以下是我们为巨鲸绘制的参考情绪卡:
最终概念图:
由于巨鲸的体积非常庞大,且可能会挤占大量屏幕空间,我们决定构建一个用于动画用途的简易绑定,而不是像其他大部分角色那样采用顶点动画。
玩家的船
船的外形取材于蝠鲼,不但与水底世界相配,还具有一定的个性。当然,蝠鲼本来就很酷。在对概念图进行精心设计后,我们制作出了一个粗制作品,以便尽快在游戏中进行测试。
敌人 – 邪恶机械水母!
敌人设计环节的主要目的在于使敌人在周围环境中很“显眼”。我们通过强烈的色彩和效果达到了这个目的。环境一直采用蓝色和青色,而敌人则采用了黄色到红色的对比色调,因此在一个画面中的颜色不会太多。我们还在机械水母上花了一番功夫,根据所需的动作类型对其采用了不同的顶点着色器动画方式。
总结
《守卫者》是一个非常有趣的项目。我们对结果很满意,因为它已经很接近一款完整的游戏。如果您花时间读完了我们这篇文章并体验了《守卫者》游戏,我们将不甚感激!虽然不能参加每一届游戏制作节,但2016年的Epic Mega Jam一定少不了我们:)
如果您还有其他问题,可以通过推特 @blabadger 或 fb.com/BlazingBadger联系我们
谢谢
Blazing Badger团队