返回 导航

UE5

hangge.com

UE5 - AI行为树内置的任务节点详解(附:各节点的使用场景)

作者:hangge | 2026-01-28 08:55
    在 Unreal Engine 5UE5)中,AI 行为树(Behavior Tree)是实现复杂行为逻辑的重要工具。行为树由一系列节点(TasksDecoratorsServices)构成,其中任务节点(Task Nodes) 用于执行具体动作或逻辑判断。UE5 官方已经内置了很多好用的任务节点,可快速构建复杂 AI 逻辑。本文将详细介绍这些任务节点及其应用场景。

一、Finish with Result

1,功能介绍

    这个任务什么事也不做,而且会带着指定的结果瞬间完成。但是我们可以给它设置完成后的结果是成功、失败、被打断还是运行过程中。

2,使用场景

(1)这个任务乍看起来用处不大,但是在后期编辑大型行为树的时候使用它可以为我们的工作带来很多便利。比如说作为 Sequence 的其中一个子节点,设置节点返回 Succeeded(执行成功)结果,节点会被马上完成,并且跳回让 Sequence 选择下一个子节点。我们可以利用这个特性在这个节点上悬挂一些服务节点,用来在运行其他节点前先做一些数据的准备。
  • 例如,我们将一个 FinishWithResult 任务作为 Sequence 的第一个子节点,然后在它身上挂一个 BTS_TestFindLocation 服务,在行为树被运行的时候,首先 FinishWithResult 会先被搜索和执行,此时悬挂在它身的服务会被启动,产生数据。由于我们设置了 FinishWithResult 返回了 Succeeded,所以 Sequence 会继续往右执行下一个子节点 Wait。 

(2)同样的,由于 Selector 在遇到子节点运行失败后会运行下一个子节点,所以我们可以使用一个 FinishWithResult,设置返回一个 Failed 结果,并在它身上悬挂服务节点,以此来先获得信息。
  • 例如,我们将一个 FinishWithResult 节点作为 Selector 的第一个子节点,并且设置运行返回 Failed 结果,然后再挂一个 Wait 节点作为 Selector 的子节点。行为树被运行的时候,由于 FinishWithResult 返回了失败的运行结果,所以接下来的 Wait 会被 Selector 搜索和执行到。

二、Make Noise

1,功能介绍

(1)MakeNoise 节点的作用是“制造噪声”。在 UE5 中,除了行为树以外还有一个 AI 相关的系统--感知系统。感知系统由另一个组件 AlPerceptionComponent 负责,我们可以将组件添加到 AlController 上,它赋予角色多种感知,比如视觉、 听觉、触觉等。 
(2)通过 MakeNoise 节点,能够在角色所在的位置发出一个噪声。节点暴露了 Loudness 参数,通过设置这个参数,我们可以设置制造出噪声的响度。 

2,使用场景

    通过 MakeNoise 节点,能够在角色所在的位置发出一个噪声。如果其他角色拥有感知系统并且响应了对声音的感知,那么它就可以“听到”这个噪声。 利用这个功能,我们可以实现像在《刺客信条》系列游戏里,躲在某个角落里吹口哨吸引敌人注意的功能。

三、Move Directly Toward 和 Move To

1,功能介绍

(1)MoveDirectlyTowardsMoveTo 这两个节点都是让角色搜到某个位置的任务,但是这两个任务还是有些不同。 
  • MoveDirectlyTowards 会让角色沿着最短的线段径直走到目标点。这个任务不会让角色寻路,即使角色和目标点之间有障碍物,角色也不会避开。比较适合游戏场景比较简单或者角色和目标点之间距离比较近的使用场景。 
  • MoveTo 任务则是会使用到 AI 进行寻路,它会利用场景中的导航信息,让角色能够避开场景中的障碍物,并沿着最佳的路线行走到目标点。 
(2)两个任务节点的参数差不多。其中,比较重要的参数有两个:
  • AcceptableRadius(可接受半径):表示距离目标多远以内就可以停止移动,单位是厘米。默认设置的值是 5,表示在角色移动至目标范围 5 厘米以内,就会成功退出任务。 
  • BlackboardKey(黑板键):表示要移动到的目标, 对应一个黑板条目。可以设置一个 Vector 类型的黑板条目,代表要到达的位置,也可以设置一个 Actor 类型(Object 类型,但是保存 Actor 实例)的条目,节点会自动获取 Actor 的位置。 

2,使用场景

(1)Move Directly Toward
  • 近距离追击:当敌人 AI 与玩家的距离很近(比如 200cm 以内),且场景中障碍物很少或并不重要时,可以用 Move Directly Toward 让敌人径直向玩家发起冲撞。这样能减少寻路开销,也能让追击显得更“硬核”。
  • 简单几何场景:在空旷的竞技场、飞行场景或上下层之间无障碍的桥面上,角色只需沿直线前进即可。比如竞技飞行器绕场地追击对手,或导弹直线锁定目标;此时使用 Move Directly Toward 即可获得最直观的效果。
  • 临时突袭:某些快速瞬移或冲刺动作后,需要角色瞬间冲向指定点(如冲撞门把手、跳跃落点)。因为距离很短且精度要求高,用 Move Directly Toward 可以精准控制轨迹。
(2)Move To
  • 复杂地形寻路:在含有墙体、家具、楼梯等静态障碍物的室内或城市场景中,让 NPC(像守卫、平民)从 A 点走到 B 点,避免撞墙,就要用 Move To 节点并配合 Nav Mesh,角色会绕开障碍、利用楼梯或斜坡。
  • 长距离导航:玩家离开视野很远时(几百甚至上千厘米),敌人要从出生点沿路径赶来支援,用 Move To 能自动选最优路线,无需自己维护路径点。
  • 基于黑板的动态目标:当目标是另一个 Actor(比如玩家或队友),黑板条目保存了目标 Actor 的引用。Move To 会实时读取该 Actor 的当前世界坐标并寻路跟随,非常适合队友跟随、护送、护卫等场景。
  • 智能巡逻:搭配 SelectorService,可以让守卫在多个巡逻点之间往返。将黑板 Vector 列表按顺序或随机写入,每到达一个点(Acceptable Radius 触发成功)后,再切换到下一个巡逻点。
(3)需要注意的是,要使用 MoveTo 任务,必须要保证场景中有导航信息。导航信息由场景中的 NavMeshBoundsVolume(导航蒙皮体积)来提供。下面绿色部分表示的就是已经建立了导航网格的路线,而方块四周的边缘是没有被绿色覆盖的说明这些地方对于 MoveTo 任务来说无法通行。 

四、Play Animation 

1,功能介绍

(1)使用 PlayAnimation 节点,可以让角色播放一个动画。
(2)单击选中该节点,在细节面板中可以看到它的参数:
  • 要播放的动画(AnimationToPlay):是要播放的动画,单击下拉框,可以看到当前引擎中的所有可播放动画。 
  • 正在循环(Looping)是否循环播放。
  • 非阻挡(Non Blocking)是否为非阻塞。如果设置为 True,播放动画不会阻塞任务,一旦开始播放动画,任务会马上结束,如果设置为 False,任务会一直阻塞直到动画播放结束。 

2,使用场景

(1)虽然使用这个节点能够很方便地让角色播放一个动画,但个人其实并不推荐使用。因为动画的处理我们一般会使用动画蓝图来实现,在动画蓝图中,我们会根据很多参数来决定要播放的动画。如果我们在 AI 行为树这里强行让角色播放一个动画,有可能最后就会把动画的播放逻辑变得很混乱。所以我们最好把所有动画相关的逻辑全部留给动画蓝图来做。 
(2)当然,如果你只是想测试,使用这个节点也未尝不可。 

五、Rotate to Face BBEntry

1,功能介绍

(1)使用 RotateToFaceBBEntry 节点可以让角色开始旋转,旋转到角色面向目标的方向。面向的目标是由一个黑板条目提供的(所以节点叫作 FaceBBEntry)
(2)单击节点,可以在细节面板中看到节点的参数:
  • Precision(精度)这是一个角度的度数。这里的数值 10 表示只要角色的面向和目标的面向之间的角度差小于 10,那么任务就可以退出。 
  • BlackboardKey(黑板 Key)表示要面向的目标。黑板条目支持指向两种值类型:
    • 第一种是 Vector 类型,表示要面向的目标的位置,比如我们可以直接让角色面向场上的某个位置;
    • 第二种是 Actor 类型(黑板中没有 Actor 类型,所以是 Object 类型但是指向一个 Actor 实例),节点会在场景中找到这个 Actor,并且获取它的位置, 然后让角色面向它,所以我们可以直接将场景中另外的角色直接设置到黑板中供节点使用,角色会直接转到面向另一个角色。 

2,使用场景

(1)对话面对面/交互前置
  • NPC 与玩家或其他角色开始对话、交易或者交互动画(如握手、击掌)之前,常常希望对方先转向彼此,以免对话时出现尴尬的“背对背”场景。可以在行为树的 SelectorSequence 中,在真正开始对话逻辑前插入一个 RotateToFaceBBEntry 节点,将黑板中保存的目标 Actor(玩家或交互对象)传入,确保角色快速、平滑地面向玩家后,再触发对白或 UI 界面。
(2)枪械/技能瞄准前的校正
  • 对于使用远程武器(如弓箭、火箭发射器)或需要精确朝向施法的技能(如法术投射)的 AI 来说,开火前角色必须先对准目标方向。将 RotateToFaceBBEntry 加入射击流程,先让 AI 转向目标(黑板 Key 存储目标 Actor),并设置一个较小的 Precision(如 ),保证开火前的角度误差很小,提高命中率。
(3)动态警戒与声音源响应
  • AI 通过 MakeNoisePerception 等机制侦测到声源时,需要立即转头“察看”声音来源方向。可以在听到噪声后,将噪声发出位置写入黑板 Vector 条目,然后用 RotateToFaceBBEntry 让角色旋转面向该位置,配合播放“回头”动画或播放注视状态,为玩家带来更真实的潜行/警戒体验。
(4)编队行进与领队跟随
  • 在多人编队巡逻或护送任务中,跟随者需要始终保持面向领队的朝向,以免走位时出现“僵硬”或不自然的断层。通过定期(Service 节点)更新黑板中保存的领队 Actor,然后在行为树的并行节点中使用 RotateToFaceBBEntry,持续调整跟随者的朝向,使编队看起来更紧凑、协调。
(5)环境互动前的瞭望
  • 某些场景中,角色需要转向并观察特定环境对象(如监视摄像头、望远镜、放大镜)以触发后续的侦察、扫描任务。可在行为树中先将目标位置或 Actor 写入黑板,然后用 RotateToFaceBBEntry 让角色“面朝”该物体,并在旋转完成后触发环境交互 Task(如播放检查动画或开启 UI 界面),增强场景代入感。

六、Run Behavior

1,功能介绍

(1)为了避免行为树节点爆炸(指的是节点太多的意思),我们可以将为树拆分成多个子行为树,然后将子行为树作为一个任务节点让父行为树运行。在 UE5 中行为树就提供了 RunBehavior 任务来运行一个子行为树。
(2)选中节点,在细节面板中可以看到它的自定义参数就只有一个。 Behavior Asset 参数代表着节点要运行的子行为树,单击下拉框,可以看到引擎中所有的行为树资源。

2,使用场景

(1)模块化巡逻与战斗逻辑
  • 在大型关卡中,巡逻(Patrol)、警戒(Alert)和战斗(Combat)通常会有不同的行为树逻辑。可以将“巡逻”部分拆分成一棵子行为树,将“战斗”部分拆分成另一棵子行为树,然后在父行为树中的 SelectorSequence 节点里,通过 RunBehavior 分别调用这两棵子树。这样,既保持了父树的简洁,也方便后续对巡逻或战斗逻辑的独立维护与迭代。
(2)BOSS 多阶段 AI
  • 对于需要分阶段切换技能或策略的 BOSS,可以为每个阶段(Phase)建立一棵子行为树,比如“Phase1_普通攻击”、“Phase2_范围技能”、“Phase3_终极大招”等。父行为树在检测到 BOSS 生命值或战斗时间达到某个阈值后,通过 RunBehavior 切换到对应的子行为树,实现阶段性策略切换,逻辑清晰且易于调试。
(3)技能专有逻辑封装
  • 某些复杂技能(如隐身、召唤、冲锋)不仅需要动画、特效、位移,还伴随特殊决策流程。将这些流程独立成一棵技能子行为树,然后在主行为树中,当黑板或 Decorator 判断满足释放条件时,使用 RunBehavior 调用“Skill_Invisibility”或“Skill_Charge”子树。技能完成后子树自动退出,返回父树,保证主流程不被冗长的技能逻辑干扰。
(4)动态选择 AI 角色“身份”
  • 在同一个角色可能临时切换“护卫”“偷袭”“逃跑”等身份时,可预先准备对应子行为树集合,并在运行时根据黑板中“CurrentRole”键的值,动态通过 RunBehavior 调用相应的子树。例如,护卫职能时执行“Guard_Tree”,遭遇伏击时切换“Ambush_Tree”,战败时切换“Flee_Tree”,实现身份驱动的行为切换。
(5)多人协作与队形管理
  • 当一组护卫队以队形行进时,可以为“领队”(Leader)和“跟随者”(Follower)分别设计子行为树。主行为树先调用 Leader 子树处理路径选择、节奏控制,再并行运行多个 Follower 子树,让跟随者根据黑板中更新的 Leader 位置动态跟随。利用 RunBehavior 将每个角色的行为树分离,以便灵活调整单个角色的逻辑,而不影响整体协作效果。
(6)临时 AI 陷阱或任务
  • 在触发某些环境交互(如踩到陷阱、触发机关)后,希望 AI 角色离开正常巡逻流程,进入“躲避陷阱”或“协助逃生”模式。可以将这些异常逻辑写成独立子树,行为树中通过 ServiceDecorator 监测到触发条件时,执行 RunBehavior 切入“EscapeTrap_Tree”,完成后自动恢复主逻辑,且无需修改原有父树结构。

七、Run EQS Query

1,EQS 介绍

(1)在学习“Run EQS Query”任务节点之前,我们需要知道 EQS 是什么?EQS 的全称是 Environmental Query System,也就是环境查询系统。它的作用在于找出一个集合里面最优的选择。
  • 例如,战场地图上有很多的掩体,它们组成了掩体的集合。我们的角色要找到其中一个掩体,要求这个掩体附近的补给最充足,并且最易守难攻。这时我们就可以使用 EOS 对这些掩体分别进行评分,最终找出一个最优掩体。EQS 做的大概就是这样的事。 
(2)要创建一个 EQS 查询器,我们可以在“内容浏览器”面板的空白处右击,选择“人工智能”→“场景查询”。

(3)创建资源之后双击打开。可以看到 EQS 其实也是一个树形态的结构。 从 ROOT 节点的连接槽往下拖动,就可以拉出节点搜索框。我们可以使用这些节点来构建一棵 EQS 查询树。 

2,功能介绍

(1)RunEQSQuery 任务的作用是发起一个 EQS 查询。
(2)单击节点,可以在细节面板中看到节点的参数:
  • “查询模板”(QueryTemplate)参数是指向一棵 EQS 查询树,单击下拉框,就可以看到我们创建的 EQS 资源。 
  • “查询配置”(QueryConfig)节点允许我们从行为树提供一些参数给 EQS 进行计算。 
  • “运行模式”(RunMode)规定了 EQS 的运行模式。包含几个选项:
    • “单一最佳项目”是选择 EQS 评分最高的项目;
    • “来自最佳 5% 的单一随机项”是从得分最高的 5% 中随机选出一个项目;
    • “来自最佳 25% 的单一随机项”是从得分最高的 25% 中随机选出一个项目;
    • “所有匹配”是返回所有符合条件的项目。 
  • “黑板键”(BlackboardKey)则是当 EQS 查询后会将最后的结果写入到这个参数指定的黑板条目中。

3,使用场景

(1)动态掩体选择
  • 在射击或潜行类游戏中,AI 需要根据战斗形势或玩家位置实时选择掩体。通过 Run EQS Query 节点调用一个“FindCover”查询模板,评分依据可以包括掩体与玩家的距离、视线阻挡程度和与队友的相对位置。将查询结果写入黑板后,AI 再用 Move To 节点移动到该掩体,实现智能“打–掩”切换。
(2)随机巡逻点生成
  • 当需要让守卫在可行区域内随机巡逻时,可以创建一个“RandomPatrolEQS 查询,查询所有导航网格上的合理点并按可达性评分。把 RunMode 设为“来自最佳 25% 的单一随机项”,再将结果写入黑板。这样,每次巡逻点的选择既有随机性,又能保证不生成不可到达或危险的位置。
(3)团队分布与包围
  • 在多人协同的战斗场景中,需要让多名 AI 同时围攻一个玩家或目标。可以先用一个“SurroundPoints”查询模板,在目标周围均匀生成若干点,根据与其他队友已分配点的距离给出评分,确保队友间互不重叠。Run EQS Query 后把所有点(RunMode 设为“所有匹配”)写入黑板数组,然后在并行节点中让每个 AI 从数组中按索引取点并移动,实现自动包围。
(4)物品拾取与补给点
  • 在需要 AI 采集地图资源、拾取补给或寻找恢复点的场景中,可以用“ResourceGather”或“HealPoints”查询模板,先列出所有物品或补给站,按照剩余数量、距离、安全系数等条件评分,再通过 RunMode 设为“单一最佳项目”获取最优目标。写入黑板后,AI 便能快速前往最近且最有价值的补给点。
(5)动态障碍物避让
  • 对于易变的环境(如有可移动障碍物或爆炸区域),可以先用 EQS 查询搜集当前可行区域中的多个备选点,并结合环境权重(如与爆炸源距离、障碍物运动方向)为每个点打分。然后用 Run EQS Query 的“来自最佳 5% 的单一随机项”模式,既保证 AI 在高分区域内随机移动,又能躲避动态危险,实现更真实的机动性。
(6)多目标优先级决策
  • 在同时面临多个任务(如攻击、防御、支援)时,可以先分别用不同配置的 EQS 查询(“AttackTargets”、“DefendPoints”、“SupportPositions”)获取各自的候选点列表,然后根据当前 AI 状态或黑板上的“ActionPriority”值,动态运行对应查询,并将结果写入同一个黑板 Key。这样,AI 可以根据优先级动态切换目标,不必在单棵行为树中硬编码所有可能方向。

八、Wait 和 Wait Blackboard Time

1,功能介绍

(1)这是两个 Wait 节点,它的作用就是让角色啥都不做,干等一段时间。 
(2)对于 Wait 节点来说,要等待多长时间,可以直接在细节面板配置它的时间属性。它的参数有:
  • “等待时间”(WaitTime)是任务等待的时间。 
  • “随机偏差”(RandomDeviation)是让 Wait 节点等待的时间能够在 WaitTime 的基础上进行一定范围内的随机。比如当 WaitTime 设置为 5RandomDeviation0.5 的时候,最后等待的随机范围就会是 5-0.55+0.5 之间。使用这个随机偏移,我们可以让每次等待的时间不一样,提高 AI 的随机性,可以让 AI 变得更为自然。

(3)而对于 WaitBlackboardTime 任务来说,要等待多久则是取决于黑板中的某个条目指定的值,等待的时间是动态的。我们可以在其他节点(比如某个服务节点)中将要等待的时间写入黑板中,然后让 WaitBlackboardTime 任务根据黑板条目指定的时间进行等待。 

2,使用场景

(1)Wait
  • 在巡逻或搜索行为中,当 AI 到达某个巡逻点或搜索区域后,不要立刻立刻执行下一个动作,可以加入一个 Wait 节点,等待一段时间后再触发下一次移动或搜索。这样可以让守卫在哨位前保持“警戒”姿态,而不是机械地来回移动。
  • 对于使用远程武器或技能的 AI,在开火或施放技能后,需要有一个冷却时间才能再次使用。可以在 Play Animation 后插入一个 Wait 节点,将 WaitTime 设为武器冷却时长(如 2 秒),RandomDeviation 小幅随机化(±0.2 秒),再继续下一次攻击。
(2)WaitBlackboardTime
  • 根据角色的血量不同,我们可能需要让角色休息不同时长的时间。这时候我们就可以用一个服务节点,根据角色的血量来计算要休息的时间,然后将它写入到黑板的某个条目中,接下来就可以通过 WaitBlackboardTime 任务,使用这个条目作为等待的时间。这样一来就能动态地控制等待时长了。 
  • 有时 AI 需要等待某个外部事件发生(如门被打开、机关启动、倒计时结束)。在 ServiceDecorator 检测到事件即将触发时,将预估等待时间(例如 5 秒倒计时)写入黑板 KeyTimeToEvent”,然后 RunBehavior 前插入 WaitBlackboardTime,等待该条目指定的秒数。
评论

全部评论(0)

回到顶部