总览
这一篇目标很朴素:让一个守卫 NPC 用 StateTree 在两个点之间巡逻。先不要做发现玩家、追击、搜索。第一次只要跑通 Idle 和 Patrol,你就已经打通了 StateTree 资产、Schema、AIController、组件、NavMesh、Move To Task 和 Transition。
准备关卡
先确认场景里有这些东西:
- 一个可导航地面。
- 一个
NavMeshBoundsVolume,覆盖守卫和巡逻点。 - 一个守卫 Pawn,例如
BP_GuardCharacter。 - 一个 AIController,例如
BP_GuardAIController。 - 两个
TargetPoint,命名Patrol_A、Patrol_B。
按 P 看 NavMesh,如果地面没有绿色区域,后面的 Move To 一定不会动。先把导航修好,再看 StateTree。
创建 StateTree 资产
编辑器步骤:
- Content Browser 右键。
- 选择 Artificial Intelligence 或 Gameplay 相关分类里的
StateTree。 - 命名
ST_Guard_Beginner。 - 打开资产,Schema 选择
StateTree AI Component。 - 在 Schema Details 里确认 AIController Class 可以匹配你的
BP_GuardAIController。
为什么要选 AI Schema?因为我们要用 Move To,它需要 AIController。普通 StateTree Component Schema 只保证 Actor 上下文,不保证 AIController。
给 AIController 挂组件
打开 BP_GuardAIController:
- 添加组件
StateTreeAIComponent。 - 在组件 Details 里把 State Tree 设置为
ST_Guard_Beginner。 - 保持
Start Logic Automatically勾选。 - 确认 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:
- Idle:On State Succeeded -> PatrolA。
- PatrolA:On State Succeeded -> PatrolB。
- PatrolB:On State Succeeded -> Idle。
第一次可以直接把 Destination 写死成向量,确认能跑后再学绑定巡逻点。喂饭阶段先让链路通,比一次做对所有架构更重要。
源码依据
UStateTreeAIComponent 继承 UStateTreeComponent,注释说明它设计为运行在 AIController 上,并使用 StateTreeAIComponentSchema 保证能访问 AIController。UStateTreeComponent 提供 StartLogic、RestartLogic、StopLogic、TickComponent、SendStateTreeEvent。FStateTreeMoveToTask 使用 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.hGameplayStateTreeModule/Public/Components/StateTreeAIComponentSchema.hGameplayStateTreeModule/Public/Tasks/StateTreeMoveToTask.hStateTreeModule/Public/StateTreeReference.h