UE5.8 StateTree 状态树专题系列

UE5.8 StateTree 专题(二):第一个守卫 StateTree,从创建资产到跑起来

一步一步创建 StateTree 资产、选择 Schema、给 AIController 挂 StateTreeAIComponent、添加 Idle/Patrol 状态、Move To Task 和基础 Transition。

总览

这一篇目标很朴素:让一个守卫 NPC 用 StateTree 在两个点之间巡逻。先不要做发现玩家、追击、搜索。第一次只要跑通 Idle 和 Patrol,你就已经打通了 StateTree 资产、Schema、AIController、组件、NavMesh、Move To Task 和 Transition。

UE5.8 StateTree 专题(二):第一个守卫 StateTree,从创建资产到跑起来 配图
第一棵树只做 Idle 和 Patrol,先验证资产、组件、AIController、NavMesh 和 Tick 都通了。

准备关卡

先确认场景里有这些东西:

  1. 一个可导航地面。
  2. 一个 NavMeshBoundsVolume,覆盖守卫和巡逻点。
  3. 一个守卫 Pawn,例如 BP_GuardCharacter
  4. 一个 AIController,例如 BP_GuardAIController
  5. 两个 TargetPoint,命名 Patrol_APatrol_B

P 看 NavMesh,如果地面没有绿色区域,后面的 Move To 一定不会动。先把导航修好,再看 StateTree。

创建 StateTree 资产

编辑器步骤:

  1. Content Browser 右键。
  2. 选择 Artificial Intelligence 或 Gameplay 相关分类里的 StateTree
  3. 命名 ST_Guard_Beginner
  4. 打开资产,Schema 选择 StateTree AI Component
  5. 在 Schema Details 里确认 AIController Class 可以匹配你的 BP_GuardAIController

为什么要选 AI Schema?因为我们要用 Move To,它需要 AIController。普通 StateTree Component Schema 只保证 Actor 上下文,不保证 AIController。

给 AIController 挂组件

打开 BP_GuardAIController

  1. 添加组件 StateTreeAIComponent
  2. 在组件 Details 里把 State Tree 设置为 ST_Guard_Beginner
  3. 保持 Start Logic Automatically 勾选。
  4. 确认 Pawn 的 AI Controller Class 指向 BP_GuardAIController

如果你喜欢手动启动,也可以不勾自动启动,在 BeginPlay 调 StartLogic(),但新手阶段建议先用自动启动,少一个变量。

搭第一棵树

ST_Guard_Beginner 中建状态:

State 设置
Root Selection Behavior 选 Try Select Children In Order
Idle 添加 Wait Task,Duration 2.0
PatrolA 添加 Move To Task,Destination 绑定或填写 Patrol_A 位置
PatrolB 添加 Move To Task,Destination 绑定或填写 Patrol_B 位置

Transition:

  1. Idle:On State Succeeded -> PatrolA。
  2. PatrolA:On State Succeeded -> PatrolB。
  3. PatrolB:On State Succeeded -> Idle。

第一次可以直接把 Destination 写死成向量,确认能跑后再学绑定巡逻点。喂饭阶段先让链路通,比一次做对所有架构更重要。

源码依据

UStateTreeAIComponent 继承 UStateTreeComponent,注释说明它设计为运行在 AIController 上,并使用 StateTreeAIComponentSchema 保证能访问 AIController。UStateTreeComponent 提供 StartLogicRestartLogicStopLogicTickComponentSendStateTreeEventFStateTreeMoveToTask 使用 AITask_MoveTo,成功到达返回 Succeeded,不可达返回 Failed。

架构分析

第一棵树只做两件事:验证运行入口和验证一个可等待任务。运行入口是 AIController 上的 UStateTreeAIComponent,可等待任务是 Move To。只要这两个通了,后面加 Condition、Evaluator、Binding 都是在已经跑通的链路上扩展,排错会轻很多。

使用案例

如果守卫不动,按这个顺序查:

现象 先查什么
StateTree 完全没启动 组件是否挂在 AIController,是否自动 Start Logic
Move To 失败 NavMesh 是否绿色,Destination 是否在 NavMesh 上
树停在 Idle Wait 是否返回 Succeeded,Transition 是否指向 PatrolA
树进了 Patrol 但不走 AIController 是否 Possess Pawn,Pawn 是否有 MovementComponent
运行时资产报 Schema StateTree 资产 Schema 是否是 AI Component

项目落地

把这篇做成团队模板:BP_GuardAIController + ST_Guard_Beginner + 两个巡逻点。以后所有复杂行为都从这个模板复制,不要每个人从空资产重新搭。模板里保留一个 Debug 文本或日志,显示当前 Active State,能省很多排查时间。

常见坑

不要第一步就绑定 Actor 数组、写自定义 Task、接感知组件。先写死坐标跑通。不要把 StateTreeComponent 挂到 Character 上又用 AI Schema 期待它自动有 AIController;AI 版本组件应该放在 AIController 上更清楚。不要忘记 NavMesh,这是 Move To 失败的第一嫌疑。

源码路径索引

  • GameplayStateTreeModule/Public/Components/StateTreeAIComponent.h
  • GameplayStateTreeModule/Public/Components/StateTreeAIComponentSchema.h
  • GameplayStateTreeModule/Public/Tasks/StateTreeMoveToTask.h
  • StateTreeModule/Public/StateTreeReference.h