UE5.8 StateTree 状态树专题系列

UE5.8 StateTree 专题(九):GameplayStateTree、组件运行和 AI MoveTo

讲 UStateTreeComponent、UStateTreeAIComponent、StartLogic、SendStateTreeEvent、MoveTo Task、EQS Task 和 AIController/Pawn 上下文。

总览

前面讲的是 StateTree 资产本身。真正让它在游戏里跑起来的是 GameplayStateTree 插件里的组件和任务。最常用的是 UStateTreeComponentUStateTreeAIComponent。前者适合普通 Actor,后者适合 AIController,能和 GameplayTasks、AI MoveTo、EQS 等系统配合。

UE5.8 StateTree 专题(九):GameplayStateTree、组件运行和 AI MoveTo 配图
GameplayStateTree 是把通用 StateTree 接到 Actor、AIController、GameplayTasks 和导航系统上的运行时层。

资产、组件、实例数据的关系

名字 是什么 守卫案例
StateTree 资产 行为定义 ST_Guard
StateTreeAIComponent 跑树的组件 挂在 BP_GuardAIController
InstanceData 每个运行实例自己的数据 这个守卫当前在 Chase,剩余等待 0.3s
ExecutionContext Tick 时临时创建的执行上下文 本帧用它访问数据、执行任务

同一个 ST_Guard 资产可以给 100 个守卫用,但每个守卫都有自己的 InstanceData。不要把“资产默认值”和“某个守卫当前运行值”混在一起。

UStateTreeComponent 能做什么

UStateTreeComponent 继承 UBrainComponent,所以它像 BehaviorTreeComponent 一样能 StartLogic、StopLogic、PauseLogic、RestartLogic。它还有:

  1. SetStateTreeReference:设置要跑的树。
  2. SetStartLogicAutomatically:BeginPlay 是否自动启动。
  3. SendStateTreeEvent:给正在运行的树发事件。
  4. OnStateTreeRunStatusChanged:树运行状态改变时通知。
  5. Linked StateTree Overrides:按 GameplayTag 覆盖 linked state tree。

Move To Task 怎么用

FStateTreeMoveToTask 是 AI 常用任务。它的实例数据里有:

属性 用途
AIController 控制移动的 AIController
Destination 目标位置
TargetActor 目标 Actor
AcceptableRadius 到多近算到达
bTrackMovingGoal 目标移动时是否跟踪
bAllowPartialPath 找不到完整路径时是否接受部分路径

追击玩家时可以用 TargetActor,也可以用 Destination 绑定 PlayerLocation。新手建议:目标会移动时优先用 TargetActor 或确保 Destination Tick 更新。

源码依据

UStateTreeComponent 声明了 BeginPlay、TickComponent、StartLogic、RestartLogic、StopLogic、PauseLogic、ResumeLogic、IsRunning、IsPaused。UStateTreeAIComponent 注释说明它设计为运行在 AIController 上,并使用 StateTreeAIComponentSchema 保证访问 AIController。FStateTreeMoveToTask 注释说明它使用 AITask_MoveTo 移动 AIController 的 Pawn,到达成功,不可移动失败。

架构分析

GameplayStateTree 是通用 StateTree 和 UE Gameplay 世界之间的适配层。资产只描述状态逻辑,组件负责把资产实例化到 Actor/AIController 上,Task 再调用导航、EQS、GameplayTasks 等系统。分清这三层后,排查问题时可以先问:资产没选对,组件没启动,还是具体 Task 的外部系统失败。

使用案例

守卫追击玩家:

  1. Chase 状态添加 Move To。
  2. TargetActor 绑定到 GuardPerception.TargetActor
  3. AcceptableRadius 设置 150。
  4. bTrackMovingGoal 勾选。
  5. 添加 Transition:OnStateSucceeded -> CombatEntry。
  6. 添加 Transition:OnTick + DistanceToPlayer > LoseSightRange -> Search。

这样玩家移动时 Move To 会持续追踪目标。如果你绑定的是 Destination,而没有 Tick 更新,守卫可能追到旧位置。

项目落地

AIController 里只保留“启动树、提供组件、处理高层 AI 生命周期”。具体行为放 StateTree。Pawn 里保留 Movement、Animation、感知组件和可被绑定的数据。不要让 AIController Tick 里继续写一堆巡逻逻辑,否则 StateTree 和 Controller 会互相覆盖。

常见坑

不要在 Character 上挂普通 StateTreeComponent 又期待 AI MoveTo 自动有 Controller。不要忘记 Start Logic Automatically。不要把 StateTree 资产运行时换掉时忘记当前逻辑是否 Running,组件接口说明运行中不会直接设置新树。不要把 Move To 的 AcceptableRadius 设得太小,角色胶囊和 NavMesh 精度会让它看似永远到不了。

源码路径索引

  • GameplayStateTreeModule/Public/Components/StateTreeComponent.h
  • GameplayStateTreeModule/Public/Components/StateTreeAIComponent.h
  • GameplayStateTreeModule/Public/Tasks/StateTreeMoveToTask.h
  • GameplayStateTreeModule/Public/Tasks/StateTreeRunEnvQueryTask.h