0×00 – 前奏
关于游戏中人工智能的应用这个伟大的话题,笔者我实在是想了很久,才敢厚着脸皮来谈一下自己的一些见解以及分享下这方面的学习心得,顺便蹭点稿费。
说起人工智能(AI, Artificial Intelligence),我们的第一印象可能是机器人,在这里我没有跟大家谈论变形金刚的打算。但有着固定形式的行动能力的机器人确实可以算是一个人工智能的载体。只是现代的机器人暂时并不具备与人类一样程度的思考能力。你可以把“智慧”和“能力”结合在一起理解为“智能”,而所谓的“人工智能”即人类按照一定的程序去模拟出来的智能过程。
现代的计算机游戏中已经大量融入了AI元素,平时我们进行游戏时产生的交互都是由AI来完成的。比如在RPG游戏中出现的NPC,实际上就是一个AI的载体,它们有着最常规,以及特定情景的判断能力与数据处理能力。判断,也称为分析。大量的分析,即逻辑。逻辑,即AI.
最形象的例子应该是游戏中具有攻击能力的怪物,当它们看到玩家时(或者被玩家攻击)的情况下,怪物可能会在指定范围或者指定时间段内跟随玩家并试图反击。但当玩家离开怪物的视野范围或者超过了怪物的跟随时间,怪物则会自动返回原来的地方。而当玩家下次出现在同一个怪物的视野内时,怪物依然会作出相同的举动。但这并不能代表怪物具有记忆能力,因为它只能根据简单的程序去判断外界发生的特定场景以作出相应的处理。这纯粹是基于数字储存器与状态机的人工智能。如果我们在此基础上再进行优化,让怪物具有记忆能力:再次看到玩家时的怪物将会出现愤怒状态,并且攻击能力变得更强,似乎会更加有趣,因为这接近了人类的情绪特征。
0×01 – 行为树(Behavior Tree)
根据上面所描述的AI载体的特征,假设一个AI载体承载的知识量过于庞大,那就给维护带来了很大的困扰。只是如果我们要实现较为智能的AI载体,庞大的知识库和行为特征是必须的。
行为树(Behavior Tree)是Next-Gen AI提出的一个原型。它以图形的形式展现了AI系统的结构。如图(1-1):
(图1-1)
以上定义的是普通游戏怪物的基本AI的行为树。所谓树,即有根节点,有分支节点,有叶节点。可能大家已经注意到,在图中行为树中具有不同特性的节点,并且这些节点似乎是以一定的规则组装成的一棵树。
行为树节点(Behavior Tree Nodes):
·选择节点(Selector): 顺序执行子节点,只要它的一个子节点返回true,则整个分支返回true,反之返回false,类似程序中的逻辑或(OR)。
·顺序节点(Sequence) :顺序执行子节点,只要它的一个子节点返回false,则整个分支返回false,反之返回true, 类似程序中的逻辑与(AND)。
·条件节点(Condition) : 属于叶子节点(该种节点不允许有任何子节点),用于描述一个条件是否成立。
·行为节点(Action) : 属于叶子节点(该种节点不允许有任何子节点),用于描述一个最终执行的动作,一般返回true。
其中选择节点(Selector), 顺序节点均属于组合节点。组合节点是一个分类概念,并非指一个节点的实例。
上图行为树中的怪物拥有[攻击玩家]、[巡逻]、[自卫]三种行为,这三种行为并非指怪物的最终决策,而是特指怪物可能会从这三个行为中出发。其中[攻击玩家]可能有两种方式,其中一个性质为顺序节点的[常规攻击],它必须要满足三个条件。而另外一个[报复性攻击],不同的地方在于多了一个条件节点[怪物处于发狂状态]。
理解各种不同节点所表达的意思,你就会很神奇地发现思路变得很清晰。整棵树的特征以及逻辑走向,必须要的条件都尽然于眼底。传统的文字描述AI的方式很不低碳,因为大量的文字并不利于团队理解策划的思路,但通过行为树则可以很明确地表达条件与动作之间的关系。
如果说行为树是统一团队理解一致性的好方法,那么如何把这个树实现出来呢?
0×02 – 状态机(State Machine)
说到状态机的概念,也许很多程序员都相当熟悉。就拿上面的行为树来说,仅仅是描述了一个怪物的AI,但其中涉及的状态可谓不少。在传统的设计思路中,玩家进入怪物的视野时,怪物的状态将会马上发生改变而从主动攻击玩家。
状态(State),指的是对象的某种形态,在当前形态下可能会拥有不同的行为和属性。状态机(State Machine),指控制对象状态的管理器。对象的状态不会无端端改变,它需要在某种条件下才会变换。比如上面定义的行为树中的[巡逻]行为,它就规定了必须是在怪物视野中找不到目标的情况下才会变更的状态。一旦有玩家进入了它的视野,它将马上切换为攻击状态。总而言之,状态会在某个事件触发之后变更。不同的状态也有可能决定了对象的不同属性和行为。
0×03 – 尾声
游戏AI是一个易于研究但难于深入的课题,限于篇幅关系笔者不能继续啰嗦。但Next-Gen AI的行为树绝对是个好东西,相信经过上面的介绍大家也对行为树的特性略知一二。有觉悟的读者可能已经意识到,既然有了行为树,那是不是意味着可以做一款辅助工具去把这棵树生成出来,然后套入一个固定的AI框架,再把游戏逻辑的雏形自动生成?这是完全可以的。如果在行为树的基础上再加入脚本的机制,那么游戏AI的实现将会更加灵活、清晰。