《En Garde!》是一款用UE4制作的传奇动作游戏原型。在梦幻般的十七世纪场景中,玩家将化身暴躁的女剑士Adalia de Volador,用高贵的击剑方式战斗,捍卫家族荣耀。
请访问https://engarde-game.com/下载游戏,并阅读相关内容以进一步了解游戏!
(本视频转载自YouTube:视频原址)
项目是如何开始的
《En Garde!》最初是为毕业项目提交的游戏概念,最后被选中。在开发游戏之前,我们最初的想法是创建“传奇视频游戏”。我们希望从各种影视作品的比喻中吸取灵感,然后在游戏中重新解读这些比喻。灵感来自于很多作品,比如《佐罗》、《三个火枪手》、好莱坞黄金时代的埃罗尔·弗林影片、甚至《加勒比海盗》等当代作品。我们在开始这个项目之前还不太了解这一类型,但是我们很快了解到,传奇精神与许多人共有的幻想产生深深的共鸣。这类题材拥有悠久的历史,尤其是在法国。
市面上有很多海盗游戏,但我们发现没有真正的传奇动作游戏,至少在经典的“火枪手”世界中没有。所以某种程度上来说,这个题材在视频游戏中没有得到很好的展现,我们觉得潜力巨大。

设计
《En Garde!》是围绕着玩家的幻想概念设计的。我们希望玩家化身为一个英勇大胆、足智多谋的女剑士——让他们真正感受到传奇色彩。为了在开发过程中忠实于这种精神,我们需要一些准则。我们必须将愿景转化成文字。我们围绕着三大支柱构建游戏:剑术精通、即兴而作和高贵优雅。“剑术精通”不言自明,即游戏应着重强调剑术。虽然基于这种游戏氛围和愿景,我们也知道不能只是创建经典的击剑对决。我们忽略了现实生活中的击剑复杂性,倾向于更简单直接、精心设计的形式,加入了很多潇洒时尚的动作、躲避和技巧。
剑术精通概念还关乎玩家将会遇到的对手。在我们的游戏中,有许多笨手笨脚的低级守卫,注定是要折服于女英雄的超高剑术之下。而另一方面,游戏中的队长们都是很独特的对手,各自有不同的战斗方式。自负型对手会与主角一对一对决,叛徒会找援军,而懦夫会像捉迷藏一样让主角追逐。

第二个支柱“即兴而作”包括女英雄的足智多谋、发现环境和不断适应新的战斗情景。还关乎你在游戏中可以进行的所有环境互动尝试。这个支柱扩展了不可预测性的概念——我们对系统性游戏感到很自豪,我们希望创建多组系统性元素,它们相互结合产生令人惊讶的结果和自然发生的情境。我们觉得这是将部分影片打斗场景的无限创意转化为互动形式的最佳方法。
第三个支柱“高贵优雅”指的是以一种轻松娱乐的方式,带着骄傲、风格和仪态进行战斗。主要是为了让战斗场面宏大壮观。高贵优雅的概念主要通过游戏氛围来传达,但我们也希望Adalia的智慧能通过一些游戏中的妙语和讽刺体现出来,所以我们实现了“妙语”机制。
我们在进行游戏构思时始终谨记这个构想。我们优先考虑能够强化幻想的构思,或者用全新的方式来扩展构思。
大家可以观看我们的Gamasutra采访来进一步了解《En Garde!》的设计和创意方向。

艺术和风格方向
艺术方向必须能够传达出冒险精神和大场面感觉,同时表达出经典传奇故事的轻松基调。西班牙黄金时代就是非常适合包含华丽角色、阴谋和击剑战斗的故事的场景。那是一段充满财富、极度奢华的时代,但也是一段社会不公的腐败时代——非常适合于一名贵族女性以荣耀和公平之名对抗恶人。环境设计灵感来自于Mudejar风格,以独特方式融合了欧洲文艺复兴和摩尔式风格,常见于安达卢西亚。
但是,我们的游戏讲的是传奇冒险,而不是历史。所以虽然历史参考可以构成坚实的基础,但我们是透过文学、戏剧和电影的浪漫主义镜头展现游戏世界的。为了反映这一点,我们选择了戏剧化照明和梦幻般的色彩。我们的灵感来自于插画和艺术的黄金时代,如N.C. Wyeth,以及更现代的创作者,如梦工厂的Richard Daskas。

传统的Mudejar建筑和装饰非常华丽,所以我们决定简化处理。我们对环境和道具进行细微的风格调整,让它们有更清晰可辨的形状。纹理也同样经过精心处理,其可见度刚好够呈现场景,表明是不同的材质。环境应该能显示出场景设定,同时在混乱的战斗中保持清晰可见。

我们对角色也运用了这个简化的过程和捎带讽刺的意味。我们还简化了基本形状,只保留了需要的最少轮廓,然后基于此进行构建。面部经过极其卡通的怪诞风格的相对处理,彰显人物个性,然后再恢复为我们所寻求的半现实主义程度。

尤其是Adalia必须具备游荡剑客的个人风格,但我们希望能更突出一些。为她设计一种强烈且稳定的个性是帮助我们定义她的服装设计、动画和妙语的关键所在。我们还希望显示出她过去曾有过冒险经历,所以确保为她设计具有实用价值的中性风衣着。
技术美术
我们团队中只有三名美术,没有人专门从事环境艺术,所以必须要找到能够让我们节省时间快速迭代的工作流程。作为学生项目,我们的项目始终在变,因为我们从老师、试玩玩家和其他学生那里会获得很多反馈。材质分层
对于环境材质,我们决定使用材质分层系统。我们的灵感主要来自于《Paragon》。我们创建了一个材质函数库,每个材质函数都有一些通用材质(石头、大理石、木头)和一些非常基本的选项(例如平铺或着色)。它们在主材质中以低分辨率遮罩纹理混合(通常是128*128或64*64)。
我们在一种纹理中使用了划痕、污点和AO遮罩,以便在某些道具上增加一些气候作用的效果(同样,非常类似于《Paragon》)。顶点着色用于按资源实现特定效果(如尘土、轻微的位移等)以中断重复性。我们使用贴花实现更特定的效果(例如漏液或裂痕)。

该工作流程还改进了我们的迭代时间:通过该系统,我们只需一键单击就可以在整个游戏中更改一种材质。随着项目的进行,项目在不断演变,有时我们需要重新制作一些早期资源。
对于角色,我们决定使用自定义着色器以掌握更多控制权,因为它们需要更具体的与游戏有关的函数(如高光、头发和衣着着色器)。
观众
为了支持游戏的大场面主题,我们想要添加游戏内观众。在每一个房间里,阳台都有一些游客在观看打斗,并对玩家的动作做出反应。我们最初使用简单的骨架网格体,但对性能影响过大。因为他们离玩家非常远,所以我们决定用一些动画图像序列视图。为了呈现3D感觉,在《战地1》技巧的启发下,根据查看视角,我们播放一行不同的图像序列视图,这个视图是从3D模型的不同角度获取的。

我们使用了一些运动向量来增强插值,这样就可以减少总帧数和纹理大小。最后,着色器成本有点高,但观众只是一些实例化的四边形,所以对于有大量角色而言,整体成本已经是最低的了。这对于我们来说是合适的解决方案,因为同一个角色模型只有一种动画。对于更复杂的群众,我们使用了3D着色器动画或实例化骨架网格体。
照明
照明也是一大挑战。我们希望呈现西班牙南部的温暖色调和冒险故事的童话氛围。利用环境是战斗的一大元素。由于大多数道具都是可以移动的,因此大部分光源也需要能够移动。当然,出于性能原因,完全动态照明不在考虑范围内。在进行一些调整后,距离场和间接阴影效果不错。让环境呈现一种柔和的阴影效果——正符合我们对柔和照明和梦幻般氛围的期望。
一个重大难题在于,我们没有想到要在一个关卡中混合室外和室内照明。很难设计出一些照明设置,能够在任何地方实现令人满意的结果。为了达到我们需要的结果,我们为户外设置了定向光源和天空光照,主要依赖后期处理来为每个房间实现独特的视觉效果。更改眼部适应和环境光遮蔽设置也帮我们定义了富丽堂皇的大厅和阴郁的图书馆之间的氛围。

我们在处理照明时必须进行大量的调整。我们学到的一个重要经验是“该伪造就伪造”。换言之,很多光线是没有来源的,或者是为了夸张反射光线,引导玩家注意关键元素。例如,在某些游戏房间,太阳射线来自于所有方向,或者训练区域的关键元素(来自天花板的阴影)与3D模型的真实阴影不相符。

动画
动画是一大挑战,因为我们需要在几个月内创造具有攀爬和跳跃系统的格斗游戏。我们最初创建动画蓝图时包含了与游戏有关的所有基本功能。最初,我们有一些占位符动画,用于表示角色可能执行的每一个动作。之后,我们逐渐添加了一些精修动画,并在需要时添加一些过程动画(比如依靠和加速)。一切运行起来后,我们就看到应该优先考虑哪些功能。设计师可以在蒙太奇中使用占位符动画来调整时间;当他们感到满意后,可以将确切时间提供给动画师,然后动画师制作最终动画。
由于我们没有时间为每个角色创建动画,所以所有角色都共享具有相同比例的相同骨架。动画师使用通用角色制作动画,然后在虚幻中为角色特定元素(如头发和衣着)添加一些程序动画。例如,Adalia的头发在马尾辫中包含三个骨骼以形成全局结构,一个以蓝图驱动的自定义置换材质以提供更有弹性的感觉,以及一些丝带上的布料模拟来提供更自然和不可预测的视觉效果。

蓝图、挑战和解决方案
我们的游戏几乎完全是用蓝图制作的,唯一例外的是角色运动组件,我们对此进行了扩展来更多的控制根运动。蓝图脚本太棒了,功能太强大了。我们唯一需要解决的问题就是不能像合并两段代码一样合并蓝图。为了能同时工作,我们依赖继承,并将很多游戏逻辑放在组件或函数库中。这样我们就可以轻松地并行处理多个任务。
跑酷系统
为了让玩家能够完成一系列毫无难度的杂技技巧,我们创造了自动化跑酷系统。在冲刺时,角色能够自动跳过障碍并在台阶之间跳跃穿行。我们使用了混合空间来创建自适应跳跃动画(取决于间隙大小)和动画通知,以便能够交换双脚实现每次连续跳跃。

我们的AI角色也可以使用跑酷系统。在使用跑酷时让AI角色理解他们可以使用的路径是很棘手的。为了克服这个难题,我们在寻路网格体生成设置中将“代理最大步骤高度”(Agent Max Step Height)增大了一米。因此在以下截屏上,您会看到桌子没有切断寻路网格体。换言之,这样AI就能计算路上是否没有任何障碍。

这种技巧唯一需要注意的是,敌方不能绕过桌子,必须始终是爬过桌子。由于这样效率太低,让他们看起来很不智能,所以我们在可攀爬障碍物上添加了寻路修饰符。这通过截屏上的橙色寻路网格体来表示。这是为了告诉AI进入并穿过这个体积会产生更高的距离成本。通过寻路修饰符,如果爬过桌子会比绕过去更加高效,那么AI只会爬上桌子。
最后,我们在地图上手动放置了寻路链路,这样敌人就知道在不同的寻路网格体部分之间,他们需要进行长距离跳跃的位置。
虚幻引擎能够在运行时重新计算寻路网格体真是太棒了,因为我们有很多障碍物可以被玩家移动。
另一个很有挑战性的任务是制作能够模拟物理并四处移动的物体,同时允许玩家移动这些物体和战斗。体验过物理功能的人应该都知道,只要踩上模拟物体就会开始以疯狂的速度在地图上乱扔东西,包括角色。
为了解决这个问题,我们将每个模拟物体的碰撞翻了一倍,两个碰撞形成父子关系。父碰撞模拟物理,不会与任何Pawn碰撞。而另一方面,子碰撞只会与Pawn碰撞,但由于不模拟物理,而只是跟随父碰撞,所以我们得到了所需的结果。
从角色的视角,就像任何其他移动平台一样,但从我们的视角,我们会看到因为物理模拟而产生的所有复杂的运动和摇摆。
摄像机、角色和控制
我们构建了多种系统,让控制尽可能达到用户友好、方便使用的水平。例如,我们为角色创建了一个障碍躲避系统,这个系统会重定向玩家的输入。在以下GIF上,一直向前推着运动L摇杆。输入的重定向方式是尽量避免被墙壁阻碍,同时也避免意外地从间隙中跳下去。

随着游戏的扩展,我们开始有大量的角色状态需要记录。为了减轻工作,我们创建了下面显示的函数。这个函数负责处理新状态的任何请求。首先,它检查是否允许角色进入该状态,否则角色将被废弃。然后根据多个条件,检查该状态是否应该被另一种状态覆盖。该函数是递归的,所以可以自行覆盖多次。

该函数的一种使用示例可以在任意攻击结束时显示出来。在其他代码部分中,我们只需请求恢复为闲散的Guard状态,而不用进行其他检查。有了这个函数,如果没有剩余任何敌人,Guard状态就会自动被Jog状态覆盖。如果玩家按住Sprint键,Jog就会被Sprint覆盖。最后,由于冲刺允许跑酷,所以如果检测到可攀爬障碍物,Sprint状态就会被Climb覆盖。所有这些都是在一帧内发生的,让我们总是能在脚本中的任意位置调用默认闲散状态,如Jog的Guard。该函数将请求的状态替换为更合适的状态。
AI行为
对于AI脚本,我们自然使用了UE4行为树系统。为了让格斗体验令人满意,我们一起精心制作了守卫的格斗行为。我们限制了对抗Adalia的最大敌人数量,以防止玩家触发所有关卡的守卫。对抗玩家的敌人会动态切换角色。活跃敌人会更接近Adalia,而且是唯一攻击她的敌人,而被动敌人距离较远,只能观看战斗。他们的攻击决策会进行协调,不会让玩家感到不公平。如果敌人站在正面而不是背面,则更有可能攻击Adalia,所以战斗会更公平,更容易看清。
敌人会尝试到达玩家周围虚拟圆圈内的某个点,遵循的是著名的“功夫圈”准则。这有时在其他游戏中会看起来很不上档次,但我们故意加强了低等的、精心设计的传奇动作场景的感觉。

我们使用了UE4的一个试验性功能环境查询系统,告诉敌人他们在战斗期间应该站在哪里。要到达的潜在位置在Adalia正面或侧面有更多权重,在后面则权重减少。我们尝试避免将敌人放在感觉怪异的位置。例如,在上图中,从技术角度来说,守卫可以沿着楼厅轨道走动,但我们让他们绕开这些点。最后,我们还对接近互动物体的点增加了权重,让敌人可以更轻松地落入环境陷阱。
玩法元素
在格斗时,玩家可以即兴操纵周围的物体。我们最初的目标是让环境中的每一个物体都能够以直观系统的方式进行互动。基于此,我们为物体制作了形状和大小模板以保持总体的连贯性。物体都是从一些通用蓝图类继承而来。例如,“knockable”类的对象都是可以被击倒的较高物体。然后,它们分成两类:薄的和大的,甚至每个物体有各种细小的变化和调整。
我们还让这些元素做出系统反应,以创造联锁效应和自然发生的情况。这样通过创建大量意外的结果加强了格斗意图。我们通过接口标准化了触发器事件——例如,脚踢和躲避到障碍物中始终会调用“推”事件,但我们创造了大量自定义结果效果(桌子会滑动,敌人会蹒跚行走)。某些互动是隐藏的,例如,玩家可以通过脚踢将敌人扔到护栏外面,或者逼迫敌人躲进楼梯,使他们在楼梯上绊倒。


我们将这些设置为可返回抛射物体,因为我们不希望这个互动涉及任何复杂的瞄准机制。这类动作必须让一个传奇英雄做起来感到毫不费力。
技巧是找到一种简单的方法让抛射物体沿着一条漂亮的曲线轨迹运动,同时落在敌人的头上,即使敌人在移动也会击中。在下面可以看到我们是如何在蓝图中使用时间轴和曲线实现这一点的。

音频
为了支持游戏的系统和非线性性质,我们构建了多个音频系统。我们有“动态音乐”,在没有敌人的平静环境音轨、涉及一到四个敌人的普通格斗和由更多敌人的“史诗级”格斗之间切换。音乐可以在特定时间码过渡来创造一种不会导致节奏中断的平滑过渡效果。为了实现这一点,我们使用了非常精准的蓝图时间轴来记录时间。时间轴与音频文件同步播放,时间轴上有几个事件键,用于确定在哪里允许过渡。顺便可以在此听一听《En Garde!》的原始音轨。
角色在这个游戏中会说很多话,因此我们还构建了语音管理器来确保角色不会同时“说”几件事情。当我们希望角色说话时,我们会向它的语音管理器发出请求。管理器检查角色是否在说话,然后根据优先级值,中断当前正在播放的语音,或者防止播放新语音。当然,故事对白具有最高优先级,因此角色在说重要的事情时不会被中断。另一方面,来自敌人的不太重要的评论将在玩家痛打敌人时被敌人的“哀嚎”尖叫中断。
最后,除了语音管理器,我们还创建了用于游戏中旁白和动画期间使用的旁白系统。旁白使用自定义“对话旁白”结构,包含多个参数;例如让语音播放、字母文本、旁白优先级、说话角色(这样我们可以让语音实现空间化),甚至可选的“观众反应”参数,让阳台的群众对旁白做出各种反应(例如“喘息”或“喝彩”)。

关于在UE4中工作,你们喜欢哪些方面呢?
使用UE4让我们为之一振。一个很好的方面是协同工作,因为我们能够将版本控制解决方案(SVN)直接集成到引擎中,我们使用关卡分层功能来同时处理主地图的不同方面。
我们很享受制作《En Garde!》的过程。对于我们大多数人来说,这是我们目前最大胆的项目了。虽然我们仅制作了垂直部分,但我们在这个过程中学到了很多。很多内容可以改进。如果我们还能重新来过,我们很可能会从头开始(至少编程部分)来构建更简洁更优秀的项目。但我们一定还会使用UE4!
团队制作人员名单

engarde-game.com
Adrien Poncet——游戏总监、制作人和声效设计师
Valentin Capitaine——游戏设计师和AI设计师
Corentin Mangé——关卡设计师和关卡构建者
Sylvain Schmück——技术设计师和3C设计师
Pierre Chapelet——游戏和AI程序员
Tim Guthmann——动画师、技术美术和关卡美术
Anaïs Simonnet——角色美术和关卡美术
Julien Fenoglio——艺术总监、概念美术和关卡美术
Ludwig Wu——音乐制作人(来自于MAAAV Lyon 2)
Ilse Zamarripa——Adalia配音
关于资源方面的更多帮助,特别鸣谢Ilse Zamarripa、Jordan Jaminet、Valentin Picard、Maxime Conquy、Thibaut Moitel、Loup Druet、Guillaume Faguet。