查看原文
其他

关于我在《神秘海域4:盗贼末路》开发的那些事

2016-07-15 张华栋wcby 审校 Gad-腾讯游戏开发者平台
既然《神秘海域4:盗贼末路》已经正式发布了,那么我可以谈论下在《神秘海域4:盗贼末路》我负责开发的部分了,我主要负责的部分有单人模式下同伴的人工智能、多人模式下的战友的人工智能,还有一些游戏逻辑部分。我忽略了没有在最终游戏中体现出来的那些东西,还有一些零散的工作太过于琐碎而没有提及。所以下面就是我要谈到的内容:

派遣系统
在本文开始之前,我想先谈谈我们用来让NPC寻找合适位置的派遣系统。这个系统的核心逻辑不是我开发的,我只是帮助写了一些客户端的代码来调用这个系统。派遣系统中的位置都是可行走空间中的离散位置,这些位置大部分是用工具自动生成的,也有一些是设计师手动放置的。基于我们的需求,我们创建了不同的派遣系统选择器,会对可能的位置有不同的评分方案(比如说我们实现的有潜行派遣系统选择器、战斗派遣系统选择器,我们会根据需求来选择对应的派遣系统选择器,然后按照这个选择器对位置进行评分),然后我们会选择分数最高的位置,告诉NPC移动过去。

同伴跟随
同伴跟随系统是继承自游戏《最后的生还者》。基本的想法就是同伴会在玩家的周围去寻找一个位置进行跟随。这些可能的位置是从玩家位置扇状分散开的一个区域,而且必须要满足以下的线段路径是否为空的测试:
玩家位置到跟随点位置之间没有阻挡
跟随点到前方的投射点位置之间没有阻挡
前方投射点位置到玩家位置之间没有阻挡

出现在《神秘海域4:盗贼末路》的攀爬系统是《最后的生还者》没有的系统。 为了让攀爬系统与现有的同伴跟随系统能够一起工作,我们添加了攀爬跟随位置选择器,它会在玩家攀爬的时候给同伴寻找合适的攀爬位置。


这个系统比我想像中的要复杂一些。如果只是在玩家没有攀爬的时候告诉同伴使用常规的跟随逻辑而在玩家开始攀爬的时候告诉同伴使用攀爬位置是不行的。如果玩家快速的在攀爬与非攀爬的状态之间进行切换,同伴就会跟着
在这两种状态发生非常严重的振荡。所以我们在同伴的行为选择上增加了一些滞后,只有当玩家切换到攀爬状态,并且保持此状态移动了一定距离以后,同伴才会切换到攀爬状态。总的来说,增加滞后时间是解决行为闪烁振荡的好办法。
同伴带领玩家前进
在《神秘海域4:盗贼末路》中的某些特定场景中,我们要让同伴带领玩家前进。带领玩家前进的系统是从《最后的生还者》移植而来的并进行了一定的更新,主要是允许设计师使用样条曲线在关卡中标记他们想让同伴带领玩家前进的大致路线。
在一个关卡有多条引导路线的时候,设计师要放置多条样条曲线并使用脚本来切换当前使用哪一条引导路线。

玩家的位置会被投射到样条曲线上,领导者的参考位置会比玩家的位置往前放一点,而往前放多少的距离是由设计师调整的。当领导者的参考位置超过一个被标记为等待点的样条曲线控制点,同伴会前往下个等待点。如果玩家在走回头路的话,同伴只有在领导者的参考位置与上一次移动经过的最远等待点相距过远的情况下,同伴才会走回头路。这也是利用增加滞后时间来避免行为的闪烁振荡。
我们也把动态移动速度调整的功能整合进同伴带领玩家前进的系统。根据同伴和玩家在样条曲线上之间的距离,“速度平面”会沿着样条曲线放置。同伴有三种移动模式:走路,跑步,冲刺。根据玩家撞到的速度平面,玩家的同伴会选择合适的移动模式来保持他到玩家的距离。设计师可以根据他们的想法来打开或者关闭“速度平面“。此外,玩家同伴的行进动画速度也会基于他与玩家距离做微调,这样当切换移动模式的时候,就不会有太突然的速度变化。
 

玩家的位置会被投射到样条曲线上,领导者的参考位置会比玩家的位置往前放一点,而往前放多少的距离是由设计师调整的。当领导者的参考位置超过一个被标记为等待点的样条曲线控制点,同伴会前往下个等待点。如果玩家在走回头路的话,同伴只有在领导者的参考位置与上一次移动经过的最远等待点相距过远的情况下,同伴才会走回头路。这也是利用增加滞后时间来避免行为的闪烁振荡。
我们也把动态移动速度调整的功能整合进同伴带领玩家前进的系统。根据同伴和玩家在样条曲线上之间的距离,“速度平面”会沿着样条曲线放置。同伴有三种移动模式:走路,跑步,冲刺。根据玩家撞到的速度平面,玩家的同伴会选择合适的移动模式来保持他到玩家的距离。设计师可以根据他们的想法来打开或者关闭“速度平面“。此外,玩家同伴的行进动画速度也会基于他与玩家距离做微调,这样当切换移动模式的时候,就不会有太突然的速度变化。


同伴的掩体共享
在《最后的生还者》中,玩家和玩家的同伴可以在不离开掩体的情况下让玩家从玩家同伴身上移动过去。这被称为掩体共享。 

在《最后的生还者》中,乔尔可以伸手按着墙从埃莉和苔丝的身边走过,这没有问题,是因为她俩的体型都比乔尔的体型要小。但是我们觉得同样的动作就不适合身型差不多的内特,山姆,苏利,和埃琳娜。此外,《神秘海域4:盗贼末路》的游戏节奏比较快,让内特在掩体内移动的时候伸手去按着掩体只会让动作流畅性打折扣。 所以我们决定就只让玩家的同伴靠紧掩体,而玩家稍微规避下绕开同伴。

我们在这里使用的逻辑非常的简单。如果玩家位置往移动方向投射得到的点,落在位于掩体的同伴周围的一个方框内,那么同伴就会取消他当前在掩体中的行为,并且会快速向掩体靠紧。

医疗兵助手
在多人模式中医疗兵助手需要一种与单人模式完全不同的新的行为模式:他们既要救治被击中的同伴,又要复制玩家在掩体中的行为。
 

医疗兵助手会尝试复制玩家在掩体中的行为,并且尽量待在离玩家很近的地方。所以当玩家被击倒的时候,他们就可以迅速跑过来进行救治。如果周围有同伴被击倒的话,只要玩家还没有被击倒,那么医疗兵助手也会过去救治这些被击倒的同伴。 如果玩家有给医疗兵助手装备救援包这个道具,那么医疗兵助手会在跑到被击倒的目标进行救治之前朝这个被击倒的目标丢救援包。救援包的丢掷基本上就是复用手榴弹的抛物线判空测试逻辑和丢掷动画,只是我把手榴弹的模型替换成了救援包的模型而已。

在草丛中隐蔽的功能
在隐蔽草丛中蹲行也是《神秘海域4:盗贼末路》才有的新功能。 要实现这个功能,我们需要某种能够标记场景的手段,这样的话游戏逻辑才可以判断玩家是否身处隐蔽草丛中。在一开始,我们想的是通过在Maya中将模型的背面进行标记作为草丛的碰撞表面,但是发现这么做的话美术人员和设计师之间的沟通时间太长,很难频繁改进关卡。于是我们决定使用另外一种方法标记隐蔽草丛的区域。我们在编辑器里面给设计师添加了一个额外的草丛标记供他们使用,这样他们就可以直接在导航网格上对他们希望视为草丛的地方进行标记,而且精度还非常高。有了这个额外的信息,我们也可以根据玩家是否在草丛中隐蔽来对隐蔽的位置进行评分。这对于玩家在草丛隐蔽的时候同伴在移动的情形也特别有用。

感知
因为《神秘海域4:盗贼末路》没有类似《最后的生还者》聆听模式的功能,所以我们必须要找另外一种方法,让玩家有办法得知附近有敌人临近的威胁,这样的话玩家就不会因为敌人位置的不可知而感到迷惑和挫折感。我们利用敌人的感知数据,加入了有颜色的威胁标示,比如当敌人开始接近玩家的时候我们使用的是白色,当敌人开始对玩家起疑的时候我们使用的是黄色,当敌人已经发现玩家的时候我们使用的是橙色。这些标示会适时地提醒玩家。 另外,我们也会在进行威胁提示的时候播放背景声音来制造紧张感,当玩家被发现的时候,则会播放大声的提示音效, 这些音效的安排和做用跟《最后的生还者》是类似的。

调查功能
这是游戏在发布之前我参与的最后一个主要的游戏功能。我在顽皮狗通常不会参加正式会议,但是在游戏发布之前的最后几个月,我们一个周会至少有一个会议,一般是由布鲁斯·斯特拉尼或者尼尔·查克曼主持的,会议的内容会聚焦在游戏的人工智能方面。几乎每次开完会之后,调查系统都有需要更动的地方。在游戏的最终版本发布之前,整个调查系统 前前后后总共经历了好几次大改。 
会让敌人起疑并展开调查的因素有两种:玩家的存在和尸体。 当敌人起疑了(起疑者),他会找最近的同伴来跟他一起调查。离起疑点较近的人会成为调查者,另外一个人则会成为看守者。起疑者可能会是调查者,也有可能是看守者。针对这两种场景我们设置了不同的对话来适应这两种情况(分别是“那边有异状,我去看看”与“那边有异状,你去看看”)。
为了让调查的开始和结束看起来更加自然,我们会错开这两个调查者的行动和威胁标示时间,所以这两个调查者不会在同一时间以一种很机械的方式来执行完全相同的操作。

如果引起调查者怀疑的是一具尸体,调查者将被提醒玩家的存在并会告诉其他所有人开始搜查玩家,会让所有人不可逆的离开不知情的状态。发现的尸体也将被凸显,以便让玩家知道敌人为什么进入警戒。

在某些难度下,短时间内连续触发调查,会让敌人的感应力变的更加敏锐, 他们会更容易发现玩家,即使玩家隐蔽在草丛中也一样。在极端困难模式下,敌人永远处于敏锐感知状态。
 
对话动作系统
这也是我负责的最后几个功能之一。对话动作系统负责操控角色在对话的时候对对话的内容做出一些响应,比如说像是在对话的时候看着其他人或是做一些手势。之前在《最后的生还者》开发的过程中,开发人员花了好几个月的时间给游戏中所有的对话用脚本加上了对话时候的注视和手势。我们可不想再做一次这种苦工。在我开始开发这个功能之前,我们已经有了一些通过手工标注的对话的脚本了,但是我们需要一个默认系统来处理那些没有被手工标注的对话。动画师可以通过调整参数来改变转头速度、最大转头角度、注视时间、转头的冷却时间等等。

吉普车动量的维系
开发初期遇到的问题之一,就是马达加斯加的吉普车驾驶那一关,一旦玩家的吉普车在撞到墙或者敌人的载具之后,玩家的吉普车就很容易旋转并掉速,从而让玩家远远的落在车队的后面导致整个关卡失败。
 
 我使用的解决方法是,当玩家的吉普车撞到墙或者敌方载具的时候会短暂地限制吉普车的角速度以及线性速度方向上的改变。这个简单的方法相当有效,从此玩家就比较不容易旋转掉速而导致关卡失败了。(主要是限制速度方向的变化,不会让玩家的吉普车旋转)。

载具的死亡
可驾驶的载具是《神秘海域4:盗贼末路》新引入的一个系统。在这之前,所有的载具都是NPC驾驶并且这些载具是沿着固定轨迹行进的。 我负责的是载具死亡的部分。
有几种方法都可以摧毁敌人的载具:杀死驾驶载具的敌人、射击载具并持续足够长的时间、开着你的吉普车撞飞敌人的吉普车以及开着你的吉普车撞敌人的吉普车让它旋转掉速。基于死亡原因的不同,载具死亡系统会选择载具和乘客的死亡动画来播放。死亡动画会与物理引擎控制的布娃娃系统想混合,所以死亡动画会平滑地过渡到物理引擎模拟的翻车。
当敌方吉普车被撞飞死亡的时候,我们使用的是敌方吉普车在XZ平面上投影的包围盒和碰撞点来判断要使用四个撞飞死亡动画中的哪一个。
至于冲撞使得敌方吉普车旋转掉速的情况,我是拿敌方吉普车与预设行进方向之间旋转量的差值来与一个阈值进行比较。如果超出这个阈值,就让敌方吉普车开始旋转掉速。

载具播放死亡动画的时候,死亡的载具会有一定的几率穿透墙壁。我使用了一个球体投射,会将载具如果没有死亡所在的预设位置投射向载具现在的实际位置。如果投射结果是与墙壁碰撞,则会把载具稍微往墙壁的法向量方向移动一点点微小的量,而这个修正不是在一帧中全部完成,而是会持续几帧,主要是为了避免太过剧烈的位移。
 

我们还制作了一种特殊类型的载具死亡动画,叫做载具死亡提示。这些死亡提示是可以与周围环境进行交互的死亡动画。动画师和设计师在场景中沿着样条曲线放置好死亡提示,每个死亡提示在载具行进轨道上都有个进入范围。 当一个载具在死亡提示进入范围中死亡的时候,就会开始播放对应的特殊死亡动画。 之所以开发这个功能,主要是实现2015年E3展演示作品中的超帅气吉普车的死亡动画。
 
混色用的贝尔矩阵
我们想要消除摄像机能够看穿物体内部的瑕疵,特别是当摄像机与游戏中的各种植物主要是叶子离得太近的时候。 于是我们决定要让靠近摄像机的像素淡出,淡出的程度是由物体到摄像机之间的距离决定,通过像素着色器实现。使用半透明像素并不是个好主意,因为非常消耗性能并且叶子的数量实在是太多了。相反, 我们使用的技巧,是所谓的混色,结合像素到摄像机的距离以及一个预先决定的贝尔矩阵的模板,像素的某些部分完全丢弃掉从而创造了透明的幻觉。(有序抖动也是一种常用的半色调技术方法,可以说是最简单的领域处理过程的方法。它是用一个固定大小的阈值矩阵在原始灰度图像上面一边“移动”,一边比较。如果原始图像中像素的灰度值大于相应阈值矩阵中的阈值,那么抖动后该像素的值为白色,否则为黑色)。
拜耳阵列是实现CCD 或CMOS 传感器拍摄彩色图像的主要技术之一。它是一个4×4阵列,由8个绿色、4个蓝色和4个红色像素组成,在将灰度图形转换为彩色图片时会以2×2矩阵进行9次运算,最后生成一幅彩色图形。该阵列于1976年注册专利。拜耳阵列模拟人眼对色彩的敏感程度,采用1红2绿1蓝的排列方式将灰度信息转换成彩色信息。采用这种技术的传感器实际每个像素仅有一种颜色信息,需要利用反马赛克算法进行插值计算,最终获得一张图像。拜耳阵列的问题之一是,在拍摄具有重复细节(如纺织品)的画面时,容易产生彩色干扰信息。该问题是由于其规则的分布方式而造成的。其具体表现为在画面中产生难看的色带,而解决该问题的方法是在传感器其安装一块会将画面细节模糊化的AA(或称低通)滤镜。
低通滤镜可以减弱摩尔纹,但同时也降低了相机分辨

我们一开始使用的贝尔矩阵是个8×8大小的矩阵,取自维基百科里面。我认为这个矩阵太小,会造成不美观的带状瑕疵。所以我想要使用16×1大小的6的贝尔矩阵,但是网络上都找不到相关的资料。于是我试着用逆向工程找出8×8大小的贝尔矩阵的模式并注意到模式里面存在递归性。 光用目测法,我想我应该可以直接解出16×16大小的贝尔矩阵,但是我想要让过程更有趣一点,于是我写了一个工具,可以生成二的任意次方大小的贝尔矩阵。

切换到16×16大小的贝尔矩阵之后,可以看到对带状瑕疵有明显的改善。

爆炸声的延迟
在这个问题上我的贡献很小,但是我还是觉得值得一提。事情发生在2015年E3(E3游戏展又称电子娱乐展。是全球电子游戏产业最大的年度商业化展览,也是第三大的游戏大会,由娱乐软件协会主办。展览只对电子游戏产业圈内人士及记者开放,并且规定18岁以上才能参观。一般于每年5月第3周在美国洛杉矶的洛杉矶会展中心举办。很多电子游戏的开发者会在展会上展示他们即将上市的游戏,或者发布即将面世的硬件产品,其中的1/5是从未向公众展示过的。大展上面的独立奖项“游戏批评奖”(Game Critics Awards)从1998年开始,颁发给E3上面最出风头的各种游戏。)演示版本的几个周前,我指出可以同时看到和听到塔的爆炸是非常不合理的。因为内特和苏丽离塔的距离非常非常的远,他们应该先看到塔的爆炸,稍微晚一点才能听到塔的爆炸声。在我指出这个问题之后,美术团队就在最终版本的演示作品里面对爆炸声添加了一小段延迟。
繁体中文版的本地化
直到游戏正式发布的两周前我才在游戏中改用繁体中文字幕,我在这里面找到了很多翻译方面的错误。大部分的错误都是由于英文直译成繁体中文,而变成四不像的用语的缘故。我认为我没有足够的时间可以单枪匹马地玩通整个游戏并在同时找出翻译错误。于是我向几个测试部门的人员请求了帮助,让他们分章节地玩繁体中文版本的《神秘海域4:盗贼末路》,然后我再浏览录下来的他们玩繁体中文版本的视频,事实证明这个方法非常有效率。我成功的记录下了我找到的所有翻译错误,而本地化小组也有足够的时间在游戏最终发布之前来修正这些翻译。
就这么多内容了以上就是我在开发《神秘海域4:盗贼末路》的过程中值得一提的贡献。希望你能喜欢阅读这篇文章。:) 作者的简介

我是供职于顽皮狗的一个游戏程序员,对以下这些游戏开发内容比较有经验:基于限制的刚体物体、计算机图形渲染、程序动画、视觉反馈设计、游戏人工智能和游戏逻辑方面的编程。


近期热文:

中枪了没有!游戏开发过程中容易忽略的事

深入讲解:在Unity中使用多个相机 - 及其重要性

腾讯游戏开发者平台长按,识别二维码,加关注
经验分享丨项目实践项目孵化丨渠道发行做有梦想的游戏人-GAME AND DREAM-

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存