总览
前面讲的是 StateTree 资产本身。真正让它在游戏里跑起来的是 GameplayStateTree 插件里的组件和任务。最常用的是 UStateTreeComponent 和 UStateTreeAIComponent。前者适合普通 Actor,后者适合 AIController,能和 GameplayTasks、AI MoveTo、EQS 等系统配合。
资产、组件、实例数据的关系
| 名字 | 是什么 | 守卫案例 |
|---|---|---|
| StateTree 资产 | 行为定义 | ST_Guard |
| StateTreeAIComponent | 跑树的组件 | 挂在 BP_GuardAIController |
| InstanceData | 每个运行实例自己的数据 | 这个守卫当前在 Chase,剩余等待 0.3s |
| ExecutionContext | Tick 时临时创建的执行上下文 | 本帧用它访问数据、执行任务 |
同一个 ST_Guard 资产可以给 100 个守卫用,但每个守卫都有自己的 InstanceData。不要把“资产默认值”和“某个守卫当前运行值”混在一起。
UStateTreeComponent 能做什么
UStateTreeComponent 继承 UBrainComponent,所以它像 BehaviorTreeComponent 一样能 StartLogic、StopLogic、PauseLogic、RestartLogic。它还有:
SetStateTreeReference:设置要跑的树。SetStartLogicAutomatically:BeginPlay 是否自动启动。SendStateTreeEvent:给正在运行的树发事件。OnStateTreeRunStatusChanged:树运行状态改变时通知。- 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 的外部系统失败。
使用案例
守卫追击玩家:
- Chase 状态添加 Move To。
TargetActor绑定到GuardPerception.TargetActor。- AcceptableRadius 设置 150。
- bTrackMovingGoal 勾选。
- 添加 Transition:OnStateSucceeded -> CombatEntry。
- 添加 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.hGameplayStateTreeModule/Public/Components/StateTreeAIComponent.hGameplayStateTreeModule/Public/Tasks/StateTreeMoveToTask.hGameplayStateTreeModule/Public/Tasks/StateTreeRunEnvQueryTask.h