总得来说,游戏AI(Game AI)就是一种能让开发者为玩家创造引人入胜体验的东西。我们用的每一个技术、每一个技巧、每一种算法,都是为了那么一个单一的目标。本文将围绕这一点展开讲解究竟什么是游戏AI。
首先需要明白的一点是,游戏AI中的AI(Artificial Intelligence,人工智能)与我们讨论计算机视觉、自然语言处理等领域时所说的AI其实是两回事。在本文中,我们把后者称为学术AI(academic AI)。
那么学术AI和游戏AI本质的区别是什么呢?学术AI的目的是创造一个智能体,该智能体根据环境作出动作,以最大化成功率为目的。例如在图像识别任务中,我们希望AI能够获得尽量高的准确率。而游戏AI并不是要做到最大化成功率。例如在星际争霸的游戏中,我们并不是以胜利为目的来设计AI的,而是以让玩家有一段美妙的游戏体验而设计的。在这种目的的引导下,我们有时故意把AI做的不那么强大,甚至通过让AI作弊来获取更多信息。而获取这些信息不是为了击败玩家,而是为玩家提供更好的服务(关于这些,会在后文详细展开)。有时游戏AI也会借助学术AI的方法,但绝大多数时候,他们是不同的。游戏AI关注的是:AI的外在表现,以及给玩家带来的感觉。
创造体验
上文已经提到,游戏是要为玩家创造引人入胜的体验。而游戏AI是为了支撑这段体验(游戏的其他部分其实也是)。接下来要讨论的是为了支撑这段体验,设计游戏AI时,有哪些关键因素。
(1)搁置怀疑
玩家是自愿地加入到这段我们为他创造的体验中来的。因此,他们非常愿意搁置自己对我们所创造的虚假世界的怀疑。而我们的责任是维持玩家“搁置怀疑”的状态。
由于玩家自愿来享受这段体验,也因为人类大脑的工作方式,因此他们是非常宽容的。只要AI的行为基本合乎情理,玩家的大脑就会自然地向自己解释AI的行为,而那种解释往往是复杂的,比实际的AI算法复杂的多。所以,AI设计者可以尽量设计简单但合理的AI。太过于复杂的AI反而会让玩家摸不着头脑,适得其反。
有一种要避免的情况,就是人造蠢货(artificial stupidity)。所谓人造蠢货就是指做一些显然错误,或没有意义的事。确实在很多游戏中出现了这样的AI,但也不是故意的设计,而是一些BUG。比如一直朝着墙走,或完全无视玩家对他的射击。
有些行为虽然也会在真实人类身上看到,但仍然要避免,因为他们不适合AI。例如,人类总是频繁地改变自己的想法,但如果AI也这么做了,就会给玩家一种出现Bug的印象。
解决人造蠢货最简单方法就是增强AI。但是,玩家的品位各不相同,很难同时满足所有玩家。因此还诞生了一些别的方法,解决人造蠢货让玩家无法“搁置怀疑”的问题。例如,在有的僵尸游戏中,僵尸的AI被故意创造成走路缓慢、一摇一晃的样子,但由于他们是长相可怕的僵尸,仍然可以被玩家接受。还有一些游戏中,让游戏的角色喊出一些话。例如,“手榴弹(Grenade!)”,“我发现他了!”。这些并不是用作游戏角色间的交流,而是向玩家解释角色的行为。有些游戏直接在角色头顶放一些图标来向玩家解释(例如模拟人生)。
(2)反应性,不确定性和创作者控制
各种各样的结构,那个对于游戏AI来说才是最好的?这是一个被广泛讨论的问题。
首先要讨论的是,“创作者控制(Authorial Control)”和“自我控制(Autonomy)”之间的权衡。所谓“创作者控制”是指AI的创作者对AI的掌控,创作者能根据自己的意愿调整、控制AI,而AI受环境的影响较小。“自我控制“是指AI受创作者的控制力度小,根据环境的不同做出多变的反应。举例来说,Alpha Go就是高度自我控制的。因为他通过蒙特卡洛树搜索+深度强化学习训练得到,设计者也不知道最终AI下棋的模式是什么样子,可以说他几乎完全不受创作者意愿影响。下图给出了不同算法的“创作者控制”和“自我控制”比例的相对关系。
不同算法的“创作者控制”和“自我控制”比例的相对关系
“自我控制”很多时候称作强反应性(Reactivity)。反应性指的是AI能够根据环境不同做出不同行为的能力。
没有一个确定的答案说哪一种算法更好。这往往是根据需求而定的。例如策略游戏(例如魔兽争霸)就需要较强的反应性。玩家每一局的行为是不同的,AI以不变应万变显然是不合适的。而在像魔兽世界这样的游戏中,AI的行为往往是高度受“创作者控制”的。同一个副本,刷第一遍和刷第二遍,怪物的AI并不会有什么不同的行为。
选择AI结构时,另一个复杂的因素是不确定性(nondeterminism)。很多时候游戏中的随机性能够带来更多的快乐(例如Roguelike)。和反应性不同,反应性要求的是对不同环境作出不同的行为,而不确定性是指同样的情况下也能作出不同的行为。在这一点上,behavior trees 和 utility-based AI 是比较好的。
总得来说,结构是根据游戏需求选择的。
(3)简单和可扩展
如果熟悉游戏AI常用的算法,可以发现他们本身是非常简单的。而已这些算法为框架,在框架之上建立的结构才是复杂的部分。底层算法代码简洁、容易理解、容易debug,这是非常重要的。
有些算法的可扩展性很差,当AI结构越来越大,会越来越难维护。因此,一个好的游戏AI算法,不光要简单,而且要求扩展性好。
(4)技巧和作弊
首先要讲一个魔兽争霸里的剧情AI的例子。AI会等待固定的一段时间,然后产生一波兵攻击玩家。它会选择在战场迷雾的边缘产生这些单位,也就是在你的可见范围外,AI会不停的生成士兵,直到你的防御力量几乎被毁灭,然后AI就会停止,并让你用剩余的兵力赢得战斗。
在这个例子中,可以说AI是完完全全的作弊。他不需要任何建造、采集,可以任意的让单位从天而降。但他的结果是好的,他让玩家体验了一场惊心动魄的战争。
但是,这种作弊有一个弱点,它只在玩家不知情的情况下有效。如果玩家发现了AI在做什么,那么设计者精心设计的游戏体验将毫无意义。
还有一种作弊称作“完全信息”。即AI知道一切。他拥有所有的视野,不需要探索就能知道金矿的位置、敌人的位置。事实上这是必要的。因为目前AI还没有像人类一样的推理能力。例如一个单位出现在AI的视野里,然后消失了,但下一瞬间又出现了。人类能够推断这个单位就是之前小时的单位,但是这对AI来说是困难的。我们不能要求AI在玩家的电脑上存储自己的记忆。
但是,完全信息的AI仍然需要让玩家“搁置怀疑”。即使AI知道金矿的位置,也不能因此而不去探索。让AI有一定的概率去探索一个实际已知,但却不应该知道的地方。这样一来,AI的行为就能更好得被玩家的头脑所解释。
总结
游戏AI只应该关于一件事:如何让开发者为玩家创造一段引人入胜的经历。
本文是对《Game AI PRO》第一章的总结加一点个人想法。有时间会持续更新后续章节。
本文首发于我的知乎专栏:https://zhuanlan.zhihu.com/GameAI
暂无关于此日志的评论。