【技术·真相】谈一谈游戏AI - 综述

654 阅读7分钟

成功者总是善于发现 “可学之处”,执着精进;失败者总是善于发现 “不可学之处”,怨天尤人。

郑重说明:本文适合对游戏开发感兴趣的初级及中级开发和学习者,本人力图将技术用简单的语言表达清楚。鉴于水平有限,能力一般,文章如有错漏之处,还望批评指正,谢谢。


最近,人工智能应用chatGPT火遍全球。今天,我想开一个小专题,谈一谈游戏AI。但此AI非彼AI,形式和机制差别巨大,相同的是,两者都创造了价值。

AI,全称为 Artificial Intelligence,是任何可以让机器模拟人类行为的能力。那么,在游戏开发中,是怎么让机器模拟人类的行为的?


一、游戏AI的应用

在游戏领域,AI的应用范围大致应用在以下一些方面:

image.png
  1. NPC决策。我们在玩游戏的过程中,经常会与大量的NPC打交道,真实生动的NPC带来的体验让人心情愉悦。NPC在与游戏玩家交互的过程中,如何模拟人类的反应来做决策至关重要。
  2. 移动与导航。地图游戏中,移动成为必须。有大量的算法来研究如何智能地模拟人类的移动行为。
  3. 博弈AI。棋牌或者即时对战类游戏中,存在大量的博弈。近些年知名的AlphaGo就是其中的典型代表。
  4. 游戏内容生成。在引入工业化生产的现代社会,游戏内容也是一类快速消耗的产品。如何快速有效地生产丰富多彩的游戏内容,也引起了开发商的关注。游戏AI也能辅助开发者生产,如地图生成等。
  5. 数值平衡性。一些游戏的战斗中,往往涉及大量的技能、效果,互相作用带来了无穷的结果。因此用AI来辅助我们做数值平衡性的跑测,力求公平,避免产生致命的问题也很重要。

二、NPC决策:sense-think-act 模型

决策模型

设想一下,你设计的一款游戏里有一个NPC怪物,我们叫他小木吧:

image.png

在游戏开始后,小木应该怎么做决策,来决定接下来做什么呢?

对游戏有过了解的同学应该清楚,游戏内状态的更新和变化都是通过一个叫做循环的东西来控制的。小木身处这样一个循环的世界,要做的也就是自身不停的循环。

在每一次的循环中,小木需要经历三个阶段,我们称为 sense-think-act 循环模型:

image.png
  • Sense: 在这个阶段,小木需要探测周围世界中的信息,或者被告知周围世界中发生了什么事情。这些信息或者事情会影响它的行为。例如,有危险正在靠近,地上有物品可以拾取,或者受到了攻击。
  • Think: 小木需要做出决策,对上述的Sense做出适当的反应,比如应该战斗还是逃跑,亦或是拾取物品。
  • Act: 小木需要以上述决策作为目标,来具体实施。比如移动到某个低点,释放技能,或者做出拾取的动作。

每一次的循环中,都依次执行这个 sense-think-act模型,如此无限往复。


与通用AI决策的区别

需要注意的是,游戏内的AI 并不一定要做 “最优” 的决策,而是要有趣或者富有挑战性,要表现的很逼真,拟人,最优解并不一定是设计者需要的。所以类似 AlphaGo 这种超级智能的AI 并不符合游戏中实际的需要。

另外,最优解往往需要大量的训练或者计算,并不能满足游戏中大量AI 对实时性和性能的要求。所以 GameAI 和 实际机器学习中的 AI 还不太一样。


有关 Sense

很多游戏引擎中,会集成主动sense模块。如 UE4 中的感知(perception):

image.png

从图中,我们可以看到很多具体的感知:

  • 听觉
  • 视觉
  • 触觉
  • 团队感知
  • ...

在游戏中除了每一次思考时主动感知(sense)之外,往往还有另外一类感知:

对事件做出反应(responding to events)

在每一次的循环中,可以主动感知,每一次的感知间隔(循环间隔)可以是一帧,或者一次思考间隔的时间,如0.5秒。

正是因为有感知间隔,NPC决策往往不够实时。因此,还需要有对被动感知的处理。例如,NPC收到队友的呼救信息,受到攻击等等。通过对事件做出实时反应,NPC的决策才会更真实。


三、AI决策模型的实现

发展历程

对于决策模型 sense-think-act,其实现方式经历了一系列的演变。大致有以下一些方式:

image.png

基础决策

1) hardcode

如 hardcode 在代码中一个例子:球拍击球的小游戏AI:

every frame/update while the game is running:

if the ball is to the left of the paddle:

	move the paddle left

else if the ball is to the right of the paddle:

	move the paddle right

每一帧的循环中,对照 sense-think-act 模型:

  • sense 就是两个 if 条件。AI 在 if 中主动从 game 中拉取需要的数据:球是在球拍的左边还是右边。
  • think 也体现这两个 if 条件中,体现了决策分支,只不过是 hardcode 的方式,这几个分支是互斥的关系。
  • act 就是 move 的操作,会涉及具体的 move 实现,如设置方向和速度等。

2) 配置表

hardcode的方式过于死板了,调整起来非常不方便。游戏中成千上万的AI如果都使用hardcode的方式来实现,基本是无法维护的。

如果使用数据驱动的方式,如配置表驱动,则要更方便,参数可以灵活调整,但是具体的决策项还是要提前通过代码实现好。

3) Script

配置的方式毕竟还是有不少限制。此时,我们可以使用脚本语言如 Lua,其可以实现更为强大的功能。很重要的一点是,它和配置表一样也可以热更新。这对开发调试,以及在线修复或调整AI的逻辑错误等比较重要。


高级决策

在基础决策实现的基础上,又发展出了一些更高级的决策方式,如状态机、行为树、Utility权重决策等,这一部分我们后面再继续阐述。


三、移动与导航

在前面的文章中,我们说明的是AI应用中比较典型的NPC决策模型。

而这里我们要讨论的另一大类,移动与导航,其实是上述决策模型中的 act,因为它非常常用,所以可以作为典型单独讨论。

移动会涉及到速度(velocity)的设置以及方向。在 think 环节,我们可以设置这个 velocity 或者设置其目的地或者追击的 target 等,然后在 act 环节做具体的 move。

导航在游戏中更为常见,涉及到一些经典的寻路算法如:

  • A* 算法
  • JPS 算法
  • NavMesh算法

这些算法如果要应用到地图导航中,还需要涉及地图如何表达的问题。这些我们也会在之后的系列文章中讨论。

关于AI在博弈对战、游戏内容的生成以及数值平衡性的使用,本人经验也不多,以后有研究成果了再单独分享。

关于游戏AI的综述我们就说到这里。



【参考资料】

The Total Beginner's Guide to Game AI

AI分享站