游戏 AI - 7

AI 引擎

Posted by Kang Cai on July 15, 2020

在行业早期的时候,一款游戏基本上都是从零开始创建的。有些代码是从以前的项目中拖出来的,有些代码被重新编写和重用,但大多数都是新的。少数公司使用相同的基本代码来编写多款游戏,前提是游戏的风格和类型相似。例如,LucasArts(2012年被迪士尼收购,2013年倒闭)的 SCUMM 引擎就是一个逐渐发展的游戏引擎,用于支持许多点击式冒险游戏,比如《古墓丽影》系列、《印第安纳琼斯》系列。

后来随着时代的发展,游戏引擎变得无处不在,逐渐地成为构建多个游戏的一致技术平台。底层的例程,如与操作系统对话、加载纹理、模型文件格式等等;在所有的游戏中都是共享的,有一组工具可用于广泛的游戏,如2D图形、3D图形、网络,最后提供接口来添加特定于游戏的代码。最初这些引擎属于个别公司专用,但随着时间的推移,只有非常大的公司能够负担得起保持更新他们的引擎,对于大多数开发人员来说,使用授权商业引擎变得很常见

AI 的发展方式也发生了变化。最初,AI 是为每一款游戏编写的,有时也为每个角色编写。现在有一种日益增长的趋势,就是将一般的AI例程构建到游戏引擎中,以商业附加组件的形式获得许可,或者由开发者自己创建并重复使用。这允许关卡编辑、游戏设计师或技术美工设计单个角色,引擎结构是固定的,每个角色的 AI 以适当的方式组合组件。本书描述的算法通过图形前端向非专业人员公开,例如,拖动框和线允许任何人创建有限状态机或行为树。

因此,构建一个游戏 AI 引擎需要构建能够轻松重用、组合和以有趣的方式应用的工具。为了支持这一点,我们需要一种能够在多种类型中发挥作用的 AI 结构。

一、AI 引擎的结构

根据我的经验,一般的 AI 系统需要一些基本的设施,它们符合下图所示的AI模型

首先,我们必须有两类基础设施:管理 AI 行为的一般机制,比如决定何时运行哪些行为,以及用于将信息导入 AI 的游戏世界接口系统。每个 AI 算法都需要遵循这个机制。

其次,我们必须有一种手段,将 AI 想要做的事情变成屏幕上的行动。它由一个运动和一个动画控制器的标准接口组成,这些接口可以将 “使用一技能” 或 “偷偷地走到位置x,y” 等请求转化为动作。

第三,连接两者的桥梁需要是一个标准的行为结构。几乎可以肯定的是,你需要为每一个新游戏编写一两个AI算法。让所有 AI 都遵循相同结构能极大地方便开发:新的代码可以在游戏运行时开发,并且新的 AI 随时可以替换掉旧 AI 行为。

所有这些都需要事先考虑清楚,在你开发 AI 编码之前,需要先计划好结构,然后各种技术才能更好地嵌入进去。

游戏引擎可以直接为你做一些工作,但不是全部。每个引擎都有自己的机制来确保您的代码能够运行,通常是从中派生的基类的形式,但是你可能需要提供更细粒度的控制:不是每个角色都需要 AI 在每一帧中运行,他们也提供了标准的调度机制,通常是一帧不超过 10 个角色的移动;它们可能会提供一些基本的工具,让你知道哪个角色能看到什么,比如内置的视线检查或者视锥检查,但是对于任何更复杂的东西,它们都需要定制的实现。除非您打算使用非常简单的技术,否则您将需要创建一些基础设施,可能还需要在编辑器中创建一些工具来支持它。

我不会在整本书中都强调结构的问题,后面文章基本都是介绍一些可以独立工作的技术,而且所有的算法都是相当独立的。对于一个 demo,或者一个简单的游戏,仅仅使用该技术就足够了,但是一个好的 AI 结构有助于促进复用,并减少调试和开发时间。

二、 工具的问题

完整的 AI 引擎会有一个可以应用于不同角色的 AI 算法工具池,特定角色的 AI 定义将由数据(可能包括一些脚本语言的脚本)组成。数据指定如何将角色组合在一起:将使用哪些技术,以及如何对这些技术进行参数化和组合

数据可以手动创建,但这跟每次都手写 AI 差不多麻烦。灵活的工具确保策划或程序能够以一种简单的方式创建内容,同时允许内容无需人工帮助即可插入到游戏中。这些通常是在游戏引擎编辑器中创建的自定义模式:用于设置角色决策规则的工具,或用于标记战术位置或需要避免的地方的关卡覆盖。

某些工具比较通用,基本上都是以同样的方式行事。寻路就是一个很好的例子:它们往往非常简单,它们很容易参数化,比如通过角色的物理能力,而且它们不会随着角色的不同而改变

而需要很多条件的行为就比较困难了,在这些条件下,角色需要评估特殊情况。有许多方法都是这样操作的,那些基于树的(决策树、行为树)更容易在视觉上表示;另一方面,基于规则的系统需要定义复杂的相关规则。即使有工具支持它们,它们通常也看起来像程序代码,因为编程语言本来就是表达它们最自然的方式。

三、总结

AI 引擎的最终结构可能类似于下图,

主要分成三个模块:

  1. 数据在一个工具(建模或关卡编辑器)中创建,然后将其打包在游戏中使用;
  2. 当一个关卡被加载时,游戏 AI 行为会根据关卡数据创建并注册到 AI 引擎中;
  3. 在游戏过程中,主游戏代码调用 AI 引擎的 update,从世界接口获取信息,并最终将 AI 引擎的输出应用游戏数据中。

所使用的特殊技术在很大程度上取决于所开发的游戏类型。在后面的文章中,我们将看到许多不同类型的技术,当你开发你的游戏AI时,你需要采取合适的或者混合式的方法来获得你想要的表现。