Unity 行为树设计行为树基本概念行为树:常用的 AI 决策模型有状态机和行为树两大类状态机更接近人的思维,但行为树更加 直观、灵活因此,行为树目前变成了复杂 AI 的主流模型行为树与有限状态机都可以完成一组相同的任务其中有限状态机定义了一组状态,同 时描述了这组状态中,在不同情况下,彼此转化的一组规则有限状态机指导了智能体 在不同的情况下完成它们的功能,但当智能体的处理逻辑变得较为复杂的时候,状态的 数量会急剧上升,与此同时,它们之间的转化关系也会呈指数型的增加,使开发者越来 越难以理解与管理对于这种情况,使用有限状态机中的层级状态机能起到一定程度的作用,在层级状态机 中,智能体的行为会进一步分解,变成更小的片段但对于转换关系的爆炸式增长,没 有得到很好的解决行为树可以看成一种树型的数据结构,行为树中有叶节点和组合节点同时把行为划分 成了很多层级,较低层级的行为能够进行组合,成为较高层级的行为在行为树需要得 到更新的时候,结构会执行 DFS 操作,依次达到末端的叶节点,叶节点根据不同的情 况,反馈不同的结果,例如,可以是“执行成功”或者“执行中”由于这样的树型结 构,每一个分支并不是同时遍历到的,同时利用这种特性,可以很轻易地设置行为动作 的优先级水平,让靠前的叶节点承担更重要的行为。
行为树中的节点: 行为树中有许多种节点,甚至可以自定义节点,来实现目标功能1)节点的返回 执行中:表示当前的节点还在执行中,下一次的执行仍然选择当前节点 成功:表示当前节点执行成功失败:表示当前节点执行失败2)根节点 是行为树的入口,类型可以是任意的3)组合节点 选择节点/优先选择节点:从左到右依次执行子节点,同时在第一个非失败的节点停住 并返回当所有节点返回失败时,自身也返回失败,否则返回最后节点的状态 随机选择节点:规则与选择节点基本一致,但它的顺序是随机的,且每个子节只会被选 择一次顺序节点:从左到右依次执行子节点,若子节点返回成功,则继续执行,在第一个非成 功的节点停止并返回修饰节点:相当于某个节点的前缀,对该节点进行行为的改变修饰节点可以有很多种 例如,Until Success/Failure会一直执行子节点直到返回了成功/失败Limit会给子节点 一定次数的机会,若还是失败了,才返回失败还有时间控制相关的修饰节点4) 并行节点并行节点也会依次执行所有的子节点,但是不管成功或是失败都会继续执行,并在执 行完毕后根据所有的子节点的返回来最终确定自身的返回值5) 叶节点条件节点:相当于一个if判断语句,根据判断的结果自身返回对应的值。
行为节点:用来完成具体的操作 面举一个例子来综合说明本节的内容在系统中,一个很常见的行为是有障碍的目标点 抵达行为一个坦克智能体要抵达前方不远处的半开放区域的集合点,则它需要根据判 断前方的路障是否处于激活状态如果路障处于非激活状态,那么它可以径直进入;但 如果路障处于激活状态,目标点处于封闭区域内,则智能体需要对路障进行破坏等操作, 破坏目标点所在区域的封闭性,这个逻辑可以下图所描述的行为树表示这棵行为树综合运用了选择节点与顺序节点等节点的组合,利用行为树的特性较为清晰表示 了上述的逻辑,能够较好地实现智能体的行为智能体的行为设计结合具体的实际工程,战场上共有三个A方坦克和三个B方坦克其中红方中的一个由玩 家控制,双方在战场上进行交火,当B方全灭时,另一方还有剩余坦克则取得胜利玩家和 智能体的目标都是尽可能保护自己的条件下然后摧毁 B 方两队在地图上的位置是随机分布 的,不过也存在参数去控制它们之间的最小距离一旦程序开始运行,首先双方会在地图上 进行巡逻,如果发现敌人则展开攻击,同时要注意在双方不对等或者自己健康状态不好的时 候保护自身,另外在此期间会通知队友,同队之间会产生互动,因此可以把智能体的行为概 括为:巡逻行为、攻击行为、规避行为、交互行为。
假设场景中有N个B方坦克,为了方便说明与调试起见,设定N=3在目前的模式中,它 们没有主次之分,没有“首领”,因此它们的逻辑基本一致,可以共享同一棵行为树但是 由于行为树中存在随机节点,它们本身也存在参数设定的不同,因此,它们又具有自身独特 的个性,避免了重复单调,保证了多样化A 方的 AI 坦克同样也将有相同的战斗逻辑,遵循这四种行为,但是由于有真人玩家的参与, 其中的交互行为将有所不同,不再单纯是和其它智能体进行交互通过对交互行为的重新设 计,可以满足A方智能体与玩家之间的互动1、巡逻行为巡逻行为是最基本的行为,也是智能体在idle状态默认的行为当系统开始运行时,智能 体就会处于巡逻状态它会根据具体的设定,首先对己方附近的地图进行巡逻,如果没有敌 人的话,则会执行路径搜索算法,前往随机的几个标识地点如果还是没有发现敌人,则会 继续前往下一个随机标识地点,且地点之间不会重复如果所有地点都搜索完毕还是没有发 现敌人,说明本轮的搜索没有发现敌人,究其原因可能是无意间和敌人错开了,则会展开新 一轮的搜索因此,经过行为树的几轮选择之后,双方敌人终会相遇产生战斗,避免了进入 死循环的尴尬场景巡逻行为节点是一个判断节点,巡逻行为节点下方级联了顺序节点,依次检测是否存在敌人 和特定的信号,然后执行巡逻的具体行为。
当巡逻过程中发现问题时,下方的节点会返回失 败,从而整个巡逻节点返回失败,智能体的行为树将结束巡逻行为,转而执行其它行为,推 动游戏进程的发展巡逻行为节点的第一顺序节点是敌人检测节点这就涉及到了智能体的视觉、听觉等感知系 统它们被包括在节点的具体实现中下面以视觉系统为例,简单介绍了智能体视觉系统的 实现原理在视觉系统中,假设坦克的视觉取决于其前方驾驶者的视觉遍历每一个B方坦克,判断能 否“看到”该坦克对于每个坦克,首先用该坦克的 transform 减去被判断坦克的 transform, 得到一条方向射线然后计算出该射线与坦克朝向射线的角度,如果该角度小于坦克视角的 一半,则认为这个坦克可以被侦测到,进而节点返回成功,行为树进行下一步的动作 由于视觉和听觉可以综合使用,又例如坦克上可以装配雷达等检测装备,这是一个动态变化 的过程因此,这里的工作把视觉、听觉、检测装备等统一归为检测节点,不再展开成单独 的节点其中的细节,由程序中的函数进一步完成计算工作2、攻击行为 攻击行为节点是取得胜利的一个重要节点,同时也是一个承上启下的节点在攻击行为中, 首先要向敌人移动,确保敌人在射程范围中由于移动是一个过程,所以起初移动相关的节 点会返回“执行中”,在完成自己当前的动作后,才会返回“成功”,从而进行下一步的动作。
在即将攻击之前,智能体还将对战场总体形势有一定的了解,并且根据其性格进行不同的行 为例如,可以把智能体分为三种性格:勇敢、一般、狡猾其中勇敢的智能体只要弹药充 足,任何情况下都会冲向敌人,进行射击而一般的智能体会判断附近的队友和视线范围内 的B方坦克的势力比是否等同,如果等同才会进行攻击而狡猾的智能体只有在附近A方 的势力大于 B 方的势力的时候才会展开攻击,否则会试图离开,去寻找队友或者掩体 在具体的攻击过程中,还需要进行瞄准,然后选择一个相对合理的射击时间在射击时间过 后,返回父节点,重新进行新一轮的判断和选择同时在其中加入了适当的延迟,从而保证 程序的稳定运行,同时更符合真实的情况在射击完成之后,还需要判断自己是否需要装填操作值得注意的是,攻击过程中也有可能 出现弹药打完需要装填的情况,但是和这里的情况有所不一致在攻击过程中如果遇到弹药 用完的情况,会根据程序判断,从而强行停止本次行为而在射击完成之后,会判断弹药是 否达到一个期望的量,如果没有达到的话,即使还没有用完弹药,也会进行装填动作这是 行为树的判断节点的要求和所完成的动作,和前面一种情况有所不同当敌人被摧毁后,攻 击动作完成,从而移动至下一个目标地点或者进入巡逻状态。
3、规避行为规避行为是一个衍生节点,可以在多处被调用游戏中存在多个智能体,其中B方的智能体 它们共享了同一棵行为树在前面中提及到,可以根据敌人的性格产生可能不同的行为,这 样做的话,就需要设计不同的行为树如果智能体的行为过多的时候,这样的工作量将是巨 大的根据行为树的特性,将节点以逻辑进行合理的封装,同时将子树重复利用,避免大量 无效重复的劳动规避行为并不是一个独立的行为,它可以在行为树中多次出现例如,可能是因为A、B方 势力不对等而产生的规避,也有可能是需要填充弹药而产生的规避因此,充分利用行为树 子树利用的特性,不把规避行为包含在攻击行为中,而是将它独立出来,进行单独的分析进入规避行为节点后,首先应该判断周围的环境有没有敌人如果再进一步,还可以判断敌 人的弹药是否充足或者敌人是否处于开火的状态接下来,判断是否已经处理安全的位置 这两个判断节点任何一个满足的时候将返回“真”,同时规避行为节点将返回,不再进行进 一步的动作当前两个判断节点无法得到满足的时候,将寻找附近的掩体具体的寻找的方式可以对智能 体进行碰撞检测,但本文的做法与前面类似,预先定义了掩体的序列,在需要掩体的时候将 遍历该序列,找出远离目前敌人的条件下相对来说离自己较近的掩体,执行规避操作。
4、交互行为交互行为对于 B 方坦克来讲,即“通知行为”,是智能体与其它智能体交互的行为对于 A 方坦克来讲,除了通知行为外,还包括了与玩家进行交互的过程这个行为与上述三个行为均有不同,主要表现在: (1)交互行为可以存在和体现于各个行为之中,无法完全单独用一棵公共的子树描述与表 示即不存在“交互行为节点”2)交互行为需要结合玩家的外部信息,即根据最小文本,与智能体的行为树有机结合, 来实现干预智能体在没有干预条件的时候,也应当可以进行自主决策;但当有干预条件的 时候,不应当全盘无条件的接受,而是应该根据现有的运行状态综合判断通知节点主要表现在如下方面首先,在巡逻行为中,发现敌人后,会向友方发出通知;其 次,在巡逻行为中,即自身没有处于战斗状态时,会接受来自友方的通知,进行支援等行为 交互行为还将接受来自玩家语音提供的信息例如在巡逻行为中,接受来自友方通知的节点 也将持续捕获来自玩家语音信息的节点,如果产生了有效的语音信息,将会进一步匹配攻击 或规避等行为,如果这个行为需要额外的名代词信息的话,则会进一步获得名代词中提供的 地点等信息,进而触发进一步的操作交互行为很好的分布在了行为树中,在符合一定条件的情况下,对友方发出通知,同时接受 友方的信息。
智能体的行为树建立1、智能体的行为树确定了智能体的四种基本行为,且详细描述了四种行为所包括的逻辑关系通过分析每一种 行为的逻辑,可以很容易的建立每一种行为的子树,作为一棵完整的行为树,还需要将它们 组成起来 综合以上的论述,本文将智能体的行为树设计如下,其中为了表示方便,灰色 部分的子节点顺序按照从右至左的方向依次排布,如下图所示换雹打为19机雄迟NKE4Until Vai对灌目标主往■血玖蛊厅为逋知行内 留旬=;■■' SiWfitA ■■二=■ 通5®乩友状志判豪2、使用 unity 行为树编辑Unity中,可以使用Behavior Designer (BD)很方便的来进行行为树的可视化编辑等操作 本系统中的行为树的实际应用就采用了 Behavior Designer下面以一个实例来具体说明Behavior Designer 的应用方式一个典型的移动游戏逻辑可以在 Behavior Designer 中用如 下的行为树表示■ BehavioraEntiy。