SE工程师:如何运用大数据和AI解决手游平衡性的难题?
【GameLook专稿,转载请注明出处】
GameLook报道/对网络游戏和竞技游戏来说,平衡性是玩家最关心的问题,也是让开发者最头疼的话题之一。尤其是对于拥有大量角色和装备的游戏而言,平衡性测试本身就需要大量的时间与资源。在手游平台,随着游戏更新频率的提升,平衡性问题就显得更为复杂。
在此前的GDC演讲中,Square Enix日本AI工程师Kazuko Manabe讲述了动作战斗手游《格林笔记Repage(Grimms Notes Repage)》的平衡性调整方法,她的团队通过AI工具的方式对游戏里的数百个角色和大量道具组合进行测试,用比较快速的方式找到了影响游戏平衡的因素。
以下是GameLook听译的完整内容:
Kazuko Manabe:在加入Square Enix日本工作室之前,曾担任多款主机游戏的程序员,目前我的工作主要是AI方面,负责做QA,尤其是用AI进行游戏平衡性的测试与调整。今天的主要内容是通过《格林笔记Repage》手游案例来谈谈如何使用AI调整游戏平衡性。
《格林笔记Repage》是一款动作战斗手游,下载量超过1700万次,它的主要玩法如下:
首先,在战斗之前准备阵容,选择角色和他们的装备;随后,参加自动战斗,所以玩家在战斗期间不能(对阵容)做任何事。战斗完成后,玩家可以根据战斗结果获得奖励,用来提升角色能力,然后继续重复整个流程。
阵容由4个主要角色组成,每个角色都有2个英雄作为辅助,而且只有英雄参与战斗。游戏里设计了数百个英雄,每个英雄都可以配备装备,比如武器和饰品,游戏里的武器有近百种,每个武器都能使用最多5种强化道具、有60个等级。
英雄在战斗中的表现取决于其英雄AI状态值,每个英雄都有预设值,玩家们也可以对此进行定制化。虽然动作路径比较简单,但这些都会随着英雄属性的变化而改变,因此你很难找到每个英雄的最佳AI设置。
最终,一个阵容是由8位英雄组成(如上图)。
看完这个组合,你就会理解为何这款游戏的平衡性调整简直是噩梦了:我们有8个角色,80名英雄,它们之间的组合可能性是10的182次方种。
更重要的是,这款游戏每隔一两周都会增加新角色、新武器、新物品等等,因此每次更新之前都要做平衡测试,如果通过人工来做,考虑到所有的组合可能性和有限的时间,这几乎是没有可能实现的任务。
我们对于平衡性的想法是,不妨组成最强的阵容,如果有些元素在游戏里的影响力很强,那么最强的组合就应该具备这些元素。
这种方法又被称之为优化伪证法,它利用全局优化方法来引导面向输入空间中可能导致错误系统行为的区域测试,这样就更容易找到破坏平衡的因素,我们还希望通过这种方法找到武器与角色之间的基础组合。
左侧的阵容是我们组合的,右侧是对手阵容,上方是生命条,战斗结束后生命值高的一方获胜。
这名角色比较特殊,她每击杀一个敌人就会给队友带来一定的治疗效果,由于角色AI设定的关系,她经常使用大招,大招可以改变她与敌人的距离,每次大招消耗2个行动值,在战斗中,只要行动值,这个英雄就会自动探测并释放大招。我们的方法从未给大招触发设置具体指标或者动作,但AI还是会根据战斗结果自动触发大招技能。
用遗传算法(GA)找破坏平衡性的关键因素
我们创造阵容的方法是通过遗传算法(Genetic Algorithm,简称为GA),这是一个基于生物进化来优化组合的方式,它基于环境的不同对每一个单位进行进化模拟。进化是基于不同单位之间的共同点,总的来说,经过几代的进化之后,所有单位都变得更好。
环境是我们想要解决的一个问题,在《格林笔记》当中,这个环境就是战斗。玩家是解决问题的参与者,每个英雄都有固定的数值,它们在战斗中带来的结果范围也有差异。
之所以使用GA法,并不只是它能找到破坏游戏平衡的元素,还因为它简单易用,且容易知行。这个理论出现的很早,我们能在不同媒体找到它的详细解释。另外,我们能在有限的时间里找到问题的次优解,而且可以根据需求随时停止。因此,GA总的来说非常适合产品研发。
GA的流程如下:
选择最初的阵容之后,评估这些阵容,选择最好的阵容,然后混搭,然后转换一些阵容,达到特定的要求或者特定时间内没有达到要求的条件,这个过程就会停止。
接下来我们用实例来说明过程:
第一步很简单,GA随机选择角色和装备,然后用它们创造阵容,这些随机生成的组合就是第一代。
第二步是评估阵容,主要方法就是评估它们在战斗中的表现。在《格林笔记》中,我们主要聚焦于PvE和PvP两种类型的战斗,在PvE模式中,玩家们与游戏预置的阵容战斗;而在PvP模式里,玩家的阵容与其他人选择的阵容战斗,两种战斗都是自动的。
我总结了两种战斗的差异,看起来没有多大的差别,但评估方法却有很大的差异。PvE战斗中,玩家们获得的奖励是材料,而且挑战次数不限,战败之后没有惩罚,因此获胜速度很重要,因此我们的评估标准是战斗时间(战胜)和造成的伤害量(战败)。
PvP模式里,玩家们的奖励是竞技场点数,我不会解释点数具体有什么用,但关键在于,如果战败,就会丢失点数,而且由于挑战次数有限,玩家们希望能够最大化利用挑战机会。因此在这种情况下,稳定的高胜率很关键,但是,玩家又不能选择对手,
在衡量胜率的时候,我们打造了一个阵容来挑战排行榜头部的玩家,并且将平均结果作为评估标准。由于头部玩家的游戏风格不同,因此我们得到的最优组合可以赢得与多风格对手的对局。
所以在衡量PvP阵容的时候,主要衡量标准是剩余生命值,然而有时候,战胜和战败的生命值相差不大,所以我们为胜利增加了固定的额外点数奖励。
评估方法很重要,不仅可以衡量阵容,还对AI的学习方法有影响。打造一个适合的评估方法需要时间,我们需要考虑的是,游戏的精华到底是什么,因此我们选择具体化的标准,让这个评估得到更高的价值。
在《格林笔记》中,GA分别通过时间和伤害值的方式评估获胜与战败两种情况下的阵容,但如果单位不同,这种评估可能会不准确,因此我们将这些值放到了同一个轴上,对于PvP,我们也采取了类似方式。
第三步是选择最优阵容。经过评估过程之后,我们决定选择头部80%的阵容,用它们的基因创造下一代阵容,其余则被淘汰。
第四步是阵容混合。我们将选择的阵容分为3种结构,然后随机选择不同结构的不同部分组合成新阵容。
第五步,将阵容的一部分变异。变异的主要方式是随机去掉并替换一个子分支,然后得到一个极为稀有的结果,不过这种方法的不利在于,变异成功的概率只有5%。
你们可能觉得,这么低的概率是否会对运气过于依赖?但在不断的实践中,我们发现有些角色始终会出现在最优阵容中,还有些角色根本没有在第一代阵容出现,因此第五步对整体阵容是否强势的影响并不大。
我们的GA过程主要是通过战斗、评估、基因提升的不断循环过程,由于评估和提高过程并不发生在游戏内,所以我们需要一个调试与结果沟通的流程,为此我们使用了API,因为我们将游戏的一部分研发做了外包。
因此,使用API适合我们这种研发方式,但如果所有成员都在同一个研发团队,可能就不需要这么做。
在提高之前,我们还增加了基因转化流程,以便让这个方法可以运用到其他游戏里。简单来说,战斗部分是直接使用在游戏里的,而基因提升过程是与团队共享,基因评估与转化则是可以定制化的,所以这种方法对所有游戏都可以用。
这是我们对PvE战斗的评估结果,蓝色是胜利结果,绿色是战败数值,X轴是进化代际,Y轴是战斗时间。可以看到,一开始的时候,几乎所有阵容都是失败的。首次获胜阵容出现之后,每一代都会有更多的胜利阵容出现,而且战斗时间也开始减少,PvE战斗的胜利相对容易,所以这种模式的测试问题不大。
这是PvP模式的结果,我们看到,适应值越高,阵容表现就越好。为了测试最佳阵容,我们分别对训练阵容和测试阵容进行了300次战斗,结果它们之间的胜率很接近,意味着我们的最佳阵容能够战胜大多数的阵容。
平衡性数据分析的视觉化
在增加了新角色和物品之后,最佳阵容的表现就有了差别,即便是有视频回放,你也很难看出所以然。因为GA方法很复杂,因此需要用视觉化的方式理解这些信息。
由于游戏更新频繁,视觉化工具必须是低成本的,而且增加功能或者改变功能必须是很容易做到。我们选择了开源的Apache Zeppelin(包括它所需要的工具),这样就可以在任何需要的时候看到视觉化的结果。
在这张表格里,我们可以看到一个阵容的15次战斗表现,每次战斗都会有很多细节信息,包括AI类型、武器装备以及战斗中发生的事情。总的来说,第一部分展示的是战斗结果,随后是每个角色的更多细节信息,但这种表格依然很难看懂。我们可以通过降维和抽象方式让结果视觉化:
1)降维:找到最佳阵容对游戏策划是很有帮助的,因为你能通过它发现固定组合的强度,或者找到与最佳组合类似的阵容。目前为止,唯一的方法是看阵容组成表,并据此找到类似阵容。
即便是最少的情况下,想要通过表格看出结果也是很困难的,因此我们需要更好的方法让这些信息视觉化。
在《格林笔记》案例中,我们将21个维度降到了2个,比如头部的数字都比较接近,每个数字代表的是阵容ID,如果要找相差很大的阵容,左下方的绿色数字是不错的选择。
2)抽象:
表格里的UHADS是不同数值,如果一个英雄的生命值为74000,它是高还是低?绝对的数字是没有意义的,关键在于它与其他数值相结合之后的结果。
在实际测试中,会有很多例外的情况发生,这时候我们可以用标准偏差的方式找到通用值,比如这里的CD区域就是常见值。
在英雄AI当中,我们忽略触发条件,只关注动作环节,通过缩写的方式让动作类型展示起来更简单,比如大招是U,而F则代表完整组合攻击。
比如这里我们可以看到,英雄的AI是相似的,而且能看到这个英雄的攻击性很强。
从数据重要性来看,表格中的左侧数值优先级更高,它们是优先评估项。
我们还可以通过对不同敌人类型的胜率看出阵容优劣。
比如在这张图中,红框中的英雄是最高输出者,也是最佳的医生,她在给敌人造成大量伤害的时候,还让保持了阵容英雄全部存活。
在实际测试中,我们发现一些伤害很高的英雄并不受玩家欢迎。比如上图里的角色存在于对手阵容,但我们测试中的一个角色虽然伤害不高,但她的大招却可以让对手暂时无法行动,因此非常受玩家欢迎。
需要说的是,上面的截图并不是我们录制的视频截图,而是游戏里的回放功能。如果只是数字表现,游戏策划可能无法准确判断很多细节,他们需要视觉化的结果,因此回放功能可以给这些数据带来视觉化证据。
有时候,一些英雄的数值看起来很高,但却不是破坏平衡性的那一个。比如Scheherazade,她的伤害很高,但角色很难获得,通过与策划沟通之后,他们发现该角色在战斗中的表现与最初设计的目标一致。
在寻找其他破坏平衡角色的时候,我们去掉了数值最高的角色,然后重新用GA方式评估。
总的来说,我们的平衡性调整步骤是,打造游戏环境,放到自动战斗环境中通过GA工具测试,然后根据结果,与游戏策划核实这些平衡性问题是否需要调整。
那么,GA的表现怎么样?我们用了不同的方法
首先是打造了一个快速模拟解决测试问题,即用数字计算的方式展示战斗结果。一场战斗只需要一秒就能完成模拟,然而,这种模拟与实际战斗是有差别的,因此它的结果很难被证明。特别是在游戏更新之后,我们还需要手动更新这个模拟器,这不仅带来额外的工作量,还容易在游戏更新之后忘记更新模拟器,所以放弃了这个方法。
第二,直接让GA与游戏逻辑连接。
这种方法可以保证战斗结果与游戏内实际战斗一致,通过回放功能,策划还可以看到视觉化的结果。
另一方面,这种方法需要对比大量数据,而且代价相对较高,也是我们目前在使用的方法,因为精准度对我们的游戏很重要。
更好的方法,对自动战斗游戏来说,使用游戏内逻辑是比较好的方法,确保战斗精准度是必要的。
支持加速模拟,在手游领域,缩短游戏时长是有必要的。另外,使用云服务器是必要的,当然,这些都需要与游戏代码不冲突。
游戏平衡性是一个持续改进的过程,每一次更新都会带来不一样的影响,甚至每个英雄在更新之后的强度都有对应变化。
然而,我们目前还没有可量化的工具,衡量调整后的平衡性是否达到了团队最初的目的。
在现有条件下,我们的下一个目标是让更多的细节视觉化,比如将抽象组合组成部分聚类展示,这样不仅能看到现在的平衡调整结果,还可以看到过去的表现。此外,还可以通过箱线图将极少数的情况包括在内。
总结
对于拥有大量数据的游戏来说,找到最重要因素是做好平衡性的关键,今天说的GA方法只是一种方案。
对于平衡性分析来说,数据视觉化是很必要的。
自动战斗环境也是很重要,它应该尽可能精准,最好是可以自动更新。最重要的是,平衡性测试与调整工具应该在游戏研发很早的阶段就开始做,哪怕是再忙,这对你的时间和预算也是有帮助的。
如若转载,请注明出处:http://www.gamelook.com.cn/2021/07/446630