16.Gameplay玩法系统基础AI

16.游戏引擎Gameplay玩法系统基础AI


16.1 AI课程大纲


16.2 寻路系统

基础AI(Basic AI)中,寻路系统(Navigation System)是“智能体能动起来”的第一块地基:它负责在给定起点与目标点的前提下,自动找到一条可通行路径,并让运动轨迹尽量自然。

需要注意的是:玩家是否启用自动导航属于体验选择;但 AI 智能体几乎必然需要自动导航,否则很难在复杂关卡中稳定完成追击、巡逻、撤退等行为。

AI 的“智能”要成立,前置条件是能在世界里稳定地移动:哪些地方能走、哪些地方过不去,这些对人类而言近似本能的判断,需要在虚拟世界里被系统化、数据化。

以《刺客信条:奥德赛》为例:从 A 点到 B 点的“导航线”把玩家的移动决策从“找路”转成“选择目的地”;同样的能力对 AI 智能体几乎属于刚需。

导航的三步流程

导航系统通常可以拆成三个阶段:

  • 地图表示:把“可通行区域”表达成计算机能处理的数据结构。
  • 寻路:在该结构上搜索从起点到终点的路径。
  • 路径平滑:把离散、折线的路径转化为更自然的运动轨迹。

三个阶段对应了三个问题:先把世界“表达”出来,才能把“当前位置”和“目标位置”作为输入;再在表达结构上做路径搜索;最后把搜索得到的折线结果做平滑,让运动更像真实行走。

地图表示

先定义可通行区域

“场景能看见”不等于“AI 能理解”。导航首先要回答:哪些区域允许通过。

可通行区域往往由 物理碰撞(Collision)与 运动能力(Movement Capability)共同决定,例如最大可攀爬高度、可跨越间隙、最大坡度等;在复杂项目中,同一张地图对不同智能体(步兵/载具/骑乘/飞行)的可通行区域也可能不同。

可以把 可通行区域(Walkable Area)理解为智能体的“舞台”:它并不会随着关卡美术完成而自动正确生成,而是需要把碰撞、可爬高度、可跨越沟壑等规则明确下来;同时,不同属性的智能体往往对应不同的舞台边界(例如骑乘与步行、载具与士兵)。

常见格式

可通行区域确定后,下一步是选择表达格式。课程中给出的典型选择包括:路径点网络(Waypoint Network)、网格(Grid)、导航网格(NavMesh),以及用于三维体积通行的 稀疏体素八叉树(Sparse Voxel Octree, SVO)。

路径点网络(Waypoint Network)

核心思想是用“关键点 + 连接边”覆盖可通行区域:设计或自动生成一组路径点,并建立可通行的连接关系。

使用方式与地铁网络相似:先把起点/终点投影到最近的网络节点,再在网络上规划路径,最后从离终点最近的节点走向目标点。

工程上常由设计侧放置“桥梁、门口、走廊两端”等关键点,再补充中间点形成网络;起点/终点先“接入网络”,再沿网络抵达目标附近。

优点是实现简单、搜索效率高;缺点是覆盖精度依赖节点密度与维护成本,且智能体运动容易被“吸附”到网络骨架上,表现不够自由。

网格(Grid)

核心思想是对地图进行规则离散化(方格/三角格/六边形等),每个格子记录“可通行/不可通行”及额外代价。

网格的一个工程优势是“动态更新”相对直观:障碍变化只需修改局部格子状态,调试也更友好(可视化一眼看到可通行区域与路径)。

其主要代价在于分辨率:格子越细越准确,但存储与搜索成本更高;此外,网格难以优雅表达“上下层重叠”的可通行表面。

网格很像把场景“光栅化”成小格:好更新、好调试;但当地图尺度很大、格子很密时,数据量与访问代价都会显著上升,同时“桥上/桥下”这类层叠通行也难以表达。

导航网格(NavMesh)

NavMesh 用一组多边形面片覆盖可通行表面,并在保证可用性的前提下尽量降低面片密度,从而提升寻路效率;同时它能自然表达三维场景中的可通行表面(例如桥上/桥下的不同走面)。

一个关键细节是:面片通常要求为 凸多边形(Convex Polygon)。这样从一个面片到下一个面片时,可以形成稳定的 多边形走廊(Polygon Corridor),并保证路径不会“穿出”可通行区域。

这背后的直觉是:若使用凹多边形,某些“看似可行的直线”可能穿出可通行区域;凸多边形则能保证相邻面片之间存在稳定的“共享边”(Portal),后续的路径平滑算法也会利用这一结构。

综合来看,NavMesh 是现代 3D 游戏中最常见的导航表达之一,但其自动生成与动态更新的工程复杂度更高。

稀疏体素八叉树(Sparse Voxel Octree, SVO)

当智能体不再“贴地行走”(例如飞行器、太空战),二维表面表达就不再适用。SVO 用体素与八叉树表达三维可通行体积,为 3D 空间导航提供基础,但存储与搜索复杂度更高,通常用于特定类型游戏或子系统。

路径查找(图搜索)

无论采用 Grid、Waypoint Network 还是 NavMesh,都可以抽象为一张图:节点表示“位置/区域”,边表示“可达关系”,边权表示“移动代价”。

因此,不管使用点、格子还是多边形,最终都会落到一张 (Graph)上;寻路问题也就归约为“从起点到终点的路径搜索”。

最短路径问题的目标是:在满足可达性的前提下,尽可能降低总代价。

深度优先搜索(DFS)与 广度优先搜索(BFS)

DFS/BFS 能用于可达性探索,但在“带权最短路”与“大规模图搜索”上效率并不理想,因此更多作为概念基石。

迪杰斯特拉算法(Dijkstra)

Dijkstra 通过逐步扩张“当前已知最短距离”的边界,得到从起点到各节点的最短路;并借助 prev 记录前驱节点,用于回溯出最终路径。

实现上,除了记录“当前已知的最短距离”,还需要记录一个“前驱节点”(Previous Vertex),否则只能得到距离,无法回溯出路径本身。

A星算法(A*)

游戏中往往需要“足够好 + 足够快”的路径,而不是严格最优的全图遍历。A* 在 Dijkstra 的基础上引入 启发函数(Heuristic),用下式优先扩张更“接近目标”的节点,从而显著提升收敛速度:

\[
f(n)=g(n)+h(n)
\]

  • 已知代价:( g(n) ),从起点到节点 ( n ) 的已知实际代价
  • 估计代价:( h(n) ),从节点 ( n ) 到目标点的估计代价

A* 属于 启发式搜索(Heuristic Search):用 ( h(n) ) 对“还要走多远”做估计,再把“已经走过的成本”与“估计剩余成本”合并为排序依据;并且在到达目标点时就停止,更符合游戏对实时性的要求。

在网格上,常用 曼哈顿距离(Manhattan Distance)作为 ( h(n) );在允许任意方向移动的 NavMesh 上,常用两点间 欧几里得距离(Euclidean Distance)作为近似。

NavMesh 上还涉及“节点取样点”的选择:多边形中心/顶点/边中点都会影响成本评估精度与搜索规模,工程上常以 边中点 取得较好平衡。

在 NavMesh 上若简单连“面片中心点”,连线可能穿出走廊;工程上更常以相邻面片的共享边(Portal)取样,用“边中点序列”表达路径骨架。

从实现角度看,A* 的主体结构并不复杂:维护 开放列表(Open List)与 关闭列表(Closed List),每次取 ( f ) 最小节点扩张相邻节点即可。

启发函数的尺度会影响“速度/最优性”:估计偏低会更接近最短路但搜索更慢;估计偏高会更快但更可能偏离最短路,甚至在极端情况下提前失效。

路径平滑

寻路输出通常是离散折线,转弯频繁且存在大量不必要的拐点,需要进一步平滑。

仅按“格子/面片中心”移动会产生明显的“折线感”,表现上更像机器而非生物;平滑的目标是尽量删除无效拐点,让轨迹更接近直觉上的行走路线。

在 NavMesh 上,经典做法是 漏斗算法(Funnel Algorithm,又称 “String Pulling”):把多边形走廊的公共边视作一系列“门”(Portal),在不越界的前提下不断收紧漏斗,删除冗余拐点,得到更接近直线的可行路径。

当目标点进入漏斗可行域时,路径可以直接收敛为最终直线路径段。

生成与工程化能力

现代引擎通常使用自动化方式生成 NavMesh。以常见实现思路为例:先对场景做 体素化(Voxelization),把连续几何离散到体素网格中,作为后续计算基础。

工业实现常采用类似 Recast 的思路:先把世界“体素化”,把连续几何离散成可计算的体素世界,再在体素世界上逐步生成可通行区域与多边形网格。

随后基于智能体半径/最大坡度/台阶高度等约束,标记可通行体素,并计算到边界的距离场,用于后续区域分割与收缩(避免贴边导致穿模)。

区域分割常使用 分水岭算法(Watershed)一类思想,把“可通行体素”聚类成连通区域,为多边形网格生成提供良好基础。

最终得到区域俯视图,并将区域轮廓拟合为多边形,生成可用于寻路的 NavMesh。

标记 / 瓦片 / 离网链接

实际项目常在 NavMesh 上叠加更强的工程能力:

  • 多边形标记:为不同地表/区域设置标记与代价(道路/水面/泥地等),用于策略寻路与表现联动。

  • 瓦片化:把整张 NavMesh 切成瓦片,在动态场景中仅重建受影响瓦片,在“寻路性能”与“重建成本”之间取平衡。

  • 离网链接:补齐自动生成难以表达的“非连续移动”,例如跳跃、攀爬、传送等。

小结

  • 寻路系统(Navigation System)首先解决“能走”,其次解决“走得快”,最后解决“走得像”。
  • 关键链路是:可通行区域(Walkable Area)→ 表达格式(Waypoint/Grid/NavMesh)→ A星(A*)→ 漏斗算法(Funnel Algorithm)。

16.3 转向系统

寻路系统输出的是“在可通行区域内的一条路径”。但路径只是几何结果,智能体最终要执行的是“受物理约束的运动”。

典型差异来自运动学/动力学约束:最大线性加速度(油门/刹车)、最大角加速度(转向力)、最小转弯半径等。约束越强(载具尤其明显),就越不可能严格贴着折线/走廊中心线行进。

因此,寻路之后通常还需要 转向系统(Steering):在不偏离整体目标的前提下,把“路径点序列”转译为每一帧的速度与加速度控制,生成一条更可执行的 合理轨迹(Reasonable Path)。

转向系统的一个工程价值在于鲁棒性:当执行轨迹因惯性产生偏移时,系统需要持续修正,避免智能体被挤出 可通行区域(Walkable Area)后出现局部停滞或反复修正。

转向行为三类原子能力

常见的转向算法可以按“输出什么控制量”分为三类原子能力:

  • 追逐/逃离(Seek/Flee):输出线性加速度,使智能体朝向目标加速或远离目标加速。
  • 速度匹配(Velocity Match):输出线性加速度,使智能体速度逐步接近目标速度。
  • 对齐(Align):输出角加速度,使智能体朝向逐步接近目标朝向。

在工程中,这些原子能力会被组合成更具体的行为:例如 追逐(Pursue)/ 躲避(Evade)、漫游(Wander)、路径跟随(Path Following)、流场跟随(Flow Field Following)、到达(Arrive)、面向(Face)、朝向速度方向(Look Where You’re Going)等。

追逐/逃离

追逐/逃离(Seek/Flee)是最直观的一类:根据“自身位置”与“目标位置”构造一个期望加速度方向,并将加速度幅值限制在智能体能力范围内。

  • 输入:自身位置、目标位置
  • 输出:线性加速度

Seek 的方向指向目标,Flee 的方向背离目标。它们不是最终“走哪条路”,而是回答“下一帧朝哪个方向更合理地加速”。

把“目标位置”从一个静态点扩展为动态目标/轨迹/场,就能得到一组非常常用的变体:

  • 追逐(Pursue)/ 躲避(Evade):使用目标的当前速度预测一个“未来位置”,再对该未来位置执行 Seek/Flee。
  • 漫游(Wander):持续生成一个随机游走的目标点,用 Seek 将运动变成连续的小幅转向。
  • 路径跟随(Path Following):目标点沿寻路输出的折线/曲线向前推进,智能体不断 Seek 到“路径上的前瞻点”。
  • 流场跟随(Flow Field Following):目标来自场上的方向向量(Vector Field),适合大规模群体在同一方向场中运动。

这些变体的共同点是:允许在运行时更新目标,使转向行为可以持续修正轨迹,而不仅仅执行一次性指令。

速度匹配

仅有 Seek 容易出现“冲过头再回拉”的现象。速度匹配(Velocity Match)的核心是:根据速度差与匹配时间,计算一段期望加速度,使速度在一段时间内平滑地靠近目标速度,并限制在最大加速度范围内。

  • 输入:目标速度、自身速度、匹配时间
  • 输出:线性加速度

当目标速度为零时,该过程就对应“平滑刹停”;当目标在运动时,该过程用于让智能体追上后与目标保持近似同速。

对齐

位置与速度合理后,还需要让朝向合理。对齐(Align)在角度层面进行控制:根据“目标朝向”与“自身朝向”的角度差,计算期望角速度/角加速度;当角度差进入减速区间(Slow-down angle)后开始减速,避免瞬间转头带来的机械感。

  • 输入:目标朝向、自身朝向
  • 输出:角加速度

它常被用于面向目标(Face)或面向运动方向(Look Where You’re Going),在射击、载具驾驶、编队等场景中尤为关键。

小结

  • 转向系统(Steering)把“路径”转成“可执行运动”,显式处理加速度、角速度、转弯半径等约束。
  • 常见原子能力是:追逐/逃离(Seek/Flee)、速度匹配(Velocity Match)、对齐(Align);工程上通过组合得到追逐/躲避、漫游、路径跟随、流场跟随、到达、面向等更丰富行为。

16.4 群体模拟

群体模拟面向的不是“一个智能体如何移动”,而是“很多智能体同时移动时如何看起来合理”。典型场景包括大规模 NPC 行走、动物群(鸽群/鱼群/鸟群)受惊、编队运动等。难点主要集中在两类问题:

  • 群体行为:整体看起来像一个群体在运动,而不是无关联的个体随机游走。
  • 碰撞规避:个体之间、个体与环境之间尽量不发生穿模/重叠,同时保持计算可承受。

三类建模思路:微观 / 宏观 / 介观

群体模拟的经典起点来自雷诺兹提出的 Boids 系统。工程上常把群体建模分为三类:

  • 微观模型(Microscopic Model):逐个控制个体,“自下而上”涌现群体行为。
  • 宏观模型(Macroscopic Model):先定义整体趋势(势场/流场/车道规则),个体跟随趋势运动。
  • 介观模型(Mesoscopic Model):把群体划分为若干子群体,整体受宏观目标约束,个体在子群体内用微观规则运动。

微观模型

微观模型通常只给每个个体一组局部规则,就能在整体上形成高度逼真的群体形态。Boids 最经典的三条规则分别对应:

  • 分离:与邻近个体保持距离,避免挤在一起。
  • 内聚:向邻域“质心”靠拢,避免离群。
  • 对齐:与邻近个体保持方向一致,形成同向流动。

这些规则背后是直观的“局部相互作用”,对外观影响却是全局性的。

微观模型的优点是实现相对直接、效果具有生命力;代价是可控性较弱,难以保证群体严格遵循关卡的“交通规则”,也不易直接表达“人行道/车道/路口”这类强约束结构。

宏观模型

宏观模型从整体角度刻画群体运动:先在场景里定义可行的运动结构(例如车道、行人道、区域连通图、流场/势场),再让个体沿结构运动,从而获得更强的可控性与可复现性。

这种方法对“城市人群”尤其常见:行为不再像鱼群那样自由,而更像在既定规则下流动的交通系统。

介观模型

介观模型在“宏观可控”与“微观自然”之间取平衡:把群体划分为若干小组,小组层面有统一目标或路径,组内个体再基于微观规则与局部避让进行移动。

这类思路在 RTS 中非常典型:一条指令驱动一群单位向目标区域推进,同时每个单位仍需要处理局部绕行与队形调整。

碰撞规避

无论采用哪种建模思路,只要个体数量变大,碰撞规避都很快成为瓶颈:既要避免个体互相穿透,又要避免避让造成的过度抖动与拥堵。

常见方法可以粗分为两派:基于力(Force-based)与 基于速度障碍(Velocity Obstacle, VO)。

基于力

基于力的方法把个体运动视为“期望速度/目标吸引力”与“环境约束/邻居斥力”的叠加结果。直观上:

  • 邻近个体过近时产生斥力,推动彼此分离;
  • 靠近墙体、障碍时产生斥力,形成绕行;
  • 结合目标方向的驱动力(或期望速度),形成整体流动。

这种方法不仅用于游戏,也常用于逃生疏散等模拟:个体运动由“期望速度”与“环境交互”共同决定。

基于力方法的工程特点:

  • 优点:实现与调试相对直观,扩展到更复杂的行为规则较容易。
  • 缺点:依赖时间步长与参数,步长过大时容易产生不稳定或穿透;想要获得更“干净”的避让轨迹通常需要更细的积分与更多调参。

基于速度障碍

速度障碍的核心想法是把“未来会碰撞”的情况转换到速度空间:当存在某些速度会在短时间内导致碰撞时,这些速度就构成了需要避开的“障碍”。因此,避碰可以表述为“从可行速度集合中选择一个新的速度”。

在此基础上常见扩展包括:

  • 速度障碍物(VO):把对方视为不响应,单边调整自身速度。
  • 互惠速度障碍法(RVO):假设对方也会采用类似决策流程,双方各让一半。
  • 最优互惠碰撞规避(ORCA):在多智能体场景中,通过优化选择更一致、更稳定的速度。

VO 对静态障碍与“无响应对象”较直接,但在双向避让中容易出现两侧同时选择相同策略导致的振荡(例如双方同时向同一侧闪避)。

RVO/ORCA 通过把“互相让”的假设显式纳入决策,能在更多个体同时参与时降低振荡概率;其中 ORCA 进一步把可行速度约束组织成可优化的形式,从而得到更一致的避让解,但实现复杂度与计算成本也更高。

小结

  • 群体模拟(Crowd Simulation)解决“多智能体同时运动”的整体合理性与碰撞规避。
  • 常见建模分为 微观模型(Microscopic)、宏观模型(Macroscopic)、介观模型(Mesoscopic)。
  • 碰撞规避常见两派:基于力(Force-based)与 速度障碍(VO/RVO/ORCA)。工程实践中通常按“效果稳定性/实现复杂度/性能预算”进行取舍。

16.5 感知

感知(Perception)是 AI 决策的输入端:没有可靠的感知,后续的行为选择就缺少依据。工程上更重要的一点是:感知通常只提供“局部、带噪声、随时间变化”的信息,而不是全局可见的完美信息。

在课程的组织方式中,感知信息可以先按来源分两类:

  • 内部信息(Internal Information):智能体自身状态,通常可直接访问。
  • 外部信息(External Information):来自场景与其他对象,需要通过规则与传感方式获取。

外部信息还可以进一步拆成:静态空间信息(Static Spatial Information)、动态空间信息(Dynamic Spatial Information)以及与对象相关的 角色信息(Character Information)。

内部信息

内部信息描述“自己是谁、处于什么状态”。常见字段包括位置、生命值、护甲状态、增益状态等。由于这些信息来源于自身组件/属性系统,读取成本低、时效性强,通常作为所有决策树/行为树的基础条件。

静态空间信息

静态空间信息用于回答“地图结构是什么”。它往往在关卡构建阶段生成或标注,常见内容包括:

  • 导航数据:可通行区域、路径结构等(承接前面的寻路系统)。
  • 战术地图:关卡中具有战术价值的区域抽象(例如桥头、制高点、瓶颈)。
  • 智能对象(Smart Object):梯子、可交互机关、可破坏墙体等可供 AI 使用的交互点。
  • 掩护点:用于射击对抗与战术移动的可用掩体位置。

这些信息的共同特点是:不随战斗过程频繁变化,因此适合用离线构建 + 运行时查询的方式提供给 AI。

动态空间信息

动态空间信息反映“现在发生了什么”。典型做法是把局势投影到可查询的数据结构中,例如 影响力图(Influence Map):

  • 随着敌方/友方聚集、火力覆盖、危险源出现,地图上的影响值发生变化;
  • 决策时结合内部状态(例如残血/弹药不足)查询影响力图,偏向规避高风险区域或选择更合适的路线与位置。

除影响力图外,动态信息还包括:

  • 导航数据上的标记:临时封锁、动态障碍、危险区域标注等。
  • 视野区域:可见范围随姿态、遮挡、时间衰减等因素变化。

战斗与交互的很多决策都围绕“对象”展开:敌我识别、可见性、威胁评估、追踪与丢失等。一个常见的工程抽象是为“被感知到的对象”维护一份记录,典型字段包括:

  • 对象标识:游戏对象 ID。
  • 可见性:当前是否可见/可感知。
  • 上次感知方式:来自视觉/听觉等哪一种通道。
  • 上次感知位置:用于追踪与搜索(例如朝最后可见点移动)。

需要注意的是:同一对象可能被多个智能体感知,因此记录既可以按智能体维度维护,也可以引入共享/合并机制减少重复计算。

感知模拟

在更强调沉浸感的项目中,感知往往不仅是“读取变量”,还包含传播与衰减的建模:

  • 光、声音、气味在空间中传播,具有最大范围,并随距离与时间衰减;
  • 视觉会被障碍物遮挡;嗅觉/听觉可能更依赖空间结构与介质;
  • “辐射场/场”可以用来模拟感信号,并在必要时简化为影响力图,使得 AI 通过查询场数据完成决策。

最后还需要面对一个现实约束:感知极易成为性能瓶颈。工程上通常会通过降低更新频率、限制感知半径、按优先级分层更新、以及在邻近智能体之间共享部分感知结果等方式,控制总体成本。

小结

  • 感知(Perception)为 AI 提供决策输入,强调局部、动态与可控成本。
  • 信息可按来源分为 内部信息(Internal)与 外部信息(External);外部信息进一步包含 静态空间信息(Static Spatial)、动态空间信息(Dynamic Spatial)与对象相关信息。
  • 常用工程抓手包括:影响力图(Influence Map)、对象感知记录、以及带传播/衰减的感知场建模。

16.6 经典决策算法

决策系统负责把“感知到的信息”转成“下一步该做什么”。但决策本身并不能脱离基础系统单独存在:没有寻路、转向、群体、感知这些前置能力,决策即使给出了结论,也无法稳定落地为可执行的动作序列。

因此,这一节聚焦“经典、可工程化落地”的前向决策:有限状态机(Finite State Machine, FSM)与 行为树(Behavior Tree, BT)。同时也会点到更偏目标驱动的方向:分层任务网络(Hierarchical Task Network, HTN)、目标导向行动规划(Goal-Oriented Action Planning, GOAP)、蒙特卡洛树搜索(Monte Carlo Tree Search, MCTS)以及基于 深度学习(Deep Learning)的决策方法,它们更强调“先有目标,再反推动作”,通常会在更进阶的 AI 系统中展开。

有限状态机

有限状态机(FSM)把智能体视为在若干“状态”之间切换:当满足某些条件时,从一个状态跳转到另一个状态。状态之间的切换称为 转移(Transition)。

FSM 的优势是结构简单、实现直接;当状态数量不大时,行为也更容易推导与验证。

以吃豆人为例,状态可以抽象为“吃豆/逃避/追击”,转移条件来自“幽灵是否接近”“是否处于强化状态”等;这种建模非常适合规则清晰、状态较少的游戏逻辑。

FSM 的主要问题出现在规模变大时:状态增多会导致转移关系膨胀,维护成本与复用性显著下降,扩展到复杂情形时往往需要频繁重构。

分层有限状态机

分层有限状态机(Hierarchical FSM, HFSM)通过层级与子状态机把复杂状态拆分成若干模块。直观效果是提升可读性与组织性(模块化更强),代价是跨层快速跳转会受到结构约束,需要在 反应性(Reactivity)与 模块化(Modularity)之间做权衡。

行为树

与“在状态之间跳转”不同,行为树(BT)把决策过程表达为一棵树:从根节点出发,按规则遍历分支,选择要执行的动作。树形结构更贴近“语言化的分支思考”——先看情况,再按条件分叉,最后落到动作;这也是它在复杂 AI 行为组织上更直观的原因。

执行节点

行为树的叶子节点通常是 执行节点(Execution Node),可分为:

  • 条件节点:读取自身状态或感知结果,返回真假。
  • 动作节点:执行具体动作,并返回状态:成功、失败或运行中。

其中“运行中”用于表示动作需要跨多帧完成(例如移动、追击、开门等)。

动作节点之所以常见“运行中”,是因为它往往会调用前面已经建立的基础能力:追击需要寻路与转向支撑,是否接近/是否可见需要感知支撑;决策节点负责“选哪条路”,而基础系统负责“把路走完”。

控制节点

控制节点负责把子节点的返回值组织成控制流,经典类型包括:序列(Sequence)、选择器(Selector)、并行(Parallel)与 装饰器(Decorator)。

顺序节点

顺序节点会依次执行子节点:

  • 若遇到 失败:序列立即返回失败。
  • 若遇到 运行中:序列返回运行中,下次继续从该运行中的子节点推进。
  • 若全部 成功:序列返回成功。

图中以“开门进入”为例,序列可以表达一个小型计划:检查门是否上锁 → 解锁 → 开门 → 通过。序列的价值在于把“步骤”变成结构化的可复用模块。

选择节点

选择节点按顺序尝试子节点(可理解为优先级列表):

  • 若某个子节点返回 成功运行中:选择器立即返回相同状态(停止继续尝试后续子节点)。
  • 只有当所有子节点都 失败 时,选择器才返回失败。

图中展示了“巡逻/追击/攻击”的典型优先级:攻击范围内优先攻击,其次视野内追击,否则巡逻。标注的 Running 表示某个动作正在进行,选择器会保持该分支持续推进,直到状态改变。

并行节点

并行节点用于同时处理多项任务。常见实现会定义一个阈值规则(例如“至少 (M) 个子节点成功则成功”“失败超过某阈值则失败”),否则返回运行中,继续推进仍在运行的子节点。

示例体现了并行的直觉:移动到目标与射击可以同时推进,避免把复杂行为拆成互相打断的单线程状态。

基础节点小结

上图给出了常见节点类型在“成功/失败/运行中”三种返回值下的语义摘要;这也是行为树标准化与可工具化(编辑器可视化)的基础。

执行机制

行为树通常以 逻辑帧(Tick)驱动:每次 tick 从根节点开始,自上而下遍历,根据控制节点规则选择分支,并将子节点返回值逐层回传给父节点。

“从根节点开始”的意义在于可打断性:当环境条件发生变化(例如出现威胁、收到新指令),树可以在下一次 tick 迅速转向新的高优先级分支,而不是等待某个长动作自然结束。

装饰节点

装饰节点是一类只包裹单个子节点的特殊控制节点,用于施加常见策略,例如循环执行、执行次数限制、计时器、时间限制、值修改等。

图中展示了使用计时器实现“巡逻停顿”的做法:在移动节点之前插入等待装饰器,避免显式增加大量等待动作节点,从而降低树的结构噪声。

前置条件

把“能否执行”的判断以 前置条件(Preconditions)的形式贴近控制节点或动作节点,可以显著减少重复的条件分支,让树结构更紧凑、更易读。

黑板

黑板(Blackboard)用于在节点之间共享信息,可视为键值存储:动作节点把结果写入黑板(Write),后续节点再读取(Read)并据此做判断或选择分支,从而把“跨节点的数据传递”从结构连线中解耦出来。

行为树的优势

行为树天然支持层次化结构:子树可以作为模块复用;返回状态定义了清晰的接口,便于组合与替换。树形结构也更“可阅读”,使得维护往往只影响局部子树。

行为树也具备较强的 反应性(Reactivity):每个 tick 都会根据环境变化调整分支。同时,由于每次 tick 都是一个完整决策过程,配合可视化工具更易调试与回放定位。

行为树的缺点

行为树的典型开销来自“从根节点开始的重复 tick”:树越大、响应性越强(每帧检查的条件越多),总体计算成本越高。因此工程实现中常结合节点裁剪、条件缓存、事件驱动的局部更新等策略进行优化;但一旦引入事件驱动,也需要保证关键事件覆盖充分,否则会出现分支切换滞后。

走向规划

FSM 与行为树更偏向“根据当前情况向前推进”的决策:它们擅长把规则落地成稳定的反应式行为,但“意义与目标”往往需要额外系统来提供。

为了让 AI 具备更强的目标导向能力,常引入 规划(Planning)思想:把动作抽象为带 前置条件(Preconditions)与 效果(Effect)的原子操作,由规划器基于当前世界状态搜索出一条动作序列,使系统朝目标(Goals)推进。这类方法把“要做什么”从规则触发转为目标驱动,通常更适合复杂的任务链与长期策略。

小结

  • 经典决策系统主要包括 有限状态机(FSM)与 行为树(BT);HFSM 用层级结构缓解 FSM 的复杂度问题。
  • 行为树通过“执行节点 + 控制节点 + 三态返回值”形成可组合的决策结构,并通过装饰器、前置条件、黑板等机制提升可维护性与表达力。
  • 当需要更强的目标导向能力时,决策会进一步走向 规划(Planning)类方法。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏