GDC2012讲座系列:《杀手:赦免》中的人群系统(Crowds in Hitman:Absolution)

从GDC2012回来有一段时间了,一直很忙,没有时间整理在GDC上听到和学到的内容。总的来说,GDC上的讲座很多,在5天的会议时间里,有超过将近340场的各种讲座,作为AI程序员,当然比较关心AI方面的技术内容,在GDC上也确实听到了一些比较有意思的东西,也和世界各地的游戏开发者讨论和分享了一些信息,我会慢慢整理后,在博客上做个记录,分享给大家。另外,GDC比较厚道的是,很多演讲的PPT是可以免费查看和下载的,所有在每篇博客的最后,我会附上该PPT的链接,供大家下载学习。由于讲座和资料都是英文的,有些名词我能理解,但不一定能翻译的很好,我会在一些关键词后面标注英文原文。

今天为大家介绍的是由来自IO Interactive的主程Kasper Fauerby带来的关于一个人群系统的介绍,这个系统用于《杀手:赦免》这个游戏中,用这个系统试图去营造一种在人群中暗杀的气氛。显然,这样一个系统的难点一个是AI的计算如何保证效率,因为同屏会存在大量的NPC,另一个是如何来模拟真实人群行为,特别是在“暗杀者”作出一些动作(比如,开枪)的时候,人群如何去对这种行为作为反应。

在设计这样的系统时,我们都会有多种的考量,在效率上,在实现的难度上,在和关卡设计师的配合上等等,Kasper在考虑了他们的设计目标后,决定采用一种比较轻量化,比较传统的AI设计来做这个人群系统。他通过以下几个部分来介绍了他所设计的人群系统:

  • 框架(Framework):单元化的地图信息(Cell Map),智能体的建模,以及一些工具
  • AI:主要是关于导向行为(Steering Behavior)和行为的选择(Behavior Selector)(这也是这个系统中比较重要的部分)
  • 画面表现(Visual):如何用动画和模型来表现
  • 可信度(Believability):因为这个系统是和游戏性息息相关的,所以它需要很好的和核心的游戏系统进行整合

对于一个大场景的游戏,对于地图的抽象化是非常必要的,我们在平时的开发中,也会来把地图分成一系列的单元格,一方面可以方便计算,也比较高效(参考这里),Kasper也用了这样一个方法,把地图用2.5D的网格来表示,在每个单元格中,存入一些参考信息以供AI使用,比如是否可以到达,被哪些智能体占据,是否是出口,是否是收到惊吓时才能去的,等等,这些信息的种类完全取决与AI的需要。

Kasper把人群中每一个智能体比喻成“粒子”(Particle),做过或者用过粒子系统的同学都知道,粒子系统中的每一个粒子都有一系列的属性,比如发射时间,发射速度,旋转,大小,生命期等等,在人群系统的中每一个智能体也可以看成这样一个“粒子”,赋予它一系列的控制属性,来描述智能体的状态。Kasper列出了6种用到的智能体状态:位置(Position),半径(Radius),朝向(Forward Vector),速度(Speed),导向的输入(Steering Input)。这些就是智能体的基本模型。

人群系统的中对于每一个智能体的AI部分其实非常的简单,它基于一个有限状态机,有限状态机分为两个部分,一个称为基本的导向状态机(Navigation States),一个称为游戏状态机(Gameplay States)。因为在人群系统中,智能体很重要的一个行为就是如何在人群中移动,它需要选择方向,选择移动的时间,还要避让障碍物,避让其他智能体等等,所以第一个状态机就负责这个行为,它会在三个状态间切换

  • 空闲(Idle):无所事事的状态
  • 准备移动(Pending Walk):选择一个合适的移动方向和移动的开始时间,所以它的行为会分成两个阶段,一个是选择阶段(确定方向),一个是等待阶段(等待直至可以开始移动)。
  • 移动(Walk):真正的移动,在这个状态中要负责避让障碍等实际的工作

所以我们看到,在这个导向行为时,每一个智能体是独立思考,它会根据当前的情况来决定如何和怎样去移动,还有一种我想到的做法是,由外部来统一计算,并给与智能体指令,而智能体只负责完成移动指令即可。

在《杀手》游戏中,人群的移动有一些特殊的状态,比如在受到惊吓时(因为有杀手开枪了嘛),会进入一种特殊的“惊慌”(Panic)状态,这时智能体的移动方式会产生一些变化,虽然状态机还是那样,但行为会被调整,会产生一个移动的“流”(Flow),这也是很好理解的,因为我们可以想像,在惊慌的时候,人们都会统一的远离危险点,往出口散开。为了模拟这样的情况,在计算移动方向的时候,用到了在地图信息上预先计算和处理好的参数,比如指向出口的方向,到出口的代价等一系列值等等,把这些值带入到决策的话,就可以很好的模拟这样的行为,Kasper放了一小段视频来描述这样的行为,我们看到当“杀手”在人群中开枪的时候,人就自然的往后散开,并逃离,效果还是很不错的。

第二个状态机用来处理智能体对于外部情况的一个反应,主要是玩家行为的一个反应,这个状态机由一个称之为“刺激(Pulse)”的方式来驱动,其实也就可以认为是事件驱动的。比如当玩家瞄准人群的时候,智能体就会收到这样一个“刺激”,从而表现出惊慌的行为状态。由于玩家是置身于人群中,处在不同位置的智能体对于玩家的行为应该有不同的表现,比如就算玩家拿枪指着人群,但离玩家比较远,或者在玩家背后的人,应该会有不同的行为,所以,Kasper为玩家设定了一个“区域刺激”(Zone Pulses)的概念,说白了,就是玩家有几个不同半径的圈,在不同的区域里的智能体就会有不同的行为,如下图所示:

屏幕快照 2012 04 21 下午10 16 44

如果智能体在绿圈的范围内,则会表现为警觉(Alert)的状态,在蓝圈和红的三角区域时,就会抱头扑倒(Prone),很好理解的概念。

我们可以看到,从主要的概念上来看,人群系统的AI部分相对是比较好理解的,也比较简单,但在实现的过程中,可能会有遇到很多实际的问题,比如如何合理的选择路径,如何来抽象地图信息,如何来处理效率和真实之间的平衡,如何处理内存的问题,据Kasper说,他们需要处理1200多个智能体,同屏要超过500个智能体,所以这些都是需要考虑的。当然一个好的调试工具也必不可少,下面这张图就是《杀手》中人群系统的调试工具,和编辑工具的截屏:

屏幕快照 2012 04 21 下午10 28 44

屏幕快照 2012 04 21 下午10 28 28

为了更好的表现人群中不同智能体行为的多样性,动画系统的支持,也是必不可少的。我以前提到过动画的表现有两种的方式(参考这里),一种是动画配合运动,一种是运动配合动画,前者可以有比较良好的反应(对于方向改变的响应更快),比较简单,但缺点是会有滑步,而且不够真实,后者的优缺点正好和前者相反,它用弥补了真实性,但响应变慢,运行开销也变大了。《杀手》中对于每个智能体的动画系统选择也遇到了这样的问题,他们对于这两种方式都做了尝试,最后如果我理解的没有错的话,貌似还是选择了反应较快的方式,也就是他提到的First Try。因为对于方向改变的相应变慢直接导致了智能体无法避开障碍物,这个是比较不能忍的….。

Kasper在整个演讲的中,还提到了一些关于如何和关卡设计师合作,如何优化,如何组织数据等细节部分等等,大家可以参看他的PPT,有问题,可以留言讨论,我这边就不作为重点介绍了。

我听了这个讲座后,感觉模拟一个人群系统比较重要的一点就是我在整个介绍过程中反复提到的平衡效率和真实的问题,由于每个智能体都是单独思考,单独表现,光是每一个循环一遍就够费了,所以,如何用最简单的方式来作出一个相对真实和多变的人群,是值得在设计系统前就好好思考的,Kasper给了一个很好的设计思路,虽然有一些地方还是不够完美,但这也是在取舍时候的一些妥协,毕竟帧数一低,再好的系统也一无是处了。

最后,给出本文的PPT地址,点击这里

————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————

 

(已被阅读3,870次)

2 评论

发表评论

邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

Copyright © 2011-2020 AI分享站    登录