GDC2018分享:游戏AI中的知识表示概述

我的游戏程序员之路 2020-11-20 12.4k
在2018年GDC演讲中,Daniel Brewer和Rez Graham两位大佬分享了帮助视频游戏AI做出对玩家有影响力的决策的最佳实践。我进行了中文的翻译并总结写成了下面这篇文章,翻译能力有限,请大家见谅。原视频油管上,如果大家感兴趣可通过以下链接前往。

原视频链接

下面是所有内容!

多年来,在峰会上我们花了很多时间讨论客户程序会制定所有性感的不同算法的决策,但我们没有花费足够时间讨论的一件事是这些算法如何用数据来做出这些决策的,而且这些决定的质量很大程度上取决于启动器(starter),而不是取决于所使用的算法。所以,今天我们将讨论知识表示,我们将提供一个概述展示用于向AI提供数据的一些常用技术,并展示如何通过关注这些数据来设计更丰富的行为。

当玩家在玩游戏时,这就是他们所看到的东西,而人类的大脑则非常惊奇地接受此输入,确定出重要的部分,然后决定要做什么。


但这就是我们的AI在玩您的游戏时所看到的。


或者也许有点像这样……我们的游戏世界由结构,指针,多边形和纹理组成,我们需要我们的AI来解释所有这些,以识别重要的bits以查看矩阵中的模式。


因此,我们需要向AI提供他们所需的信息,以使他们做出更好的决策并展示设计师想要的行为。根据它的行为可以分为三类:

  • 静态环境数据(Static Environment Data)
  • 动态空间数据(Dynamic Spatial Data)
  • 实体信息(Entity Information)



1. 静态环境数据(Static Environment Data)

因此,顾名思义,Static Environment Data可以代表您的AI了解物理世界,这个数据通常在运行时不会改变很多,您的AI会使用这些数据来寻找他们的路径或搜索位置。

1.1 导航寻路

导航和寻路是AI永恒的问题,因为环境变得越来越复杂,移动需求变得越来越疯狂,可导航空间的表示也变得越来越复杂。这有点像是图形程序员和AI程序员之间的一场军备竞赛。因此,不再是仅仅需要客户程序在关卡开放空间中徘徊。


如果我们采用这种简单的环境,这是一个开放广场,问题就很简单,但我们的设计师通常会向我们提出挑战。


所以我们需要有一种方式让我们的AI知道他们可以留在通路上,但是他们不应该走在草地上。但是,如果一个学生上课迟到并且周围没有教授,或者学校正受到外星人的攻击,那么他们无论如何都会越过草坪。


因此,如果将网格用于导航表示则相对简单,你可以在地形类型上标记网格中的每个单元,然后可以构建函数,以指导AI沿着路径前进。


当您使用导航网格物体时,事情却稍微有些不同,典型的导航网格物体可能看起来像这样,但这还不够好,因为我们不知道这里有什么。


因此,我们需要为设计师提供一些工具,以允许他们标记这种环境,以便他们可以告诉AI草在哪里,人行道在哪里,然后我们可以从那里出发。这给我们的导航图增加了更多的复杂性,但是事实证明添加额外的权重和标记确实非常有帮助。


我们在黑暗环境中使用了这项技术-我们实际上是根据光线来创建切割体积的,并在这些体积上切割,然后我们测量了消除量并对其进行了模拟,这使我们的黑暗角色得以保留在阴影中并避开灯光。



然后可以相对容易地构造一个不同的函数,根据您要运行的繁重任务选择不同的成本函数。如果您只使用一个ID来代表您的地形,那么您就只能一次只使用一种类型的考虑因素,而如果使用位掩码表示您的地形类型,则可以开始将这些位使用不同的加权系数组合在一起。


1.2 智能对象(Smart Object)

现在,沿着智能对象或称为游戏AI知识表示中的无名英雄之一继续前进,模拟人生游戏是一个典型的例子,说明如何使用智能对象扩展代理的功能并使他们似乎更加了解自己的环境。


但是我们可以在其他游戏中的各处使用它们,从而使它们在本质上可以发挥很大的作用。智能对象是一种抽象,它在一个简单的界面后面封装了一些复杂的逻辑,并将其与特定的位置或实体相关联。在世界范围内,现在您的AI无需知道任何复杂的信息,他们只需要选择要使用的智能对象,就可以避免所有逻辑被嵌入到该智能对象中。



1.3 战术地图(Tactical Map)

现在,行动和策略游戏中的许多决策都围绕着代理商应该向何处移动以及我们应该如何到达那里展开。因此了解地图的整体流程和结构是有好处的。地图的主要区域是什么?这些区域如何连接?您的导航表示形式当然可以为您提供帮助,但是它过于详细,就像试图在所有森林中寻找一棵树一样,因此具有较高级别的表示形式很有用。


在星际战甲(Warframe)中,我们使用粗糙的走廊地图作为结构来表示此信息,我们称之为战术地图,它表示运行时的关卡流程,我们在此图中添加了很多额外的构成,我们知道我们所有的门里面是什么状态的。大量不同的系统都使用它,AI直接使用它,NPC使用它来寻找掩护和巡逻。设计人员可以编写脚本来搜索该图以查找定位的位置。它是关卡非常有用的抽象表示。


2.动态空间数据(Dynamic Spatial Data)

现在,动态空间数据用于表示受环境影响并随时间变化的空间关系,因此,即使关卡的物理结构可能是静态的,单元的位置也可能在运行时发生变化,这会产生很多动态变化。能够预测和应对这些情况非常有用,因此在此处将一些值映射关系绑定到表示特定位置的特定区域,并允许其在整个环境中流经地图并做出响应是很有用的。

2.1 影响力图(Influence Maps)

影响力图(Influence Maps)实际上是这里的首选算法,这是一个非常复杂的话题。我不会详细介绍它们,但是我将介绍一些我们在Warframe中有用的用法。


首先,您不仅可以从角色中散布影响力,还可以在角色受到伤害或死亡的地方插入影响力,现在您已经有了一个危险力图,可以使用它来将敌人吸引到冲突区域作为增援,或者您可以推动敌人角色远离冲突区域。


您还可以模拟环境危害,例如炸毁窗户时撞破船体和宇宙飞船,您可以从该窗户中获取一些影响,并通过您的影响图将其传播出去,我们在战术图上使用影响图,因此我们知道门所处的状态,然后我们可以更改这种影响的分布,以便门在这些区域中包含真空环境,您可以将其用于着火或洪水或任何其他可能扩散到整个环境中的环境特征。


2.2 客观距离图(Distance to Objective)

客观距离图对于了解目标位置很有用,您可以将所有目标以零距离播种到关卡中,然后使用Dijkstra填充地图中任何点到该目标的距离,现在我得到了一个查寻表,您可以通过它知道您离最接近的目标有多远,您知道可以朝哪个方向前进,您可以让巡逻NPC掩盖玩家与目标之间的距离,我们用大量不同的方式来使用它。


2.3 预测角色移动

现在您也可以关注影响力的变化并开始做出预测,因此,如果随着角色移动,角色中的影响力正在从角色中扩散开来,那么影响力将在他们移动的前方地区上升,在他们身后下降,因此,通过寻找影响力有积极变化的领域,您可以预测玩家的前进方向,这也非常有用。


3.实体信息(Entity Information)


实体数据是用来决定游戏中其他活跃实体的数据,这是您必须处理的最广泛,最多样化的知识类型,并且还高度依赖于所玩游戏的类型。在动作游戏中,这通常是有关可能目标的信息。在赛车游戏中,它将是有关其他赛车的信息。在策略游戏中,这可能是关于其他文明的信息,他们已经开发了什么技术,他们必须交易什么资源等。

3.1 目标列表(Target Lists)

从我的背景出发,我一直专注于动作游戏,所以这就是我在这里要谈论的话题。在这里,您将希望传达有关可能目标的信息,通常,您将拥有一些感知系统来提供有关您的AI知道的目标以及他对这些目标的了解等这些信息,您可以在目标列表中维护此信息,而这基本上只是结构数组,其中包含您对这些目标的了解。

现在有两个重要原因,为什么您要像这样系统分离出来,首先将这些信息从世界中缓存,这使您可以将AI系统与您的世界分离开来,并且可以更轻松地异步运行事物,因为这样您便知道了您无需依赖AI系统就可以直接从世界范围内获取东西;其次,如果您的AI仅能访问他认为的信息,这将使您的玩家可以在您的AI上耍花招,可以操纵它们,并且开始在游戏设计中找到乐趣。


3.1.1 最后已知位置

因此,您至少应该妥善存储一些信息,您至少需要知道目标是否可见,以及它的最后一个已知位置,这非常有用,因为 可以让您的玩家有一点额外的烦恼。




3.1.2 感知类型

此外,如果您想让AI听到您发出的声音后不直接进入战斗,或者想让它们去触发警报,则保持一定的感知信息范围非常有用。





3.1.3 二手信息

如果您在AI之间共享信息,则知道您所拥有的信息是第一手还是第二手是很有用的,因为隐藏的AI根据二手信息跑向警报处去触发警报,玩家是无法知道的,所以对于玩家来说,所以如果玩家不知道其他AI在场,那将是不公平的。






因此,确实看到玩家第一手信息的第一个AI跑向警报处的话,这会更好,这对于玩家来说更加可信,它还使您有机会阻止AI触发警报,这可以说是一个更好的游戏玩法。





3.1.4 可以到达

还有一个可到达的标记也是很有用的,这样您就可以知道要尝试到达的目标是否真的可以到达他。如果找到的部分失败,您可以将他标记为无法到达的位置,然后 在情况发生重大变化之前,无需再次寻找他。


一旦情况发生变化,您就可以清除标志并尝试重新开始。


您还可以建立后备行为,近战的敌人可能会选择其他目标,或者他可能会切换长距离武器。


3.1.5 目标的武器和目的

其他用到的有用信息是,目标的目的(Alim)以及他使用的武器,您不需要躲避以你为目标但佩戴剑的敌人,但如果是远程武器则正好相反。


如果我们制作奔放的游戏,并且玩家有一颗子弹的单发手枪,我们可以更进一步,目一个被玩家作为目标的AI可能想要退后一点并保持谨慎,而他的队友可能会侧翼移动,一旦玩家开了枪并换上了剑,所有AI都会一拥而上。


3.2  游戏的步调(Pacing)和强度测量(Intensity Measurement)

最后,我想在这里谈一谈与游戏的步调(Pacing)和强度测量(Intensity Measurement)有关的主题。因此,多年来,我们一直在关注游戏的强度测量,因为我们想在运行时动态管理步调,而且我已经越来越多地意识到强度测量的意图,并提出了不同的指标。


3.2.1 威胁

首先,随着玩家逐步进入关卡,会有不同程度的威胁,这是对玩家造成伤害的潜在可能。所以更多的敌人意味着更多的威胁,敌人越强壮,威胁就越大,而敌人越接近,威胁也就越大





3.2.2 资源

现在玩家拥有一定数量的资源来应对威胁,而您拥有防御性资源,包括防御力和生命值,还有进攻性资源,有弹药或魔法等等。


因此可以花费资源来克服威胁,因此当玩家被击中时失去健康就有效地花费了防御性资源,花费了弹药进行回击又有效地花费了进攻性资源,



3.2.3 强度

现在我们有了一个衡量强度的方法,如果玩家仅通过少量资源损失来减少威胁,那么游戏就太容易了,这还不足以构成挑战。但是,如果花费大量资源来克服该威胁,那么这意味着游戏非常艰巨,挑战重重。


3.2.4 紧张局势

现在,如果玩家偷偷溜走或躲藏起来,就会出现一个有趣的情况,那就是您的威胁等级很高,但是没有资源在消耗,但是随着时间的流逝,这种威胁的强度在不断增加,那里存在冲突的可能性,这是紧张局势加剧的情况。


3.2.5 步调

因此,强度与花费资源去克服威胁直接相关,但是,在威胁很高的情况下,它表示存在潜在的冲突。因此,紧张局势加剧。


3.3 AI 长期的知识表示

接下来,我们将谈论长期知识表示,所以我们刚才听到的一切都是关于一些较短期的战斗经验以及类似的东西,所以我将更多地关注长期的东西,如果这可能更适合于模拟RPG策略游戏,那么这种东西可以用于长期的关系和事物。我将要谈论的两件事主要是我们的统计数据和标签,所以我认为我们从这两件事中获得了很多收益,而且上文说的一切也适用于这些类型的游戏,所以您一定会发疯。


3.3.1 统计数据(Stats)

统计信息实际上只是模糊值,它们的值表示某种模糊状态,例如我有多饿,我有多少乐趣,有多少社交能力,我喜欢什么东西,或者我的技能,我的外交关系,或我的人民有哪些需求等等。


因此统计数据几乎总是以某种方式进行归一化或固定化,因此存在一些归一化的值,并且可以从字面上归一化为 0 到 1 。

在模拟人生中,他们通常是负100到正100,这给了您一系列的比较范围,因此您可以轻松地进行比较和对比,让它们表示可以打勾的各种不同事物。当然,这也意味着它们可以像字面上的float一样简单,然后是某个值或某些标识符,或者对于大型对象(例如它们在模拟人生以及许多其他类型的游戏中所使用的对象)而言,它们可以有更大的复杂度。

它们也可以是计算值,而我的意思是真正地从其他各种事物中衍生而来,当我谈论诸如标签之类的东西以及如何获得此类事物时,我会做更多的介绍。这是我们使用决策制定的主要内容之一,如果您使用的是实用工具或必须使用的任何方法,我们将花费大量时间将其整合到我们的决策制定系统中。

它们有助于提供非常细微的行为,我喜欢微观变化,我会给您举个例子,如果您玩过类似模拟人生或其他类似的游戏,您会发现模拟人生中的许多核心互动都是这些小型的微观社交互动。我要向这个特定的市民打个招呼,我要给这张图片等这些类似的东西,因此,这非常非常像那些内部循环。您正在做这些小的交互操作,随着时间的推移,这个值会逐渐递增,并且随着许多值一起进入较大的计算,因此会得到更多紧急类型的行为。


我会给你一个游戏中的直接例子,不知道有多少人听说过——芭比奇幻日记-神秘的高校(Barbie Diaries:The-High School Mystery)。早在2005年,我就曾从事过这款游戏,无论您是否相信,已经有了一些发生在幕后的模拟,有些像是基于实用程序的AI发生了,我之所以创建它,是因为它实际上是一个高中模拟游戏或一个高中冒险游戏,所以我们形成了一些小集团,而这样做的方式基本上就是基于实体ID的哈希表,两个浮点数决定了“我”想和特定类型的特定人交谈的程度,所以就有了各种有趣的人,受欢迎的女孩和很少与异性互动的书呆子。

这是一件微不足道的事情,我的意思是我在两个小时左右的时间内完成了此操作,但它创造了足够有趣的行为,玩家会觉得“嘿,AI发生了什么事情,发生了一些微妙的事情,使它变得更好”。因此,通过类似这样的小事情,您可以获得明显的效果。


在模拟人生这样的游戏中,这是一个很好的例子,它更进一步,因此我们的关系得分设置为从负100到正100。但是实际上我们有好几个类似的关系,所以如果您看下图Courtnery 处,我们有两种不同的关系值,一个用绿色表示,一个用粉红色表示,分别代表友情和浪漫。这是两个完全不同的轴,这些轴的混合和融合非常容易和有趣。因为通常的道路是友谊和浪漫一般是一起上涨,但是当您进行一些低级的互动,然后进行正常的互动时,您会得到一些非常有趣的行为。


因此,当您遇到诸如高友情低恋情或低友情高恋情之类的事物时,您会得到不同的感觉,比如说高友情低恋情的人也许是您的朋友们真正的好朋友,您尝试了一些东西,但效果却不尽如人意。而低友情高恋情则可能有类似的依赖性发生,你和真正的令你痛苦的敌人睡在了一起。因此您可以获得一些非常有趣的微妙行为,并且可以添加一些行为,使这种行为大量增加,并获得各种疯狂的东西。

3.3.2 标签(Tags)

我想谈论的另一件事是标签。标签是您悬挂在实体上的大量信息,就像圣诞树上的装饰品一样。标签真的很酷,而且非常具体。标签是识别我们要跟踪的信息和事物的方式。类似于统计数据,他们可能只是某个地方的枚举,也可能是成熟全面的类,就像在模拟人生游戏中的一样。


所以我想用一个名为Crusader Kings 2的游戏来讲一讲,从标签中衍生而出的统计数据。我用这个游戏举例的原因,是因为我认为他们非常精通这项工作,我认为因为他们还解决了另一个有趣的AI问题。

所以首先这是Earl Lawrence,这是我在这场特别的游戏中的臣仆之一,他的值是负18 代表他是一个蠢货,所以为什么他是个蠢货呢,他们非常简单地解决了AI的第一条规则。AI的第一条规则就是向玩家展示您正在做的事情。这里有很多内容,例如,其中一条,我拥有很多公爵夫人,而他超级想要其中一个,所以你知道我可以通过这样做来操纵他,但是那会推动他的很多互动以及他的很多欲望。我可以在这里看到它,并归结为一个数字,我可以查看这些数字,这些数字是由这些起作用的不同标签衍生而来的。


所以他们确实做得很好,我认为我们在模拟人生上也做了类似的事情,左下角的东西叫做情感,我们可以看到这个市民很悲伤,而且下面还有两个小东西告诉你为什么他会悲伤。


我将展示另一个不同的示例,这个市民情绪是爱玩,为什么这个市民爱玩?我可以将鼠标悬停在这些小东西上,他们会告诉我因为这件事加了 3 点爱玩值,因为那里有俏皮的装饰,所以因为市民恰好在一个拥有俏皮装饰的房间里。我们可以检测到有有趣的装饰,我们会给市民添加这个buff或我们称之为buff的标签。

而我们要做的是,我们总结它们在每个不同标签上的所有不同情感权重,而值最高的获胜者就代表了该市民目前的情绪。如果市民离开这个房间,那么该市民的情绪就有可能被其他情绪的所取代。然后这解锁了您可以进行的其他互动,甚至可以进一步产生更多爱玩的buff,标签和类似的东西。所以你可以沿着这个兔子洞走,我们都经历过多少次悲伤或沮丧,就像进入这个状态时我们是自己最大的敌人。或者是快乐,然后和其他快乐的人在一起,现在变得更加快乐,然后你喝酒,就又变得更加快乐,呃,有时可能就不是这样。


您也可以选择相反的方式,或者像是将它们以更多方式真正地结合起来。这两个家伙是我们的爱人,他们是最好的朋友,并且所有这些都来自统计数据,因此他们之间进行了很多互动,等到到达某一点后,他们从熟人变成了朋友,然后变成了最好的朋友,等等。但在最底端,您会看到有一项叫做 Promised,这基本上就像我们正在稳定或订婚的状态,而婚姻与您的浪漫值的高低无关。虽然我们把两者都称为关系,但它们只是标签。


3.3.3 结论

统计信息实际上只是模糊值,它们提供微妙的紧急的行为,它们有助于提供非常细微的行为。标签是悬挂在实体上的大量信息,擅长基于事件的行为。


译者:Oliver
来源:我的游戏程序员之路
地址:https://mp.weixin.qq.com/s/0oPiu8Og9pNXIgxMnCyWNA

相关推荐

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

商务合作 查看更多

编辑推荐 查看更多
FB出海
推广