http://www.gamasutra.com/view/feature/2888/building_an_ai_sensory_system_.php (英文原文)
By Tom Leonard
对于理解,设计和讨论在仿真环境中AI如何收集对象信息,游戏开发中用“senses”这个词恰到好处。在实际的三维空间中,用作模拟人类,动物以及任何有眼和耳朵物种的NPC是很好的举证。
尽管游戏中的AI物理特性看起来像是在sense,但从engineering角度来讲,AI的sense不是一种生理上的或神经上的感知。游戏中,sense和knowledge之间的区别比较模糊。Sense的意义包括可以意识到游戏中其它实体的存在以及元素的价值和常识,可以根据游戏内容做出直接的反应。
游戏感知系统需要以一种遵从于游戏设计且能高效实现的方式设计。sense需要兼顾趣味性和健壮性。所做的事情是能让玩家感知并理解的。很少有游戏,在设计时需要AI做到尝,触摸以及闻;因此sense只关乎看和听。用得好的话,senses可以成为非常有价值的工具,通过向状态机提供更广泛的环境输入更使其更富趣味性。
本文讲述的是一种隐蔽类第一人称AI系统设计并实现高保真感知系统的方法。该技术来自为Thief: The Dark Project构建AI的经验,也通晓CS的做法。最初,AI senses的概念是以CS为参考设计出来的。本文检测到一个更为严格的隐蔽类游戏设计的需求。最后,设计出了Thief的感知系统。
实例:半条命
半条命并不是以隐蔽和感知为核心的游戏。因为对战中有战术需求,游戏要有一个合理的感知系统。所以这个游戏是研究AI感知系统的好案例。半条中的AI有视力和听力,能对感知到的实体的信息进行处理,然后产生各种行为。
在一个普通的感知系统中,AI按时去看和听。真实的视觉和听觉系统中,当senses受到刺激时,都会主动或者被动的做出相应反应,AI则不同。它们根据自己的兴趣去检测环境,然后根据预先设定的规则做出决定,他是看到了还是听到了别的东西。这些probes设计用来仿真senses,但也限制了可完成的事情数量。这些资源对于游戏体系来说是很重要的。
举例来说,半条命的核心感知逻辑是,定期跑:
If I am close to player then… 当我靠近一个玩家时
Begin look 开始看
--Gather a list of entities within a specified distance 在一个规定范围内,生成一个所有实体的名录
--For each entity found... 每一个发现的实体
----If I want to look for them and 如果我想找他们
----If they are in my view-cone and 如果他在我的view-cone之内
----If I can raycast from my eyes to their eyes then... 从我的眼睛到他们的眼睛之间,我能ray cast到他
------If they are the player and 如果他们是玩家
------If I have been told to not see the player until they see me and 如果我在他们发现我之前不能看他们
------If they do not see me 如果他们没看到我
--------End look 结束看
------Else
--------Set various signals depending on my relationship with the seen
————entity 根据我和看到的事物时间的关系,设定若干信号
End lookBegin listen --For each sound being played… 每一个发出的声音
----If the sound is carrying to my ears... 如果传到了我的耳朵里
------Add the sound to a list of heard sounds 添加到听见的声音列表中
------If the sound is a real sound... 如果是一个真实声音
--------Set a signal indicating heard something 设一个信号表示听到声音
------If the sound is a "smell" pseudo-sound 如果声音是“闻“ 到的假声音
--------Set a signal indicating smelled something 设一个信号表示闻到东西
End listen
这段伪代码要表达的第一个概念是,senses与AI特性密切相关,它与主题的关系,以及AI与玩家体验的关联。也是从游戏优化的角度考虑,而且游戏机制是可以实现的。在半条的游戏设计中,一个不靠近玩家的AI没有实质作用,也不需要感知周围环境。即便靠近玩家时,该AI只需要去看那些即将产生恐惧或者仇恨的人物。
这个逻辑也说明了view distance, view cone, line-of-sight以及eye position之间的结构关系(见图1)。每个AI有一个受长度限制的二维视觉范围,并在这里cast ray感兴趣的目标。无阻碍的ray casts代表能见度。
有两点要注意。第一,sensing的操作从最便宜到最贵。第二,玩家喜欢这种躲猫猫的感觉。在第一人称游戏中,玩家肢体感知不强,被对手看到的玩家,不会觉得自己被对手行为诱导了。
最有意思的是其中一段代码是约束AI,只有在被玩家看到时才能看到玩家,这完全是为了配合玩家玩耍。这就是一款高水准游戏在并不复杂的系统中,利用简单技术就完美实现了想要达到的标准。
听觉的逻辑要比视觉简单。听觉的基本组成元素是什么样的声音以及音调,需要让AI听到。在半条里,听力是一个直观的探索音量,在AI能听到声音的区域范围内,“听力敏感度”逐渐扩大。更有趣的是,听力只是用来收集一些没什么价值的信息。比如,AI“听到”假声,周围尸体发出的味道。
核心玩法依赖senses的Thief
Thief: The Dark Project和它的继承者们所描述了一种轻量级脚本化游戏世界,它的核心是潜入,挑战了传统的第一人称3D游戏。在盗贼中,玩家小心翼翼地移动,避免冲突,杀人会受到惩罚,而且是一招毙命的那种。玩家通过强大的AI感知系统,根据从周围中获悉各种信息来进行游戏。玩家要穿越重兵把守地带,并且不被巡逻中的AI发现,在黑影中穿行,不发出任何响动。尽管盗贼的AI感知能力与半条的核心理念相似,不过这种以躲藏,隐蔽为主的游戏机制需要更复杂的感知系统。
首先,需要创建一个高度可调的感知系统,有一个很大状态范围可去操控。表面看来,潜入游戏玩法是关于躲藏,背后突袭,保持安静,环境的亮与黑。让这种体验变得更有趣的是,将安全与危险之间的灰色地带变得更大,而在大多数第一人称游戏中,这个地带犹如一线之隔。当玩家进入灰色地带,犹如在刀尖上行走,心跳加速,直到走出后才能松一口气。这要求”broad-spectrum” senses不能急速偏振,只有“玩家感知到”和“玩家没感知到”两个极端。
第二点需求,比起其它第一人称游戏,在盗贼中,sense系统被触动的频率更高,能作用于物体也更多。在游戏过程中,玩家的行为能左右整个虚拟世界的状态,AI能够感知到,即便当时玩家没有在AI的周围。这些行为,例如玩家藏了起来,需要可靠的感知能力。对于游戏开发者来说,与万年不变的performance需求相比,这两点需求结合在一起是一个更有趣的挑战。
结论是,感知系统的输入输出,有必要让玩家和游戏设计者都能解读,系统输出的结果应该是输入信息的合理反馈。 做法是,有限地向系统输入玩家留下的线索,然后独立的处理每一个输入结果。
扩大Senses
这里阐述的感知系统真的和半条命的很像。这是一个以viewcone和raycast为基础的vision system,以及带有hooks的简单听觉系统作为支持优化,游戏机制以及pseudo-sensory data伪感知数据。(It is a viewcone and raycast based vision system and simple hearing system with hooks to support optimization, game mechanics, and pseudo-sensory data.) 以半条为例,大部分sense是从就该输入信息要做出什么反应的决策过程中剥离出来的。盗贼的系统以这些核心思路为基础进行扩展,从而生成了一些新的思路。
数据系统的设计和数据都取自于一个,被定义为信息收集系统,并且可根据需求对该系统进行个性化调整,输出结果稳定且易懂。
在该系统中,AI senses以“awareness”的形式构架而成。Awareness用来表达一系列的离散状态,这些状态代表了AI感知存在,位置,以及识别某物体的偏好。这些离散状态不仅应用于系统内部和设计者之间,并且关联于高级AI与alertness(警戒)状态。在盗贼的AI中,alertness状态的范围与awareness状态的范围一样。AI的alertness状态通过各种方式被返回到感知系统,然后改变系统的行为。
awareness被存在sense links中,这些links不仅与要通知的AI与另一个游戏中实体之间相关联,也与一个位置相关联。这些关系存储的是游戏相关感知信息(例如时间,位置,视线等),以及缓存的数值,用来减少think cycle之间的运算。Sense links,事实上,是AI的内存。虽然verbalization(表达)和observation(观察) 的sense links被广泛作用于peer AI中,在一个区域内阻止他们之间的信息串联。库处理之后,AI也同时被游戏逻辑操控着。
在游戏中,每个被追踪者(盗贼)都有一个visibility value,能被每个AI单独观察到。根据数值游戏中的状态,性质等级(重要程度)与更新频率,来分配处理需要花费的时间。
visibility包括物体的亮度,移动和暴露出来的部分(尺寸,与其它物体的间距)。这么做完全是为了满足尽可能游戏要求。比如,玩家本身的亮度取决于他周围地面反射上来的亮度,这可以给玩家提供一个行之有效的蔽护。他们的数值和他们的visibility总和,以二进制模拟数值的形式存储。
Viewcones
盗贼senses实现了一组有序的三维viewcone, viewcone由xy angle、Z angle、长度来表示,实现了一组参数来表示各种刺激的敏感度,以及实现了收到有AI警示后的相关举动。viewcone根据AI脸朝向的方向定位。
任何时候,感知到物体时,只有物体所在第一个view cone在sense计算范围内。为了简便,gameplay的可调性,每一个viewcone应该生成一个常量输出,无论这个物体时放在viewcone的什么位置。
比如,图4中描述的AI有5个viewcone。A点的物体会在3号viewcone的估算范围内。1号viewcone包含了B和C点的vision sense awareness的计算,在这里,一个物体相同的visibility values生成同样的结果。
当AI感知到符合自己需求的物体时,senses首先要决定是在哪个viewcone,假如有重叠现象,就根据刚刚说的方法来决定。接下来,在viewcone中,通过启发式查询,找到内在visibility,然后输出一个离散aswareness值。
做成多viewcone是为了表达更多的情况,比如直接vision,外围vision,以及,在与AI同一平面上直接走来的物体和不在同一平面只是在上下移动的物体,这两种情况之间的区别。上图中cone 5描绘的是在低处看高处。”false vision”会判定这是向后看,让AI觉得自己被跟得很近,而实际上没有。
Information Pipeline 信息通道
sense处理系统由很多部分组成。每个部分都是一组有限的并且定义好的数据,输出也是有限的数值。每个stage都独立存在,以配合根据game play决定的处理需求。多层次的结构,让处理性能非常有效。
sensory系统核心功能支持,启发查询visibility,声音时间,当前awareness links,设计和程序员配置的数据,当前AI状态,并为每一个AI有兴趣的物体输出一个简单的awareness数值。这些启发出的结果被形容为黑盒子,AI程序员用它来不断开发游戏。
通过恰当的viewcone过滤物体的visibility数值,然后基于AI的性质修改结果,来实现vision功能。在多数情况下,使用单一的直视的raycast。复杂一些的情况中,比如AI与玩家之间,多层次的raycasts可以囊括AI和玩家在空间中的关系,以权衡玩家暴露的程度。
盗贼游戏有一个复杂的声音处理系统。渲染过或没渲染过的声响都被标注为语义数据,并在3D几何世界中传播。AI接收到的声响,应该是来自现实世界的方向,标注为衰减的awareness数值,如果是谈话内容,那有可能是来自其它AI的信息。这些声响连同其它信息,用来作为判定位置的awareness。
Awareness Pulses
当look和listen的操作完成后,他们的awareness结果会被传递给一个用于接收来自原始senses周期脉冲的方法,该方法将周期脉冲处理为简单的awareness关系,并把所有细节存储在对应的sense link中。与应用于管道中的模拟数据不同,这个处理过程中的数据都是离散的。处理的结果可以创造,更新以及将sense links用正确的awareness数值替代。
这是一个三步走的过程。第一步,sound和vision的输入数值会比较,哪一个更重要,可以成为awareness的数值。提炼出来的数值汇总在一个sense事件摘要中。
第二步,如果awareness脉冲比先前readings有所增长,它会被传递给一个以时间为基准的过滤器。过滤器控制实际awareness是否增长。延迟只是当前状态的性质,不是目标状态的性质。这是响应延迟和玩家forgiveness条件如何构成的。一旦超过时间界限,awareness将跳过中间状态直接到达目标状态。
最后一步,如果新的脉冲数值低于当前readings,电容器将允许awareness逐渐地降低。awareness降低的过程中,要经过一些中间状态。当AI想要追逐的物体不那么活跃时,AI的行动也会慢慢放松下来。不过,这个机制不是AI alterness的核心功能所控制的那部分。
当猎物(玩家控制的人物)不在发出脉冲,senses会根据AI的状态,合并出一些信息给AI。这个机制能帮助AI进行位置推断,当猎物离开AI视线范围后再度被发现时,不会让玩家觉得刚才AI在作弊。
Conclusion 总结
这个系统是针对单人游戏,用软件就能渲染的游戏设计的。文中的方法具有权威性,可以借鉴。遗憾地是,在客户端/服务器结构,仅支持硬件渲染的游戏引擎中,就不能实现了。决定猎物visibility的有效区域不会这么简单。因此,如果要使用本文讲述的系统,要谨慎,它需要其它系统的配合。
此外,尽管这个系统行之有效,该系统是为基于系统输出结果进行的游戏而设计的。在盗贼游戏中AI消耗了大量CPU资源。这种情况下,设计路径,战术分析和其它需要做决定的行为效果就差了。
不管怎么说,好处还是有的,所以游戏愿意在处理sensing上进行投入。通过手机和过滤更多的环境信息并将其好好处理,senses能够让AI的行为更好的融入游戏。不需要把AI做成一个需要自己处理各种信息并做出判断的复杂机器。一个好的sense系统,通过操控核心输出信息,能够为表达“pre-conscious”行为提供清晰的引导。最终,一个多状态sense系统让AI拥有了各种微妙的反应和行为,而不是通过增加AI做决定的复杂程度。这些AI即可能是玩家的对手,也可能是盟友。
更多关于文中提到的技术和所使用的工具请见:http://www.thief-thecircle.com.