Warframe中的关卡节奏管理和地图生成.
有机紫菜
2024年07月23日 18:34

WF中使用一个AI导演的脚本.使用房间块预制体,来生成地图.

来管理关卡节奏.这在一些随机地图生成的游戏中很常见.下面文章主要讲解了这部分实现.

WF负责使用场景缩略战术图,和其中配置好的不同节点数据,来统一进行刷兵位置,和游戏流程监控,警报,以及场景可见性等(场景自己发射线),从而安排动态的游戏节奏.

这一点你可以从其他一些,射击游戏中体验出来,有些游戏是固定的设计刷兵体验,感觉上确实有些欠缺,WF的这种看不到的部分,制作的更加友好,尤其是针对捕获与歼灭这种任务.

但也要注意.需要这样安排,一个是因为WF的地图太大,而且很长.要跑的地方很多.如果说小地图的话,刷怪点就在玩家最容易活动的热力学显像区域.基本集中在这些地方.就好像D3的大秘境小秘境,怪海的安排,基本上是由配置器,与生成器概率固定生成的.根据配置好的概率,而怪的出生点也只有靠近玩家时候会自动刷出,并无WF的动态敌人刷出点的事情,---但是否需要判断玩家战斗节奏,则是肯定的.比如死亡细胞.WF,以及求生之路这些游戏,无一列外都分析了玩家的遇敌作战强度评分.通过评分来适配玩家的作战节奏强度,让怪一波波的来,有体验性.这一点还是要学习的.

下面是AI翻译的内容


在《warframe》中管理程序关卡的节奏 丹尼尔•布鲁尔

1 介绍 《战争框架》是一款协作式在线动作游戏,玩家在其中扮演手持机枪的太空忍者, 并在程序生成的关卡中执行任务。随着时间的推移,玩家会获得经验并完善自己 的角色,从而让他们能够面对更具挑战性和数量众多的敌人。 由于关卡是程序性的,玩家永远不会体验到完全相同的关卡布局。虽然这能 保持体验的新鲜感,但不断变化的大小和布局意味着传统手工制作的关卡设计技 巧,如触发量和刷出脚本,不能依靠这些技巧来控制节奏。相反地,《战争框架》 使用AI总监去理解程序关卡的结构,监控玩家周围行动的强度,并追踪他们的进 程。有了这些信息,系统就可以智能地刷出敌人,为玩家提供有趣而适当的挑战。 在这篇文章中,我们将首先描述在战争框架中生成程序关卡的方法。然后我们 将讨论AI总监用来理解生成关卡的结构和流程的数据结构,我们如何衡量玩家周 围行动的强度,以及我们如何在运行时控制节奏。最后,我们将介绍设计师如何 与AI总监一起处理游戏中的一些特殊情况。

2 程序关卡生成 战争框架级别是通过连接预制块生成的。每个方块都是由设计师精心制作的,有许多外部门户,充当 将方块连接在一起的插座。只有尺寸相同的兼容门户才能连接起来,如图1所示。例如,一个5x3的传 送门只能连接到另一个5x3的传送门,不能连接到一个宽的9x3的传送门。关卡方块可以根据需要进行 旋转和变换,排列出兼容的传送门。

图1关卡块只能通过兼容的入口连接。左图为相同大小的兼容门户之间的有效连接。右图显示不同大 小门户之间的无效连接。

每个块都按块类型进行分类,并指定其适当的用途。这些块类型包括Start, Connector, Intermediate, Objective和Exit。关卡总是以Start块开始,以Exit块结束。连接器是较小的块,将较大的块连接在一起并 将它们分开。最后,中间体是更大、更复杂的战斗空间。一个区段就是一系列相连的关卡块。由于大 多数关卡只有一个目标,我们通常有两个片段,一个在Start和objective之间,一个在objective和Exit之间。 段可以是随机长度,由Connector和Intermediate块组合而成。使用每个块类型的首字母,平均级别可以 表示为字符串,

“SCICOCICE”,或者更长的字符串“SCICICOCCICCE”。(让我想起了玄骸名字的生成)

对于每一个任务,设计师都会配置一个程序性的关卡模板,规定关卡在运行时应该如何生成。该 模板列出了哪些方块是可用的以及它们的方块类型,同时还指定了每个片段的长度和组成,以及最大 分支深度。然后布局生成器将使用此模板创建一个块类型序列。对于每个块类型,生成器随机洗牌并 选择一个块,将其与之前选择的块连接起来,以创建可玩的关卡。生成器需要确保这个关卡是有效的, 并且不会重叠自身,如图2所示。为此,需要进行深度优先的递归搜索,如果无法将块放置在有效位 置,我们就展开前面的步骤并尝试不同的选择。该算法用清单1中的伪代码进行了描述。 为了减少程序关卡模板无法生成任何有效关卡的可能性,我们使用自动化测试来尝试生成数千个 布局。这使我们能够检测我们是否未能生成任何完整的布局,或者是否有过多的回滚 

需要找到一个有效的布局。当需要提高成功率时,关卡设计师要么修改传送门的位 置或现有方块的形状,要么创造新的方块,增加可用于生成关卡的方块种类。作为 一般规则,我们推荐一个池大小,允许算法为任何特定生成的布局选择大约15-20% 的可用块。如你所料,更复杂的带有弯曲或环回的块可能会导致布局问题,因为它 们进一步限制了可行邻居的集合。添加更多只具有彼此相对的入口的块可以帮助创 建块之间的距离,以避免重叠。我们还尝试在每个过程模板中只保留一个或两个门 户类型,因为在尝试添加块时使用太多不同大小的门户可能导致有效选项太少。

block分为Start (开始)、Connector (连接器)、Intermediate (中间件) 和 Objective (目标)。等类型。当尝试在关卡布局中放置一个 块时,不允许与现有块重叠。

通过调整开放门户列表的构造方式,可以控制生成多少分支。如果将开放门户列 表限制在最后放置的区块,这将导致一个没有分支的线性关卡,类似于将区块推到数 组的末尾。然而,允许开放门户列表包含来自先前放置的区块的未连接的门户,则允 许新区块从另一个更早的区块生成分支。 一旦布局完成,可能仍然存在未连接到任何东西的门户。在这些入口上放置 盖子以密封关卡,并放置门配件 

将方块连接在一起的入口,掩盖任何接缝。 设计师会为每个任务和环境指定不同的模板。例如,飞船上的“灭绝”任务将 有自己的布局模板,这与行星前哨上的“破坏”任务不同。布局模板确保只选择适 合任务的方块,并防止在“破坏”任务中选择“暗杀目标”方块,或者在室外关卡 中选择飞船方块。 

3 理解关卡结构 为了让AI总监在运行时做出节奏决定,他需要一种方法去推断任何生成关卡的结构 和流程。我们需要确定玩家应该走哪条路来达到他们的目标,如果他们目前正在接 近或远离这个目标,以及敌人应该在哪里刷出,以确保他们对游戏玩法产生有意义 的影响。为了做到这一点,我们使用了一种叫做战术区域地图或“战术地图”的工 具。 战术地图本质上是一个粗略的走廊地图。它是一个表示关卡结构和流程的图形 结构,如图3所示,可供AI总监使用。图中的每个节点被称为一个区域。区域之间 的连接表示一个人如何在关卡中从一个区域移动到另一个区域。为每个关卡块离线 创建一个战术地图。在运行时,在生成程序布局之后,所有单独的tacmap然后连接 在一起,形成一个代表整个关卡结构的单个图。门和街区之间的连接在战术地图上 都有标记,这样我们就可以识别阻塞点,并根据门是否被锁上做出决定。战术地图 比用于寻找路径的导航网格更粗糙,但比关卡块更精细(参见图3),并提供了制定 战术决策的实用细节。 

图3。将战术地图的粒度与导航网格和关卡块进行比较。 我们经常需要在关卡中搜索实体,比如刷出点、掩体位置、报警面板等等。为此, 我们向战术地图图中的区域添加对这些实体的引用。关键的是,这允许搜索遵循关卡 的结构,而不仅仅是直线距离。 各种形式的影响地图用于追踪AI总监可以用来制定节奏决策的运行时属性。与 传统的2D网格不同,影响图是在战术地图上设置的,允许影响在区域中积累,并通 过图中的连接扩散到相邻区域,这表示通过关卡的实际流动。作为一个额外的优势, 由于战术地图是3D的,而不局限于2D平面,它也可以处理垂直。 根据游戏的不同,你可能需要考虑一些潜在有用的影响力地图。下面我们讨论 四个比较重要的地图,分别是距离地图、玩家影响力地图、活动区域地图和可见度 地图。

3.1 距离地图 距离图是通过将包含目标的区域以0的距离进行播种,然后从目标执行 Dijkstra洪水,沿着战术地图区域之间的每个连接填充整个图来生成的。这样就提 供了玩家需要行进的实际距离的合理表示,这可能不是一条直线,只需要在目标 发生变化时进行更新。 一旦计算出来,距离图就会向Director提供玩家通过关卡的进度以及他们到目标 的剩余距离。通过标注哪些相邻区域的距离得分较低,Director就知道了玩家走向目 标的隐含方向。然后,我们可以通过跟踪玩家与目标的距离,来确定他们是朝着这个 目标移动还是远离这个目标。距离图还可以用来对敌人掩体选择算法进行偏置,以鼓 励敌人占据玩家和目标之间的位置

3.2 Player-Influence地图

玩家影响地图是通过在包含玩家的区域设置较高的影响力,然后随着玩家的分布 而线性衰减。这张地图每秒更新多次,我们同时使用当前值和与前一个值的差异。 如果差值为正,则意味着玩家的影响力在增加,这是由于玩家向这个区域移动造 成的。同样,如果差异为负,则由于玩家远离该区域,玩家的影响力正在下降。 这让我们可以在玩家之前选择敌人的刷出位置,即使玩家正在探索并远离目标。 这意味着敌人更有可能被玩家遇到,并对游戏玩法产生影响。如果我们在玩家通 过关卡时在他们身后生成敌人,那么这些敌人很有可能永远不会被玩家遇到,这 简直就是在浪费资源。 

3.3 活动区域地图

由于关卡可以扩展,因此活动区域地图可以让我们在玩家前进时保持一个活动泡 泡。活跃区域内的敌人被认为与游戏玩法相关,而这个区域外的敌人可以被消灭、 摧毁或传送到新的位置,从而在不浪费资源的情况下给玩家施加压力。 为了计算活动区域,与球员在同一街区内或相邻街区内的任何区域都被标 记为活动分数。所有其他区域的分数会随着时间的推移而衰减,直到达到零, 此时该区域被视为非活动区域。在玩家在方块边界之间来回移动的情况下,这 个衰减时间在停用敌人之前提供了一个短暂的延迟。

3.4 能见度地图

当战术地图离线构建时,通过在区域之间投射许多光线来计算区域之间的近似 可见性。区域的大小决定了所需的光线数量,因为它们均匀地分布在每个区域。 如果所有的光线都被阻挡,我们可以假设这些区域之间没有视线。如果一些光线 没有被阻挡,我们可以假设这些区域可能是相互可见的。这些结果被编码在一个 查找表中。 在运行时,能见度地图将基于玩家的视锥在整个战术地图上使用这个能见 度近似查找表进行计算。玩家可见的区域会被标记为分数,分数会随着时间的 推移而下降。从Director的角度来看,任何得分为正的区域都可能是玩家可以看 到的,或者可能是最近被看到的。随着时间的推移,分数的衰减提供了一些滞 后,因此如果玩家迅速改变方向,这将防止敌人在玩家转身时在背后刷出。 此外,我们在开始时将所有可见性分数初始化为-1。这表明他们还没有被玩 家看到。这可以让AI Director继续在玩家看不到的房间里刷出敌人,直到玩家访 问了那个房间,还可以提供一个指标来衡量玩家已经看到和清除了多少关卡。 

4 测量强度

为了控制起搏,我们首先需要测量它。然而,节奏是很难量化的:玩家周围到底 发生了多少动作?玩家的参与度如何?我们是需要刷出更多的敌人,还是应该稍作 放松,让玩家在继续之前收集好自己?此外,《战架》中的玩家可以通过完成任务、 升级角色和装备来获得经验。因此,之前可能对他们有挑战的遭遇战,在玩家之 后再次玩任务时可能会变得过于简单。 虽然我们一直在尝试更高级的强度测量计算,但通常简单是最好的。为此, 玩家每次受到伤害,她的强度就会提高。这个数量与受到的伤害与她的总生命值 和护盾的标准化比例成正比。玩家每击杀一个敌人,她的强度值就会与玩家与该 敌人的距离成正比地上升。如果玩家被敌人盯上了,我们会保持这个强度,否则 会随着时间的推移而衰减。这是一个类似于《求生之路》(Booth 2009)中使用的得 分指标。 虽然不是一个完美的分数,但它合理地估计了那些杀死敌人或自己受到伤害 的玩家比那些没有受到任何伤害也没有杀死任何敌人的玩家更有可能处于行动的 高潮。

5 控制节奏 

既然我们有了衡量玩家行动强度的标准,我们就可以尝试塑造游戏体验了。如果 我们将强度随时间的变化绘制成图表,我们希望这个图表具有类似于过山车的有 节奏的上升和下降模式。当玩家探索并遇到敌人时,一场交火就会随之而来,从 而导致强度的上升。在玩家派遣敌人后,强度逐渐减弱,直到玩家遇到更多的敌 人,强度再次开始上升,如图4所示。

图4:在游戏过程中强度会上升和下降。如果强度达到100,它已经达到了顶峰,我们会 推迟刷出更多的敌人,直到强度减弱,给玩家一个在激烈的战斗后深呼吸。 我们在Warframe中控制节奏的主要工具是刷出敌人。当强度较低时,AI总监 应该在玩家之前生成更多敌人,并且应该随着强度的上升而继续生成敌人,直到 达到最大支持值或峰值。一旦强度达到峰值,我们希望在短时间内保持峰值,然 后后退并停止刷出,直到玩家有机会派遣所有敌人并从战斗中恢复。然后强度会 逐渐下降,直到达到零,然后再次开始刷出过程。当玩家遇到下一组敌人时,强 度会再次上升。 改变玩家周围活跃敌人的数量可以让我们控制游戏体验。

由于玩家自然会被 冲突所吸引,因此我们可以巧妙地引导玩家走向目标,如果玩家正朝着目标前进, 我们可以让更多的敌人刷出,如果玩家正远离目标,我们可以让更少的敌人刷出。 如果玩家还没有被发现,我们会使用一个活跃敌人数量的下限。这样就可以让我 们的太空忍者进行一些潜行的玩法,偷偷溜过为数不多的巡逻守卫。一旦玩家被 发现,警报响起,我们希望增加敌人的活动,因此增加活动限制。 最后,上限还取决于格挡的类型。连接器块往往较小,因此有较低的限制。 中间方块代表更大的作战区域,有更高的限制,而目标方块会有最高的限制。 由于我们的程序性布局生成通常会产生通向目标或出口块的交替连接器和中间 块,这有助于调节敌人数量并提供令人满意的节奏。 

6 敌人产生器

在决定刷出后,AI总监需要决定哪些敌人以及在哪里创造它们。任务会指定一个 可用敌人类型的列表,他们的选择概率和一个可选的最大同时限制。使用加权随 机选择允许AI总监生成许多普通步兵和更少的专家或稀有单位。对某些敌人类型 设置最大同时限制可以确保玩家不会偶然进入一个满是极其强硬敌人的房间,而 是会以更合理的数量遇到他们。 一旦我们选择了要刷出的敌人类型,我们想要确定敌人对游戏玩法的影响最 大的地方。如果玩家已经完成了目标,并且正在走向出口,那么在关卡开始附近 刷出敌人是没有用的。我们也不希望在玩家最近清空的房间里刷出敌人。

为了避 免破坏沉浸感,敌人通常不应该在玩家的视线范围内刷出。一般来说,敌人应该 出现在玩家前方并靠近他们的地方,但却在玩家的视线之外。 某些关卡和敌人允许特殊情况下的刷出。例如机器人部署容器,当容器打开 并激活里面的机器人单位时,会有一个特殊的部署动画。在这种情况下,最好使 用a 10 玩家可以看到的特殊刷出点,这样他们就可以见证到达事件。AI总监首先会尝试为 敌人找到一个特殊的刷出点,但如果没有,它便会选择一个普通的隐藏刷出点。

AI总监用于在战术地图中搜索刷出点的算法是宽度优先搜索,如清单2所示。 这种搜索从包含玩家的区域开始并向外扩展,将区域保持在给定的约束范围内,并 丢弃不合适的区域。接下来,我们从每个有效区域收集有效刷出点。由于对有效区 域的搜索从玩家展开,所以有效刷出点的列表将通过增加与玩家的距离来进行近似 排序。我们选择一个高斯随机数偏向于0的点,这将倾向于更接近玩家的点,而不是 更远的点。

清单2用于在战术地图中搜索敌人刷出点的算法。对高斯兰德的调用将在高斯分布 的范围内生成一个随机数,其平均值为0,标准差为0.5。

7 任务特定的复杂情况

前面的部分涵盖了AI总监处理的大多数情况。然而,有些任务需要一些特殊情 况的处理,我们将在下面进行描述。

7.1 歼灭任务

消灭任务要求玩家通过线性的、无分支的挑战并消灭特定数量的敌人。AI Director不 仅需要确保生成的敌人数量达到要求,还要确保它们在玩家到达关卡终点之前就已经 生成,并且它们在关卡中是分散的,而不是在开始或结束时聚集在一起。另外,我们 也不希望敌人的集中是完全均匀的,因为这样会显得很无趣。相反,理想情况下应该 是均匀的 11 一群敌人和一些预定的活动高峰。

第一步是确定任务所需的敌人数量,牢记预期体验的合理密度。如果我们在一个 很小的关卡中需要太多的敌人,我们就需要同时刷出太多的敌人,以便在到达出口之 前将它们全部创造出来。或者,在一个大关卡中敌人太少会导致非常稀疏、无趣的节 奏。为了达到合理的密度,我们根据从距离图中读取的到目标的最大距离来计算要刷 出的总数,以确保与关卡大小相匹配的敌人数量合理。

使用人口图来比较通过关卡的进度与到该点需要生成的总人口的百分比。该图 的斜率表示遇到敌人的密度。斜率越陡,遇到的敌人越多,斜率越平,遇到的敌人 越少。如图5所示,我们使用带有两个峰值的分段线性图来确保所有敌人刷出并且玩家 在通关的过程中会遇到各种各样的敌人集中地。 

图5:消灭任务的人口图是固定的,并提供了两个活动高峰,以确保所有敌人在到达关 卡结束之前都会刷出。对于交叉火力任务,该图表被移动,以匹配战斗前线在关卡中 的位置。

7.2 多派系的交战

交叉火力任务的运作方式与灭绝任务类似,除了玩家与一个派系结盟来对抗共同的敌 人。一个例子就是敌对派系主力舰之间的登船行动。玩家从一艘船上开始,然后战斗 到另一艘船上。关卡中的一个方块代表了敌人发生冲突的主要战斗前线。如果玩家到 达这些战线后只发现活动暂停,那将是令人失望的。 相反,为了克服程序布局的变幻莫测,我们根据实际布局调整了预定的人口图。 首先,我们在关卡的距离图中查找战斗前线。我们将图中的第二个峰值移到这一点, 以确保它与关卡的特征保持一致。然后我们将第一个峰值移到起始点和之前调整的峰 值之间的中间位置。这个修改后的图如图5所示,现在 12 更好地匹配关卡布局,并确保动作在我们想要的位置。

7.3 生存/挖掘

生存任务几乎需要持续不断的、不断升级的压力,因为玩家要尽可能长时间地生 存下去,同时在地图上移动以应对新的目标。 尽管AI Director的默认节奏更多是为了探索关卡而设计的,但它也能够与任务 脚本相结合,提供一些脚本可以用来查询环境和刷出敌人的功能。为了帮助指导 者支持不断涌入的敌人来骚扰玩家(太搞了),任务脚本可以自定义来覆盖刷出点搜索过滤 器。因此,在生存任务中,可以选择离玩家更近的刷出点和他们周围的所有刷出 点。 敌人需要冲上去攻击玩家,所以灵活地改变刷出选择是很有用的。在敌人无法 导航到玩家的位置上刷出敌人是没有什么意义的,比如在上锁的门的对面。 任务脚本也覆盖了正常的指挥节奏决定,而是直接监控活跃的敌人数量,并 向AI Director发出明确的请求,根据需要产生更多的敌人。在这个任务中,搜索 过滤器是由脚本提供的,尽管AI Director仍然处理敌人类型的选择并执行刷出点 的搜索。设计师可以通过设置脚本,在一开始要求更简单的敌人,并随着时间的 推移引入更具挑战性的敌人,从而随着时间的推移逐步升级强度。 当涉及到选择下一个玩家目标时,AI Director提供了搜索战术地图的功能, 以找到符合要求的目标,例如与玩家的距离和其他活动目标。

8 结论

当游戏采用程序生成时,我们不能依赖传统设计师的脚本设置。我们需要系统性 和程序性的节奏解决方案。《Warframe》中的AI Director便是解决这一问题的一种 方法。它通过监控玩家周围的动作强度,跟踪他们在关卡中的进展,并在运行时 推理关卡的流程和结构,来处理程序关卡中标准任务的动态节奏要求,从而提供 引人入胜的游戏体验。 有时候,完全自动化的系统无法处理特定的设计要求,但在这种情况下,所 需的大部分信息都由AI Director和TacMap维护。这使得设计师能够以系统的方式编 写特殊情况遭遇,而无需担心关卡布局的细节,这些细节可能会随着任务的重复 通关和玩家角色的升级而在运行时发生变化

10传记

丹尼尔·布鲁尔(Daniel Brewer) 2000年毕业,获得电子工程BScEng学位,专攻人工智能、控制系统和数据 通信。从那以后,他成为了一名资深的游戏开发者。作为Digital Extremes的首席AI程序员,他在将合作、 在线、多人动作射击游戏《Warframe》(2013)带入生活中发挥了重要作用,并继续进一步开发、维护和升 级游戏中的游戏AI系统。其他著名作品还包括《光晕4》多人DLC包(2012)、《黑暗II》(2012)、《生化奇 兵2》多人游戏(2010)和《黑暗区域》(2008)。多年来,他在游戏开发者大会上发表了许多关于AI各个方 面的演讲