前段时间我和技术伙伴在做另一个游戏设计,碰上了游戏 AI 相关的难题,怎么高效实现 AI 行为,这是做独立游戏肯定会遇到的问题。为了把这方面的知识沉淀下来,我就在网上学了些逻辑知识。毕竟作为游戏策划,对如何实现游戏 AI,心里得有个清晰的思路。下面就把我整理的内容分享给大家。
一提到 AI,大家第一反应可能是机器人。这里我们主要聊聊 AI 在游戏里的应用。如今,游戏里到处都有 AI 的影子。我们平时玩游戏时产生的各种交互,很多都是 AI 完成的。就拿 RPG 游戏里的 NPC 来说,它其实就是 AI 的一种体现。这些 NPC 有基本的、常规的能力,还能在特定情景下进行判断和处理数据。这里说的判断,也可以理解为分析。大量的分析过程,其实就是逻辑运算,而逻辑,就是 AI 的核心。
游戏里最典型的例子就是那些有攻击能力的怪物。当怪物看到玩家,或者被玩家攻击时,它们可能会在一定范围或时间内跟着玩家,还想着反击。但要是玩家跑出了怪物的视野范围,或者超过了怪物尾随的时间,怪物就会自己回到原来的地方。下次玩家再进入这个怪物的视野,怪物还是会重复之前的举动。不过,这可不代表怪物有记忆能力,它只是按照简单程序,对特定场景进行判断,然后做出相应处理。这就是基于数字储存器和状态机的人工智能。要是我们再优化一下,让怪物有记忆能力,比如再次看到玩家时,怪物会进入愤怒状态,攻击能力也变强,这样是不是就更有意思了?因为这有点接近人类的情绪特征了。
行为树
行为树是一种很直观的图形建模语言,常被用在系统和软件工程里。它用一些很明确的符号,把几百甚至几千条自然语言描述的需求清楚地表示出来,这些需求一般是用来表达大规模软件集成系统中,各个相关方的要求的。我们在设计 AI 的时候,大多会采用行为树这种结构。可能是因为它分支多,看起来就像棵树,所以才叫行为树。
从上面说的 AI 载体的特点来看,如果一个 AI 载体要承载的知识量特别大,那维护起来就麻烦了。但要是想做出比较智能的 AI 载体,又必须得有庞大的知识库和丰富的行为特征。行为树正好能以图形的形式,把 AI 系统的结构展示出来,让我们能更清楚地看到 AI 是怎么运作的 。
上面讲的是普通游戏怪物基本 AI 的行为树。什么是树呢?就是有根节点、分支节点和叶节点。大家可能已经发现,行为树里的节点各有不同的特性,而且这些节点按照一定规则组合成了一棵树。
行为树节点
- 选择节点(Selector):它会按顺序去执行子节点。只要它的子节点里有一个返回 “true”(可以理解为 “成功”“满足条件”),那整个分支就返回 “true”;要是所有子节点都返回 “false”(“失败”“不满足条件”),那整个分支才返回 “false”。这就跟程序里的逻辑 “或(OR)” 是一样的。比如说,你要出门,条件是要么有伞,要么天晴。只要满足有伞或者天晴其中一个条件,你就能出门,这就是选择节点的逻辑。
- 顺序节点(Sequence):同样是按顺序执行子节点。但和选择节点相反,只要它的子节点里有一个返回 “false” ,那整个分支就返回 “false”;只有所有子节点都返回 “true”,整个分支才返回 “true”。这类似于程序里的逻辑 “与(AND)”。打个比方,你要完成一个任务,必须同时满足集齐材料和学会技能这两个条件,少了任何一个都不行,这就是顺序节点的运作方式。
- 条件节点(Condition):它属于叶子节点,也就是不能再有子节点了。条件节点主要是用来描述一个条件是否成立的。比如 “怪物是否发现玩家”,这就是一个条件节点,它只有 “是” 或者 “否” 两种结果。
- 行为节点(Action):也是叶子节点,没有子节点。它主要用来描述最终要执行的动作,一般情况下返回 “true”,也就是默认这个动作能正常执行。比如 “怪物攻击玩家”,这就是一个行为节点,表示怪物要进行攻击这个动作。
其中,选择节点和顺序节点都属于组合节点。组合节点只是一个分类概念,不是指某一个具体的节点。
在上面那张行为树的图里,怪物有 [攻击玩家]、[巡逻]、[自卫] 这三种行为。不过这三种行为不是说怪物最后一定会做这些,而是说怪物可能会从这三种行为里选一个来做。像 [攻击玩家] 这个行为,又有两种方式。一种是 [常规攻击],它是一个顺序节点,要满足三个条件才能进行;另一种是 [报复性攻击],和常规攻击不同的是,它多了一个条件节点,也就是 “怪物处于发狂状态”,只有怪物发狂了,才会进行报复性攻击。
只要理解了这些不同节点的意思,你就会惊喜地发现,思路一下子变得特别清晰。整棵树的特点、逻辑走向,还有需要满足的条件,全都一目了然。以前用文字来描述 AI,效果不太好,因为一大串文字很难让团队里的人都理解策划的想法。但通过行为树,就能很清楚地展示条件和动作之间的关系。
既然行为树是让团队成员对 AI 理解保持一致的好办法,那要怎么把这棵树在游戏里实现出来呢?这就用到状态机了。
状态机
很多程序员对状态机的概念都很熟悉。就拿上面的行为树来说,虽然只是描述了怪物的 AI,但里面涉及的状态可不少。按照以前的设计思路,当玩家进入怪物的视野,怪物的状态就会马上改变,然后主动攻击玩家。
状态,就是指对象的一种形态。在不同的形态下,对象可能会有不同的行为和属性。状态机,就是控制对象状态的管理器。对象的状态不会平白无故地改变,必须在满足某种条件时才会发生变化。比如说上面行为树里的 [巡逻] 行为,规定了只有在怪物视野里找不到目标的时候,才会进入巡逻状态。一旦有玩家进入它的视野,它就会马上切换成攻击状态。简单来说,状态是在某个事件触发之后才会变更的,而且不同的状态也会决定对象有不同的属性和行为。
案列解析
接下来说说策划在做AI相关案子的时候一般是怎样的,当然,这仅限于我自己的想法,也许很多人也有不同,我就拿我自己做的的来进行举例(一款横版的休闲竞技游戏):
游戏里一共有 8 个等级的 AI,从低到高依次是新手、青铜、白银、黄金、白金、钻石、王者、传说。新手 AI 的各项设置是专门为新手局准备的。其他等级 AI 的配置和设定,会根据不同的触发时机和匹配规则来使用。比如说,要是你当前是青铜段位的玩家,在超时匹配的情况下,就会匹配到同为青铜段位的 AI。
1.1V1 触发及匹配 AI逻辑
新手局:玩家刚进入游戏的前 3 场比赛(这个场次可以根据需求调整),就属于新手局。在新手局里,玩家会匹配到最基础的新手 AI。
温暖局:要是玩家连续输了 3 场比赛(不管是 2V2 还是 1V1 的模式,输的场次也能调整 ),就会进入温暖局。这时候,系统会给玩家匹配比他当前段位低 1 到 2 个段位的 AI。打个比方,要是玩家的段位是黄金,就有可能随机匹配到白银或者青铜的 AI;要是低两个段位后低于青铜,那就默认匹配青铜段位的 AI。
难度局:当玩家连续赢了 5 场比赛(场次可配置),就会进入难度局。在难度局中,系统会给玩家匹配比他当前段位高两个段位的 AI。比如玩家是钻石段位,就可能随机匹配到王者或者传说段位的 AI;要是高两个段位后超过传说,那就默认匹配传说段位的 AI。
超时匹配 AI:玩家在匹配对手时,如果等待了 30 秒左右(这个时间可以设置,实际等待时间在 28 - 32 秒之间随机 )还没有成功匹配到真人玩家,就会进入超时匹配。超时后,系统会为玩家匹配和他同等段位的 AI。
2.2V2 触发及匹配 AI逻辑
温暖局:同样是玩家连续输了 3 场比赛之后(不管之前玩的是 2V2 还是 1V1,场次可调整),就会进入 2V2 的温暖局。这时,系统会给玩家匹配 1 个战友 AI 和 2 个敌方 AI 陪玩。战友 AI 的段位和玩家一样,比如玩家是白银段位,那战友 AI 也会从白银段位的配置表里读取数据;敌方 AI 的段位比玩家低两级,比如玩家是钻石段位,敌方 AI 可能是两个黄金段位,也可能是一个黄金一个白金段位,或者两个白金段位。
难度局:当玩家连续赢了 5 场比赛(场次可配置),就会开启 2V2 的难度局。在难度局里,系统依旧会给玩家匹配 1 个战友 AI 和 2 个敌方 AI。战友 AI 和玩家同段位,比如玩家是白银,战友 AI 也是白银段位的配置;敌方 AI 则比玩家高两级,要是玩家是钻石,敌方 AI 可能是两个王者,也可能是一个王者一个传说,或者两个传说。
超时匹配 AI:2V2 的超时匹配分为两个阶段。首先是匹配队友,玩家等待 15 秒左右(可设置,实际在 13 - 17 秒之间随机)还没匹配到真人队友,就会匹配和玩家同段位的 AI 队友,比如玩家是白银,就匹配白银段位的 AI 队友;然后是匹配敌方,同样等待 15 秒左右(可设置,实际在 13 - 17 秒之间随机),还没匹配到真人敌方,就会匹配 AI 敌方。匹配的 AI 敌方,其中一个和玩家同段位,另一个和玩家的战友 AI 同段位。
3.行为树设定1)敌方挑中食物但我方未挑中我们设计的时候为了策划调配方便,一般都是采用配置表的形式。
在这种情况下,系统会先判断敌方是不是挑中了食物。要是敌方已经挑中了食物,接着就会看我方有没有挑中食物。如果我方没挑中,系统就会按照配置表中的概率,让我方 AI 从下面这五种行为里选一个来执行。
- 移动 & 躲避:AI 会在规定的一段时间内,一边移动一边躲避。等这个动作完成,或者规定时间到了,就进入下一回合的循环。
- 挑掉对方食物 & 躲避:AI 会在规定时间内,尝试挑掉对方挑中的食物,同时进行躲避动作。同样,动作完成或者时间结束,就进入下一回合。
- 寻找食物 & 躲避:AI 会在这段时间里,一边寻找食物,一边躲避。之后进入下一回合。
- 使用道具:要是 AI 还有道具可以用,就会使用道具。道具使用完后,进入下一回合;要是没有道具了,就直接跳过这一步。
- 使用表情:AI 会从已有的表情里选一个来使用,使用完表情后,进入下一回合。
2)敌方挑中食物且我方也已挑中食物
当出现这种情况时,系统会先去判断敌方是不是挑中了食物。要是敌方挑中了,接着会判断我方是否也挑中了食物。如果我方也挑中了,那就再进一步判断我方挑中的是不是带有 Buff 效果的食物。然后根据不同情况,按照配置表的概率来决定 AI 的行为:
A. 敌方挑中食物且我方挑中 Buff 食物
在这种情况下,系统会查看 AI 的配置表。根据配置表中的概率,AI 有一定的可能性会给对方喂食食物,或者挑掉对方的食物。同时,AI 也有一定概率会在规定的一段时间内进行躲避动作。
B. 敌方挑中食物,但我方挑中普通食物和 Debuff 食物
这时系统会依据 AI 配置表,让 AI 从下面这些行为中选择执行:
移动 & 躲避:AI 会在规定的时长内,一边移动一边躲避。等这个动作完成,或者规定的时间到了,就进入下一回合的循环。
喂食对方食物 & 躲避:AI 会在规定时间内,给对方喂食食物,同时进行躲避动作。动作结束或者时间结束后,进入下一回合。
挑掉对方食物 & 躲避:AI 会在这段时间里,尝试挑掉对方的食物,并且进行躲避。之后进入下一回合。
使用道具:如果 AI 还有道具可以使用,就会把道具用掉。道具使用完毕后,进入下一回合;要是没有道具了,就直接跳过这一步。
使用表情:AI 会从已有的表情里任选一个来使用,使用完成后,进入下一回合。
3. 敌方未挑中食物但我方挑中食物
游戏里会先看看敌方有没有挑到食物,如果敌方没挑中,接着就查看我方是否挑中食物。要是我方挑中了,那 AI 的行为逻辑和 “敌方挑中食物且我方也已挑中食物” 里的情况类似,但具体的行为概率和细节,会按照单独配置的配置表来执行。
4.敌方未挑中且我方未挑中食物
当双方都没挑中食物时,我方 AI 会按照以下几种行为,依据一定概率来执行:
- 移动 & 躲避:AI 会在规定的时间里,一边四处移动,一边注意躲避可能出现的危险。等这一轮动作做完,或者时间一到,就进入下一轮的行动选择。
- 寻找食物 & 躲避:在同样规定的时长内,AI 一边到处寻找食物,一边不忘躲避,确保自身安全。等这个阶段结束,就开启下一回合。
- 使用道具:要是 AI 还有道具存货,就会使用道具。用完之后,进入下一轮;要是已经没有道具了,那就直接跳过这个行为,考虑下一个。
- 使用表情:AI 会从自己拥有的表情里,随便选一个展示出来。用完表情,就进入下一回合,重新选择行为。
2V2的行为树配置方式我就不做说明了,参考1V1的形式大差不差,其实主要是通过这个案例来说明一下行为树和AI设计逻辑。
欢迎阅读笔者其他内容