龙腾世纪3-审判的AI实现

发表于2016-07-21
评论1 1.35w浏览

想免费获取内部独家PPT资料库?观看行业大牛直播?点击加入腾讯游戏学院游戏程序行业精英群

711501594

 翻译:TraceYang             校对:钱康来


Hanlon_Sebastian_Getting Inquisitive About_页面_01.jpg

 

thismessage://1e5d463f-02d0-4571-aa28-7cab1f706bae.jpg

演讲的Sebastian HanlonBioWare Edmonton的高级设计师,负责AI部分的工作。

 

首先要介绍一下,龙腾世纪:审判是BioWare开发的一款幻想RPG,对BioWare来说非常重要的是,它是第一款开发使用寒霜(Frostbite)引擎开发的RPG游戏,寒霜是非常巧妙的引擎,而内部技术是从之前的开发过龙腾世纪起源和龙腾世纪2的传统引擎Eclipse Engine移植过来的。

换引擎是非常有挑战的,游戏开发是从2011年开始,是龙腾世纪系列的第3款游戏,虽然是在技术上是重新开始,但BioWare已经建立了玩家已经了解并喜爱的世界观,故事以及角色,并大量的在游戏中生存着。

另外本游戏是在5个平台上发售,不仅仅是PCPS4XBOX ONE,还有PS3XBOX360,不得不对所开发的内容进行缩减,所以在开始开发时,感觉有很大的约束和影响。在玩家的观点看,审判做了很大的改变,游戏里增加了开放的探险区域,这点是在开发游戏时很大的改变,要学会去处理大的区域,这也是今天所要讨论的。

Hanlon_Sebastian_Getting Inquisitive About_页面_02.jpg

 

接下来讨论的是为生物创建AI,首先是创建生物。龙腾世纪有大量的生物变种,像龙和巨人这样很大的生物

Hanlon_Sebastian_Getting Inquisitive About_页面_03.jpg

 

同时也有大量的小的生物,例如图里的小猪,用大量野生的生物来布置这些广阔的开放区域。

Hanlon_Sebastian_Getting Inquisitive About_页面_04.jpg

 

另外有一些生物会作为友方为玩家一方战斗,有友好的圣殿武士。

Hanlon_Sebastian_Getting Inquisitive About_页面_05.jpg

 

但大部分要讨论的AI还是带有恶意的敌人。

Hanlon_Sebastian_Getting Inquisitive About_页面_06.jpg

 

另外需要讨论的队友的AI,队友的AI构建是本次议题中另外的一个重要事项,游戏里有各种角色和能力。龙腾世纪中通常玩家并不是独自一人,而是有团队一起旅行的,有近距离攻击的战士,范围攻击的狙击手,法师以及坚不可摧的坦克角色。在能力和力量上都有很大的区别,有一些不同的独特能力。

就像前几代游戏那样,玩家可以在任何时候在队伍的角色之间切换控制、在系统上任何角色可以从玩家控制切换成AI控制,这是一个特别的挑战,在系统是必须要做特殊处理。

Hanlon_Sebastian_Getting Inquisitive About_页面_07.jpg

 

而且,玩家可以暂停游戏,在战场周围移动摄像机,并可以同时直接给团队的角色下达指令,并观看方案如何的展开。

Hanlon_Sebastian_Getting Inquisitive About_页面_08.jpg

 

那么AI是如何协助这种控制的?因为是用新的引擎开始的,要额外的构建内容,生物,队友,能力到战斗系统里,而且要建立工具链和工作流。作为开发者都清楚,迭代速度是改进质量的关键点,可以更快的在游戏里看到所做的改变,就可以更快的对结果做评估,来确定将来是否需要修改,或是这就是你要的效果。另外利用引擎的数据驱动管线,在工具集里实时的调节,在游戏时或编辑和玩法迭代时在游戏中查看结果。

Hanlon_Sebastian_Getting Inquisitive About_页面_09.jpg

 

AI方面实际工作的有两个相关的工作流,一个是提供给战斗设计师的,用来构建生物以及队友的AI。另外还需要考虑关卡设计师的工作流,让AI行为与他们建造的环境以及要描述的故事情节相符合。

Hanlon_Sebastian_Getting Inquisitive About_页面_10.jpg

 

本次演讲的焦点,前面提到的很多事项之一就是对应游戏广阔的开放区域,这个在Bioware以前的游戏以及龙腾世纪中都没有实现过。另外就是如何去构建团队AI系统来支持复杂和可以定制的队友,让他们可以支援玩家。

这个事情可追溯的是1年半前,Hanlon讲了开发的一些情况,他们遇到了一些障碍并跨越了这些挑战,希望在这次演讲中,听众也可以获得其中的一些解决方案来对应相关的问题,可以避开我们在开发游戏中遇到的错误和意外情况。

Hanlon_Sebastian_Getting Inquisitive About_页面_11.jpg

 

寒霜具体提供了什么呢?

Hanlon_Sebastian_Getting Inquisitive About_页面_12.jpg

 

寒霜集成了称作NavPower的寻路中间件,不需要再自己去开发寻路系统,这样游戏角色就有路径网格(Pathmesh)和导航系统(Navigation)可以使用,比如幻灯片中显示的绿色多边形。这样就有了很好的起始点,不需要做基础的关卡工作,就可以让角色可以走来走去,彼此跟随。

Hanlon_Sebastian_Getting Inquisitive About_页面_13.jpg

 

另一方面,也可以利用其他EA组制作的决策树架构,这个也是开发战斗系统部分逻辑的主要工具,它是一个可视化的节点编辑器,游戏和战斗团队构建了大量的条件评估库,在游戏世界里进行测试,提供需要的AI信息来进行选择。另外还有一组驱动游戏系统的接口,主要是在游戏中来移动角色或使用能力。

Hanlon_Sebastian_Getting Inquisitive About_页面_14.jpg

  

能力(Ability)的概念是在龙腾世纪游戏中提供一致的方式来定义游戏玩法中的行为,对玩家和队友而言,能力是很明确的,在升级时使用点数来提升,然后放在技能栏上使用,在游戏过程中,玩家可以获取新的能力并进行升级。同样也把能力运用在队友,也可以通过能力框架来定义NPC,但是这些能力不一定会出现在玩家的界面上,也没法升级调整,这里还包括后面会重点提到的,比如扔火球,嘲讽对手,可以进行躲避,这些都是有效的能力,玩家也会使用一些非能力类的行为,例如跳跃,喝药水,欢呼。在底层都是作为能力实现,这就提供了一致的方式来定义玩法行为,在讨论能力选择时就非常的重要了。

Hanlon_Sebastian_Getting Inquisitive About_页面_15.jpg

 

有了寻路系统,决策树,以及框架来构建行为和能力后,接下来就需要实际的挑战,就是以前从来没有用寒霜开发过游戏,从来没有过开放式的区域。

Hanlon_Sebastian_Getting Inquisitive About_页面_16.jpg

 

这需要构建很大的范围和大量的事物。需要确定可以用一致的方法来进行AI的评估,通过这种决策方法的制定,使得团队的每个人在最基本的层次如何去开发方面都有了同样的想法。另外要确认的是可以在队友和生物之间共享方法,这时因为所有事物都是运行在同一个AI系统里,那么需要他们都遵循同样的基本准则。

Hanlon_Sebastian_Getting Inquisitive About_页面_17.jpg

 

下面例子里,在站在前面的角色上运行了一个AI

Hanlon_Sebastian_Getting Inquisitive About_页面_18.jpg

 

而后面的4个发紫光是我们的敌人。

Hanlon_Sebastian_Getting Inquisitive About_页面_19.jpg

 

那么AI在核心评估循环里首先要做的就是拾取一个目标

Hanlon_Sebastian_Getting Inquisitive About_页面_20.jpg

 

接下来是选择要使用的能力,这里使用了右下角的FlankAttack技能

Hanlon_Sebastian_Getting Inquisitive About_页面_21.jpg

 

Flank Attack是一个近战能力。因为使用的是小刀,必须要进行移动,这样才能执行这个行为。

Hanlon_Sebastian_Getting Inquisitive About_页面_22.jpg

 

当角色移动到位置后,就可以播放技能动画,产生伤害,触发实际使用能力的所有事物。这个就游戏中每个AI控制的角色基本遵循的核心决策制定循环和行动循环。虽然也有例外的情况,但典型的还是选取了目标使用能力并移动,完成这些后运行攻击动画并消失来执行这个指定。有了这些,开发团队就有了一致的方法进行AI的评估,来支持游戏中的队友和生物。而他们如何进行选择的,例如队友是有玩家制定的策略元素用来选择目标,而生物则是使用的仇恨系统来决定目标。尽管在执行步骤上有微小的不同,但都遵循着同样的基本逻辑模式。

Hanlon_Sebastian_Getting Inquisitive About_页面_23.jpg

 

不仅仅是能力,同时也不希望所有的AI都是直接移动到目标的方式来完成,不想像前面的示例里当着敌人的面来进攻。前面也提到了寻路层提供了移动到某个点或是跟随队长的功能。那么只要知道要移动到的位置,就可以解决了,但是很多的生物和队友的行为需要更加复杂的移动,需要创建出更加有趣的模式,来给予生物生命力并充实广阔的开放空间让玩家可以遇到,同样不需要每次都让设计师手动配置特殊的位置点和移动行为,就可以创造出有趣的玩法挑战。希望是可以重复使用的抽象概念。

Hanlon_Sebastian_Getting Inquisitive About_页面_24.jpg

 

这个系统被称作MovementBehaviours,这个系统是可复用和参数化,下图是编辑器中的实例,生物可以运行一个行为的参数块,直接指定要移动的目标位置就行,不需要关心怎么算的,这样可以去做一些玩法上有趣的事情,而不需要设计师手动的指定如何去选择目标和移动位置。例如,在范围内停留,这个是参数化的,策划可以让角色和事物聚焦于选取位置的周围,甚至当选取的目标在移动,也能跟着走。

这给予策划更高的灵活度,例如指定侧翼位置,这样就会尝试绕到角色的后面,还有就是闲逛,这样更加的有活力,而不是只选取一个点并限制在那里。

另外还有的移动行为就是让角色找到一个在游戏世界中被标记的掩体物体,例如远距离攻击的生物,可以更加响应它们所在的环境,感觉起来是活在场景里的一样,并且不需要关卡设计师给予特殊的移动命令。

目标逃跑的行为也是用一样的方法实现的,比如像小猪从3种不同的捕食者周围逃跑,生物也需要逃开的行为,不管它们在世界中的什么位置,都要找到正确的路径从捕食者周围跑开。

保持位置感觉起来比较简单,也是可复用和参数化的移动行为,譬如当固定站在一个地方的时候 。可以让AI停留在一个位置但追踪目标,即便目标从关卡中离开(也停留)。

通过这些系统,生物移动可以丰富游戏玩法,并且按玩家希望的野生的逃跑和捕食的行为来进攻。

Hanlon_Sebastian_Getting Inquisitive About_页面_25.jpg

 

下一个问题就是要处理AI在大型的开放区域的行为,在过去的龙腾世纪游戏里,战斗倾向于在相对封闭的空间里,如果玩家遇到是的敌对的生物,就会开始战斗,直到一方死光战斗停止。而开放的探索区域改变了这个规则,在下面示例里,角色没有跑开,锁定了山上跑来的一大波敌人,除非玩家跑到区域边缘这些敌人会一直追着玩家,玩家需要和他们战斗直到一方全部被打到。但是在开放区域里探索,因为生物是在守卫他们的地盘,玩家经常会有机会试图逃离战斗,当离开足够远时,他们就会放过玩家。或者是玩家不想被卷入到战斗里,可以沿着走过并决定是否与之交战。

Hanlon_Sebastian_Getting Inquisitive About_页面_26.jpg

 

也有一些游戏玩法要面对的问题,有一些非常务实的技术原因,要对战斗开始的位置做更多的控制。因为必须要Stream的加载大型的区域,把玩家角色锁定的敌人远远的带离初始点是有风险的事情。他们会被Streamout,因为是一开始玩家在的那个地方,但玩家移动开了之后就要释放了。

同样也会处于不好的环境, 例如要设法嘲讽足够的生物,可能会耗尽内存预算,这里要生成3倍原来的内存预算来处理,那就很难处理了,以前也有过类似的解决方案,这样会破坏性能,产生让人沮丧的游戏环境,这就需要关卡设计师使用工具去控制,用一种特殊经验来对应这种故事以及玩法上的挑战。

Hanlon_Sebastian_Getting Inquisitive About_页面_27.jpg

 

下图就是关卡里非常简单的遭遇战,限制体(TetherVolume)是关卡策划放置在场景上的。

Hanlon_Sebastian_Getting Inquisitive About_页面_28.jpg

Hanlon_Sebastian_Getting Inquisitive About_页面_29.jpg

 

AI方面在Tether系统里有三个简单的规则,可以看到第一个规则是附加在Tether里的生物都不能离开区域,他们的移动行为在选取目标点时不能超出Tether Box,生物不会自发的移动到Tether区域。

Hanlon_Sebastian_Getting Inquisitive About_页面_30.jpg

 

第二点是,所有的目标点在Tether里的要比在Tether box外面的要优先,仇恨系统也会意识到Tether,所以生物也尽量不把他们的目标从Tetherbox里拖拽出去,当生物发现目标在他们的Tether外面的话,他们会选择返回原地,而不是继续攻击或者追逐。

Hanlon_Sebastian_Getting Inquisitive About_页面_31.jpg

 

3个规则就是,如果到了Tether外面,不论是因为策划在游戏玩法上改变了Tether Box,还是战斗的效果把角色被击出了Tether,如果出了Tether区域,就要停止所有行动,并跑回到初始的位置,在跑回到Tether之前,什么都不能做。这里的规则,都有编辑器工具支持,关卡设计师可以创建出期待中那样生物行为和移动的遭遇战。

Hanlon_Sebastian_Getting Inquisitive About_页面_32.jpg

 

还有的相关问题是,tethervolume解决的是允许生物在一个相当广阔的范围里可以移动,因为有一些危险区域是生物不能去的,尽管是可以跑过去的,但并不能站在这些区域里,因为要避免被地面上的火烧到,躲避障碍陷阱。这些都放置在游戏中有组织的环境里,有很多的各种环境上的伤害

在龙腾世纪2里,并没做太多这类的危险区域。如果在地面上起了一团火通常是有两种原因中,其中一个原因是要特殊的玩法挑战,作为玩家被期望去处理的,角色不能站在火里,如果在火里就要把他们拖出来。另外一个可能的原因是玩家把火放到敌方生物下面,生物站在上面受到伤害,而不是非常智能的从你的AOE攻击中跑开。

其他的在龙腾世纪3中的调整的系统化伤害,有时会自发出现并产生火焰,龙在战斗时会把地面区域点燃,某些地方5秒前还是安全的可以站立的,过一段时间就会成不能再停留的。这就需要方法可以让生物从这些区域离开。

Hanlon_Sebastian_Getting Inquisitive About_页面_33.jpg

 

首先要做的是寻路障碍(Pathfindingobstacle),可以看到下图里叠加在亮绿色导航网上的黄色块,这些就可以让环境中走入到里面的生物进入恐惧状态,也就意味着生物并不是任意的移动,在游戏世界的移动过程中会避开这些区域。但需要的效果要更强一些,因为有时火会生成在角色的脚下,如果AI在区域里,那就需要一种方法可以刺激AI进行实际的移动。

Hanlon_Sebastian_Getting Inquisitive About_页面_34.jpg

 

所以创建了称作恐惧区域(FearZone)的工具,Fear ZoneTehter Zone只是在规则上有所不同,如果是在恐惧状态,就会跑到范围以为的地方。

Hanlon_Sebastian_Getting Inquisitive About_页面_35.jpg

 

在下图地面火焰的prefab编辑器里,可以看到放置了半球气泡一样的恐惧区域Fear Zone,用来通知AI如果进入到这个区域就立刻跑开。

Hanlon_Sebastian_Getting Inquisitive About_页面_36.jpg

Hanlon_Sebastian_Getting Inquisitive About_页面_37.jpg

 

下图的调试绘制就是在游戏中,蓝色半球就是就FearZone(希望显示上有足够的对比度),你可以看到Varric(瓦里克,游戏中的矮人盗贼)站在火焰里,它的AI会倾向于让他从火焰里走开,即便是在5秒前玩家命令他移动到哪里,他也不会还是还站在火里面。

使用FearZone,设计师可以就有工具可以刺激生物通过AI控制器来远离危险区域。在前面提到的近战行为时,也使用了同样的移动行为,所以要有一致的工具集,当角色要从某个区域离开时,就找一条可以走的路走。这些FearZone的工具在开放世界玩法中也很有帮助,可以放置在帐篷或营地,这样阻止周围的野生敌人从村庄的中央穿过。

Hanlon_Sebastian_Getting Inquisitive About_页面_38.jpg

 

这样会产生称作“Stand-offin Bear Town(远离熊镇)的问题,这要做一些解释也有一定的背景,在龙腾世纪3中游戏时,熊是非常难对付的,因此,与熊是41的战斗,因为熊要对付团队的4个人,而不是于其他生物组队一起遭遇的。在进行开发时,内陆角落的探索区域,有个叫Beartonwn的地方,到处都是熊,在地图上有一个营地可以休息和补给。在和大批熊战斗并伤痕累累后,玩家团队可以到那里补给药水和获得治疗,而熊会被放置的FearZone阻挡在营地之外

Hanlon_Sebastian_Getting Inquisitive About_页面_39.jpg

 

下图的关卡编辑器里有一个30米的气泡覆盖了营地区域,把熊阻挡在外面,如果熊试图进入到里面,碰到FearZone后就会离开。但问题是,当玩家在区域时,熊会试图进入再被FearZone反弹回去,就不断的在哪里摇摆,感觉并不好。同时,因为有熊的敌对,玩家无法和任何的补给道具交互,在营地什么都做不了了。结果就是人卡在那里了,熊进不去,玩家也无法离开,也无法快速旅行。

Hanlon_Sebastian_Getting Inquisitive About_页面_40.jpg

 

要解决这个问题,首先要做的就是改变熊的AI,让AI“失明,不再做反应。这样熊看不到玩家了,就不会在试图去被Fear Zone弹开,只是单纯的坐在那里,最后就不得不去澄清游戏规则,当有敌意的熊不再积极的去进行攻击玩家队伍时,队伍可以脱离战斗了。这样就可以使用营地的设施,即便是熊就在外面等玩家出来,也可以进行补给。

通过解决这个问题,可以在有侵略性威胁的危险野生动物和玩家基本的生存性之间获得更好的玩法上的平衡,必须让玩家能够安全的跑路,不然就没法玩游戏了。

Hanlon_Sebastian_Getting Inquisitive About_页面_41.jpg

 

接下来讨论的是团队寻路时问题。在以前的游戏中,地图更加的开放,移动模型也很自由,可以跳过缺口,跳上障碍物,有些情况下爬到物体上面,可以不通过寻路来行走。下面的示例里,亮绿色的导航网格大范围的覆盖着,队伍的每个角色也都站在导航网格上。当让主角(inquisitor 审判者)跳上左边的找不到任何的寻路数据石头。虽然这样做的是对的,因为玩家不会因为试图用物理移动跳上去障碍物或者去那些看上去可以到达的地点而被卡住。但玩家的移动并不被AI参数约束。但这样当队伍中其他人要跟随玩家时就会产生问题,因为玩家可以到达的地方,AI却没有路可以去。

Hanlon_Sebastian_Getting Inquisitive About_页面_42.jpg

 

这样就导致一些重要的情况需要去解决。下图是另外一个例子,可以看到控制的主角审判者站在了屏幕中间的一个大石头上,没有任何的寻路数据。

Hanlon_Sebastian_Getting Inquisitive About_页面_43.jpg

 

如果这个时候切换操作到团队的其他角色,也就是画面旁边的铁牛(IronBull)那里,这时可以控制他走开,远离站在石头上的主角,因为没有路径数据,主角就没有办法可以自然的从石块上下来。

Hanlon_Sebastian_Getting Inquisitive About_页面_44.jpg

 

那么在游戏里,当玩家切换角色,角色变成AI控制后,他们就会瞬移过来。为了玩家体验考虑,通过会用相机的过渡,一些严重情况下会用黑色渐变来掩盖瞬移。玩游戏时很少会注意到这些的发生,这种方案很成功。

但这也给予了可靠性,需要确定进行移动和切换角色时,队伍成员里不能被落在导航网格之外。

Hanlon_Sebastian_Getting Inquisitive About_页面_45.jpg

 

所以,不论何时,队伍成员变成AI控制后,就要瞬移到最近的导航网格点上。理想情况下,玩家不会注意到有什么发生。

Hanlon_Sebastian_Getting Inquisitive About_页面_46.jpg

 

还有其他的涉及到穿越地形的情况,那就无法掩盖了。下图的示例里,玩家角色从悬崖上跳到了屏幕底部,并把队友留在了身后。

Hanlon_Sebastian_Getting Inquisitive About_页面_47.jpg

Hanlon_Sebastian_Getting Inquisitive About_页面_48.jpg

 

这样意味着,当玩家到达悬崖底部的时候,还是能正确的看到队友,他们已经在悬崖墙壁的后面了。然后队友找到一条路,绕道之字形的走下来,返回到玩家的位置。这里不应该直接从峭壁上面跳下来因降落而受到伤害。现在的位置是非常头疼的起始点,如果AI可以找到路,或者路径足够长,玩家可以远离队友,队友再从某个streaming chunk出发重新出发跟上来。

Hanlon_Sebastian_Getting Inquisitive About_页面_49.jpg

Hanlon_Sebastian_Getting Inquisitive About_页面_50.jpg

 

如果玩家远离AI,就要用实现的Leash Distance teleport的方法,当队友已经达到最远距离的话,就瞬移他们。还有就是要通过把他们移动到相机后面来掩盖瞬移。因为当玩家跑动时,是在相机的前面,其他队友跟随玩家的话,可能是在相机后面,如果玩家看不到队友瞬移的话,那么处理就是成功的了。

在一些情况下,可以关闭或扩展Tether的范围,像是解谜区域,要分离玩家的队友,把他们放在关卡中不同的地方。当进入或离开一个特定区域,可以设置个大门,里面就是安全的了,然后可以关闭Tether,因为玩家是在一个特定的区域里了。而在战斗中,也可以给予更多的灵活度来进行角色的走位以及更多的策略选择。在这种限制进入的特殊区域,要确保队友不能因为寻路系统的弱点而陷入困境。

Hanlon_Sebastian_Getting Inquisitive About_页面_51.jpg

 

另外一个要讨论的问题是,团队在一个大的开放世界里的攻击规则,队伍在一开始是寻找机会来命中敌人,基于以前游戏就有的规则,找到一些可以战斗的敌人,如果是敌对派系就和他们战斗。因为希望玩家在可以根据控制队友如何去战斗,而不必按玩家不感兴趣的或没有准备的方式来参与战斗。

所以是相对目标丰富的环境,所有的野生生物都可以战斗的,如果非常需要猪皮也可以去猎杀小猪。但玩家并不希望在试图完成目标时,队伍会停下来并去猎杀小猪。比起在眼前被击败的惩罚来这点更加让人讨厌。但队伍并不能自发的去攻击,我们要把控制交还给玩家。

Hanlon_Sebastian_Getting Inquisitive About_页面_52.jpg

 

所以这里有了一些队伍攻击的规则,队伍不能使用 FasterSwing(双手剑的技能)或者是攻击性的法术,除非是队伍中的成员有人被伤害,也就是说,不受到攻击前没法进行攻击,玩家必须去进行选择攻击,或者是团队里的成员已经造成了伤害,比如战斗已经开始了,团队也不会在等待玩家指令而自发的进行战斗。

这里还要发生的一个测试就是,AI只会瞄准那些瞄准了团队的生物,这是因为在游戏里当玩家进入到区域中,创建出的生物团队都是对玩家有敌意的,圣殿武士,强盗,他们会互相的战斗。在远距离会互相的战斗。团队AI会预先发现敌人在战斗中,玩家加入战斗,确定是否要和选中的角色团队战斗,战斗结束后,你的队友并没有停下来,玩家还没有准备战斗,AI就去打另外一组敌人了。这里的规则就是要么玩家操作所有的角色,或者玩家的AI控制的队友在开放世界战斗。

Hanlon_Sebastian_Getting Inquisitive About_页面_53.jpg

 

接下里所讲的就是如何解决龙腾世纪3中团队AI的最大挑战之一,通过创建行为决策系统(BDS)进行能力的选择。

Hanlon_Sebastian_Getting Inquisitive About_页面_54.jpg

 

这里的挑战是,生物有很多的能力,团队成员每个职业有30种不同的能力,每个角色最多可以加载8个能力,玩家通过游戏解锁这些能力,可以给角色增加和去除能力,当开始构建静态的决策树提供给团队AI时,会意识到一些问题。

Hanlon_Sebastian_Getting Inquisitive About_页面_55.jpg

 

首先是技术上的问题,下面的示例是要进行选择的序列,可以选择LongShoot(远射),或者选择潜行,而这里的技术问题是无法方便的从数据结构中增加或删除能力,为这些东西是按照顺序发生的,需要一定的层次结构。

Hanlon_Sebastian_Getting Inquisitive About_页面_56.jpg

 

然后试着看下面,把所有的能力都加入到序列,这是一个原版粗糙的能力表,所有的能力都是角色拥有的。

Hanlon_Sebastian_Getting Inquisitive About_页面_57.jpg

 

然后是有条件的排列能力,如果能力没有加载,那么就不会走到对应的路径里。

Hanlon_Sebastian_Getting Inquisitive About_页面_58.jpg

 

这样最后会有概念上的问题,远射(LongShot)可能是一个好的想法,无论如何都有合适的范围,

Hanlon_Sebastian_Getting Inquisitive About_页面_59.jpg

 

但一些情况下,投掷飞刀(ThrowingBlades )可能是更好的选择, 那就必须非常具体的构建评估,非常明确的只使用远射是最佳的,不会产生比别的选择更差的结果。

Hanlon_Sebastian_Getting Inquisitive About_页面_60.jpg

 

或者就选择不同的方法。

Hanlon_Sebastian_Getting Inquisitive About_页面_61.jpg

 

这里评估所有的能力,对所有能力评级,找出最佳选择。然后执行它。但这需要改变架构。

Hanlon_Sebastian_Getting Inquisitive About_页面_62.jpg

Hanlon_Sebastian_Getting Inquisitive About_页面_63.jpg

 

那么BDS就产生了,行为决策系统把AI评估分割成了两个阶段,第一个阶段是评估所有的选项,而第二阶段是执行最好的选择。这也就意味着,每个能力自身有两组逻辑,第一个是用来评估为什么或何时是最好的时机来使用这个能力,同样也包含了执行逻辑,一旦选择要执行,就需要决定是否移动,进入攻击范围,然后执行能力。

Hanlon_Sebastian_Getting Inquisitive About_页面_64.jpg

 

接下来看下这个例子,这是一个直接从关卡或游戏编辑器里打开的远射(LongShot)的评估树,画面左侧看不到的地方是一些preamble的内容,基本上是来说明这是个可执行的能力,关闭了冷却时间,或者因为不是个很好的选择而不可使用,都通过这个来处理。

Hanlon_Sebastian_Getting Inquisitive About_页面_65.jpg

 

下面第一个slot上给予的评估分数是20点,这里的20分代表远射是一个可以使用的相当不错的能力。

Hanlon_Sebastian_Getting Inquisitive About_页面_66.jpg

 

接下来要检查的是,在游戏规则里,使用远射时距离目标远一些更好。所以这里要进行检查,如果目标是中距离的话,那就给予5点评分。

Hanlon_Sebastian_Getting Inquisitive About_页面_67.jpg

 

如果距离更远的话,就给予额外的5点评分,那么这个能力就得到了完整的30点评分。

Hanlon_Sebastian_Getting Inquisitive About_页面_68.jpg

 

如果目标或角色的能力被玩家设置为优先使用的话,还可以得到额外的10点评分。

Hanlon_Sebastian_Getting Inquisitive About_页面_69.jpg

 

一旦这些发生,就会对能力评分,这里需要一组规则来构建这些评估,然后就可以在如何应用能力上取得一致性。下图里可以看到被动移动(PassiveMovement),也就是在战场里的移动,优先级是最低的,而基本攻击可以说是较好的选择,如果使用能力的话,优先级就会超过基本攻击。而支援能量有额外的奖励分数,有较高的优先级,以25点为基准,而不是攻击能力的20点。因为这是需要去响应的一些糟糕情况的,有些能力是需要在战斗开始前使用,所以要有更高的一些优先级,确保AI可以最开始就使用或者在需要的时候可以使用。

还有就是反应能力,真正需要及时使用的能力,例如格挡,躲避,有特定的帧的需求的,要在特定帧发动的才能起作用,这就是动作是如何被评分的:我们需要在框架里构建所有的评估函数。把范围进行划分,10点是范围值,5点是远距离的,就有了10个点数作为上下文,来评估是使用能力的时机是好是坏。

另外还有10个点数来做优先权的设置,玩家可以设置哪个能力使用更加频繁,这样所有种类的能力都有了20点分数的范围。

Hanlon_Sebastian_Getting Inquisitive About_页面_70.jpg

 

这里就完成了全部的评估,进行了移动然后执行远射或其他能力,角色的基本攻击是10点分数,而毒素武器(Posion Weapon)评估是25,铁蒺藜(Caltrops)技能是22fulldraw是指所有能力列表都是在冷却状态,被能力的preamble部分去除掉了,因为角色是满血状态,不需要使用治疗药水。当查看分数后,远射就是最佳的选择了。

Hanlon_Sebastian_Getting Inquisitive About_页面_71.jpg

 

然后下一个更新部分就是开始运行远射的执行树,AI决策循环的移动和执行部分,选择目标,选择能力,移动并执行能力。

Hanlon_Sebastian_Getting Inquisitive About_页面_72.jpg

 

如果角色和目标有一定距离,而且是在瞄准视线内,就会使用能力。

Hanlon_Sebastian_Getting Inquisitive About_页面_73.jpg

 

如果不满足以上条件,那么AI就会移动,直到可以接近敌人角色,假设达到位置后就在瞄准视线内了。那么角色就进入了正确的范围。

Hanlon_Sebastian_Getting Inquisitive About_页面_74.jpg

 

实现了这些以后,就一路执行到最后,实际的进行开火,播放这个能力的动画,发出抛体和冲击的特效,以及所有这个能力带来的效果。下画面右下角是让AI保持位置,当到达可瞄准的位置后,就不需要让角色继续向敌人前进了,并在适当的距离使用能力。这里非常需要注意的是,当在跑动时,并不能获得视线内的瞄准和正确的距离,这时执行树还是在更新的,让角色继续向目标移动,这时评估也还可以运行,一直都在持续重新评估选择,如果有了更好的选择,比如冷却时间到了,或者一些情况下要做很快的反应,一旦不在触发这个动画,要反应情况的变化,就要在下次更新时,为其他的的能力评估不同的能力执行树。

Hanlon_Sebastian_Getting Inquisitive About_页面_75.jpg

 

所以这里增加了一些有效的方法,作为通用系统实现BDS来对行为评分。这里可以加入移动的优先级,使用评估程序来检查角色是否在战斗里,运用不同的移动参数,通过行为树来控制移动。例如探索的角色会紧紧跟上,停留在很接近玩家的地方,当开始战斗后,角色会稍微后退并散开,近战角色会在前面,而远距离攻击角色会退到后面。还有个方法有很大的帮助,例如TetherFear Zone,这些可以覆盖掉决策树的结果。可以在优先系统里进行覆盖,例如进入Tether区域的时候,什么都不做。

Hanlon_Sebastian_Getting Inquisitive About_页面_76.jpg

 

行为决策系统中,可以在运行时增加和移除能力,因为采用的评分系统,不需要在关心评估的顺序,也就是说,合适的能力会被评得高分,而不用管这个能力是第一个还是最后一个获得评估的。还有方法可以对已有的函数库进行杠杆调节。我们通过这种手段获得很多收益:构建了决策树评估的函数库,任务节点,各种功能构建出相当复杂的逻辑,而且依然能在其他系统里使用这个东西。这里有了制作AI决策的强有力的工具,让队友更高效的在各种能力中进行更好的选择。

Hanlon_Sebastian_Getting Inquisitive About_页面_77.jpg

 

接下来的问题是反应能力,因为这个是需要为逻辑额外构建的。这里介绍的是在龙腾世纪3中新类型的能力,是在龙腾世纪起源和龙腾世纪2里并没有的。这个能力是在受到伤害时起作用,在受到伤害前进行反击。例如招架(Parry)是给玩家一个优势的反应,可以反击回去,而格挡(Block)可以抗击伤害,但仍然是停留在原地,最极端的是躲避,可以让角色躲开攻击,这个消耗是最大的,会失去战斗位置,需要重新的走位,调整姿势。

Hanlon_Sebastian_Getting Inquisitive About_页面_78.jpg

 

虽然希望可以对各种的攻击来使用正确的反应,但现在并不能知道攻击来于何处。这里使用了“AttackTelegraphs”。下面看到的是实际的战斗碰撞,由绿色的球体组成,是库纳利人枪兵的刺枪攻击。这个战斗碰撞是在攻击动作的20帧时产生。

Hanlon_Sebastian_Getting Inquisitive About_页面_79.jpg

 

而在产生的10~15帧之前,在角色前面放置的是一个很宽泛的Box,这样就允许去通知所有那些站在这个区域里的角色会被攻击到了。攻击要来了,如果不能成功的招架的话,就要去格挡,传送给被攻击角色的信息里,还包含了攻击者的位置信息,那么被攻击角色,就知道采取什么方式来进行反应。是招架还是格挡,或者是躲避,需要以那种方式来移动以躲开要到来的伤害。这些反应能力有更高的优先级,会覆盖掉角色其他可以做的事项。

但这样就过于成功了,例如Tank角色会激活盾牌格挡,把来自前面的攻击完全的无效化了。通过帧的完美精度,使用这种方法,可以对抗游戏里巨大可怕的敌人,经过一定时间就可以击倒他们了,因为可以格挡和反击,AI不会受到伤害的话,就可以打到非常厉害的敌人。这个听起来很好,只靠AI就可以打赢,但玩家就会有问题了,让AI去战斗,玩家不用参与战斗,玩家可以把控制器放在哪里去走开吃东西了。那么最后要去做的就是要增加一个共享的冷却时间,每个AI控制的队伍成员,当AI选择要做什么后,在要等待2秒时间,必须在使用高优先级的反击能力之间进行等待。给予玩家一个理由,不能让AI去替他们所事。这个是AI特定的冷却时间,并不会影响游戏的冷却系统,也不会影响玩家去使用能力,只是给了AI一些劣势,他们仍然可以快速的反应,但他们不能完美的进行格挡和招架。AI可以使用反应能力但不会远远的超出玩家的等级,从而产生消极的游戏模式。

Hanlon_Sebastian_Getting Inquisitive About_页面_80.jpg

 

同时,也需要玩家可以定制他们队友的AI,这里已经有了相对不错的基准经验,当给了队友能力,他们就会相当自信的来使用。但这里希望玩家可以在某些方式上受到AI角色的他们想要的支援。当玩家定制AI时,制定的决策和选择是可以在游戏里被观察到的,可以在游戏里看到选择的结果。知道AI做了不同的选择。

Hanlon_Sebastian_Getting Inquisitive About_页面_81.jpg

 

第一个等级的控制是,就是设置给予角色的能力,可以选择放置在角色身上的能力,而AI只会选择布置在上面的能力,这个是在上一代中就改变的。这里的能力对AI使用或玩家直接来控制都是有效的。当玩家角色间切换来进行攻击时,可以使用角色身上的所有能力。

Hanlon_Sebastian_Getting Inquisitive About_页面_82.jpg

 

这里还提供了额外层次的粒度,把AI的一些能力无效(Disable),玩家还可以控制角色使用这些能力,而AI无法自己选择这些能力了。这样有些冷却时间长的能力,就可以节省下来对应突发情况,或者是消耗大量资源的,玩家不希望AI去判断使用。

Hanlon_Sebastian_Getting Inquisitive About_页面_83.jpg

 

Enable是默认的选择,AI会按优先级序列来评估。

Hanlon_Sebastian_Getting Inquisitive About_页面_84.jpg

 

这里也可以按前面提到的那些设置为首选的,这个能力会被更加频繁的执行,也会以更高的优先级来进行评估。有些情况下当要选择一个合适的能力时,可以把AI规则放宽,例如AOE能力需要角色周围有3个目标是最佳的选择,那么如果放了2个敌人AI在那里,能力会被频繁的使用,因为玩家希望这个能力可以更多使用。

Hanlon_Sebastian_Getting Inquisitive About_页面_85.jpg

 

其他一些想提到的有意思的设定是索敌规则(TargetingRule),也是玩家可以定制的。选择目标,选择能力,移动和执行,是AI评估系统里重要的4个步骤,玩家可以影响AI是跟随或如何去选择目标,如果选择目标是跟随的话,就跟着玩家一起打,如果选择目标是防御的话,就打打玩家的怪。或者是通过仇恨系统,保护特定的角色,对威胁进行反击,在优先级上对那些对瞄准了制定角色的敌人进行攻击。

通过这些设定,玩家可以用一种有意义而不可见的方式,来设置AI如何去选择敌人,如何去使用能力。

Hanlon_Sebastian_Getting Inquisitive About_页面_86.jpg

 

这里同样还有的是支持的战术视角的指令,玩家直接给队友下达指令,直接命令可以使用能力,移动到某个位置,或是给予行为指令,在底层的修改AI的工作。

Hanlon_Sebastian_Getting Inquisitive About_页面_87.jpg

 

直接命令有移动到位置,使用能力,和一些相当简单的执行,就好像是被AI选择了一样去执行一个能力,当玩家给予指令时,可以挂起AI的决策制定,不需要在后台一直运行行为评估,直接跟着玩家指向移动直到指令成功完成。

Hanlon_Sebastian_Getting Inquisitive About_页面_88.jpg

 

另外就是行为指令,它可以修改AI如何去工作,例如攻击敌人(Attack Enemy),就会覆盖掉整个AI看到的整个目标选择列表,每帧每次更新都会以哪个敌人为目标,直到他死亡。保持位置(Hold Position)比较的复杂,因为会同时影响目标选择和技能选择,AI就会违背一开始的选择。这里也增加了一些最小的tether行为,当他们被击倒时,还会在按玩家的要求战斗中保持位置的要求,不做任何事情就先返回原来位置。还有就是保护盟友的指令,可以像前面提到的那样使用来保护目标,可以在决策树的高层直接覆盖目标。

Hanlon_Sebastian_Getting Inquisitive About_页面_89.jpg

 

发现这么做有个好处,就是行为决策系统对生物系统也有好处,能够很快速的迭代不同的生物的系统,而且能加入有意思的技能,让生物在玩家之间跑来跑去。替换、增删改的成本更低,因为技能对应 AI是随着技能一起的,而不是分离的,

Hanlon_Sebastian_Getting Inquisitive About_页面_90.jpg

 

 

可以做很多怪物的变种,稍微变下技能就行。也可以做做很复杂的龙,譬如龙有58个不同的技能,实时在评估58个不同的选项,决定龙的行动。

Hanlon_Sebastian_Getting Inquisitive About_页面_91.jpg

 

Hanlon_Sebastian_Getting Inquisitive About_页面_92.jpg

 

 

 

 

 

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

游戏学院公众号二维码
腾讯游戏学院
微信公众号

提供更专业的游戏知识学习平台