《The Last Of Us》的同伴AI(二):战斗跟随AI

2018-06-27

前文回顾:《The Last Of Us》的同伴AI(一):非战斗跟随AI

第三章 战斗状态下的跟随AI

行动集的概念

我们先提一个在顽皮狗游戏里都会用到的设定:行动集(Action Pack)。

我想在座各位都接触过类似的东西:游戏中我们会有个可以移动的场景,场景地面布上导航网格,然后会有很多很多的多边形来告诉角色哪里可以行走、哪里不可行走。

平时我们的角色只会走路、跑动或者拔枪攻击,我们希望在场景中某些位置上能够激活玩家的额外行动,我们就把这个逻辑就称之为行动集。我们也可以把它理解成为角色在环境中潜在的互动行为,当玩家在对应位置上就会激活这个行动。

行动集的类型

行动集一共有三种类型:

第一种叫做影片触发点(Cinematic Action Packs)。当角色走到这里的时候就会激活一些影片,也就是进入剧情。这类我们用得不算很多,大多数在章节切换的时候会用到。平时很少用则是因为可能会有很多NPC或怪物介入并影响玩家,通常都会在一些很安全的地方才用到。

(插一句,相比之下,努力做到一镜到底的《战神》则相当频繁地使用这一点,而且效果惊人,经常都会意识不到自己在操作角色、还是剧情在操作角色)

第二种则叫做额外移动触发点(Traversal Action Packs)。这就是那些可以让玩家跳跃、攀爬的点位,玩家移动到对应的地方就能激活这个行为。这个非常好理解,在游戏中很多的房间内、箱子上、汽车上、梯子旁都有类似的触发点。比如下面这个图,两个窗口都是额外移动触发点,角色可以通过这里翻到房间外、或者从外面跳入房间内。


第三种就是掩体触发点(Cover AP),这就是那些可供玩家潜伏的点位,用掩体来进行潜行攻击或者躲避伤害,玩家在这里可以通过蹲伏的姿势来藏在掩体后面,然后进一步进行战斗。看下面的图,用有颜色的线段标出来的位置就是可以使用的掩体,其中橙色和蓝色的线段分别表示玩家可以通过蹲姿或站姿来进行掩体掩护。


上面这个图还可以再说一个细节,注意中间这辆车的车头位置,这里是没有掩体触发点的,原因是这样:

我们开发了一系列工具来自动生成这些橙色和蓝色的线段,但工具并不是100%完美的。《最后生还者》是一个支离破碎的废土末日世界,它并不是由大量规整的房间和平面组成的,所以如果一个物件或者障碍物刚好比我们设定的最低掩体要矮一厘米,那它就不能成为我们的掩体触发点。这就是为什么有些车头能成为掩体、有些车头不能成为掩体的原因。

理论上我们的游戏设计师们可以手动去调整这些东西,但这工作量太大了。而更重要的是,很多地方我们没必要去做,因为在绝大部分的场景内玩家的敌人都是感染者,没什么强盗暴徒这些,而感染者并不会使用任何行动集,所以我们的设计师们就不用花时间在这上面了。

补充一句,《最后生还者》其实有不少战斗要跟真人打,比如火萤、比如某些据点里的劫匪等等,这里可能是Max演讲时的口误。但那些战斗的场景一般都在有相对规整物件的地方,比如建筑内部、仓库中心等等,有上图那种废弃汽车掩体的场景不算太多。

不过我们的确有一些场景需要手动去调,比如我们会有些倾斜程度超过三十度的废弃建筑等等,工具不太好去生成掩体,而这些契合世界观的场景又必须存在,那我们只好去一个个去做咯。

关于行动集的概念我们介绍得差不多了,让我们回到同伴AI的主题。影片触发点都是由玩家来触发,艾丽不会使用;额外移动触发点则是乔尔和艾丽都能使用的行动集,这一点也没什么好说的。所以我们下面会重点介绍一下艾丽对掩体的使用。

艾丽如何利用掩体

对于普通的NPC来说,他们基本不会使用到各种掩体。他们要么成群结队正面攻击,要么就在营地里等着玩家去潜行攻击。

而对于乔尔(玩家)来说,乔尔在大部分战斗区域内都可以找到很多掩体,利用掩体进一步进行侦查或者攻击,这是我们战斗的核心部分之一。每场战斗玩家都可以去选择偷偷潜行杀完,或者是干脆放弃掩体正面刚。

一旦乔尔进入掩体,我们需要让艾丽也利用掩体来跟随在乔尔身旁。有一个非常简单方法就是,我们在每一个掩体周围的一米内都做一个掩体,但这很显然不太可行,在感官上不太和谐、同时也会影响潜行玩法的体验。

我们把奔跑时间作为一个切入点来思考这个问题。


当艾丽在一个掩体后面、即将要前往跟随乔尔时,我们会计算艾丽跑到周围几个掩体的路线,然后根据这些路线的移动所需时间、位置、可能要播放的人物动作等等参数,去得到不同路线的权重。

当乔尔在掩体之间移动时,艾丽不需要一直紧跟在乔尔后面,艾丽完全可以再乔尔后方的掩体里等待行。

所以,对于乔尔来说,乔尔面对的选项可能是各个不同的掩体,而对于艾丽来说,艾丽的选项则是各个“奔跑时间+掩体”。

乔尔又要来发射射线了

此时,乔尔不再像我们之前在非战斗环境中那样朝弧形范围发射射线了,而是以自己为圆心、朝身边所有方向、每帧发射大约80根射线,这些射线最终会射到各种掩体和角色身上。我们通过这种方式来寻找乔尔旁边的障碍,这些障碍是掩体,这些掩体就是艾丽要移动的目标。

然后我们还会在游戏中特意设置部分特殊的掩体,这些掩体的完成度和安全性都很高,这些也会优先成为艾丽的目标掩体。一般会在关卡的入口附近、在敌人基本不会巡逻到的位置附近都会有这类掩体。这类掩体一般都是一些厚实的墙壁之类,玩家一眼看过去就会觉得这就是个掩体,艾丽躲在那儿也显得非常合情合理,上文说的那种报废的汽车车头就不会是这类掩体了。

通过这两个方法,我们就可以在整个游戏世界中为我们的艾丽AI提供了足够多的掩体触发点,艾丽就可以根据AI来在战斗中进行合理的躲避和潜行。

举个例子来方便理解射线

下图灰色的就是障碍物,我们以乔尔为中心去发射射线,图中为了比较好展示所以大大减少了射线的数量。这些射线的长度我们可以去定义,一般不会长,否则我们可能会得到一些距离乔尔很远的掩体,这不合理。


然后我们就可以取得那些射线与障碍的接触点。


你会注意到这些点有不同的颜色,它们是根据角度、距离地面的高度等等参数来分类,目的就是用来区分不同的墙面。分完类之后我们就会告诉艾丽说:“嘿!你要不要过来看看,这是一个掩体!”

此时,乔尔在发射射线时有可能会处于一些很奇怪的位置,这导致了我们生成的这些掩体有可能也会因为角度和高度的奇怪而变得不太符合常理。比如有可能会出现一些很小的掩体,而明明从视觉上看这个掩体还有很大的拓展空间,类似下图浅蓝色的区域。


所以我们需要每一帧都去通过上述的方式去生成对应的坐标点:


然后我们会保存一小段时间内生成的坐标数据,通过这些数据才来得出真正的掩体,就像下图浅蓝色区域那样。


然后当我们拥有若干个程序生成的掩体后,我们会通过很多参数去计算它们的权重,比如距离友方角色的距离、距离敌方角色的距离、距离关卡目标的距离、掩体是在乔尔身前还是身后、这个位置能否被敌人看见等等。

接下来就是按照我刚才所说的,艾丽AI里的选项其实是“奔跑时间+掩体”,现在我们通过上面的方式得到候选掩体之后,就会去计算艾丽移动到对应坐标的时间,然后进行相应的移动。

下面这张图就是一个实机展示。图中很多密密麻麻的数字其实就是每个被生成的掩体的各种参数权重值,艾丽最终选择权重最高的那个、也就是图中绿色的那个掩体。在图中上方的那个箭头处其实有个隐藏在草丛后面的敌人,这也就是为什么艾丽没有选择画面上方掩体的重要原因了。


掩体共享

但这个做法会有个问题,如果艾丽一直处于乔尔周围的掩体、或者在乔尔周围的掩体中进行移动时,艾丽有可能会把玩家想要去的一些目的地给占据掉。

比如玩家想去前面某个掩体后面以便射击敌人或者投掷燃烧瓶,但艾丽却意外地占据了那儿,玩家倒是可以强行过去逼走艾丽,但这样会显得非常蠢。我们当然也可以给艾丽一个AI说,当乔尔要过来的时候艾丽就要离开,但我们有一个更好的方法。

这个方法叫做掩体共享。

我们决定允许乔尔和艾丽能够同时处于一个掩体,并且当他们两个位于同一个掩体后时会触发一些动画,比如乔尔通常都会用身体护住艾丽,像下面这个图这样:


这个方法不仅解决了上面说的掩体冲突问题,还给艾丽AI寻找掩体时多了一个还不错的选项:乔尔所在的掩体也是一个可用的、而且还不错的掩体。

除此之外,这对我们塑造乔尔和艾丽的关系有巨大帮助。

如大家所知,我们希望玩家能感受到乔尔和艾丽之间接近于父女之间的感情,而掩体共享这件事情的确可以完美做到这一点。通过这个做法,玩家的确会感受到这是两个有血有肉的角色。

当艾丽位于乔尔旁边、而且艾丽判断出她所在的位置更好时,她会通过对话来邀请玩家移动到她所在的掩体里。比如说艾丽发现乔尔的位置可能要被敌人观察到时,或者艾丽的位置更靠近关卡出口时,就会出发这样的逻辑。并且艾丽在乔尔过来了之后可能还会说:“哇,刚刚那太惊险了!”这也确确实实是一些能够促进两个人之间感情交流的一些做法。


那么,在前两章我们知道艾丽是如何跟随乔尔、以及艾丽在战斗中是如何跟我们保持距离了。接下来第三章要讲的就是艾丽在战斗中如何帮助乔尔,或者说是艾丽的战斗AI。

未完,待续...

最新评论
暂无评论
参与评论

商务合作 查看更多

编辑推荐 查看更多