总览
创建 StateTree 资产时,你会被要求选 Schema。很多新手把它当“随便选一个能创建就行”的下拉框,后面发现 Move To 找不到 AIController、绑定不到 Pawn 属性、Mass 里不能用普通 AI Task,才知道选错了。Schema 的作用是告诉 StateTree:这棵树允许用哪些节点、运行时能拿到哪些上下文、能不能延迟 Tick、外部数据怎么收集。
Schema 先用白话理解
Schema 就像这棵树的身份证和权限表。
| Schema | 适合谁 | 能保证拿到什么 |
|---|---|---|
| StateTree Component | 普通 Actor 上的 StateTreeComponent | Actor Context |
| StateTree AI Component | AIController 上的 StateTreeAIComponent | AIController 和受控 Pawn |
| Mass Behavior | Mass Entity 的批量行为 | Mass Entity、Mass ExecutionContext |
| 自定义 Schema | 项目自定义系统 | 你自己声明的上下文和外部数据 |
守卫 AI 要用 Move To,所以选 StateTree AI Component。普通门、机关、宝箱行为,不需要 AIController,可以用 StateTree Component。Mass 人群不挂组件,要用 Mass Behavior。
Context 是什么
Context 是运行这棵树时必须提供的数据。比如 AI Schema 会让树知道:当前 AIController 是谁,受控 Pawn 是谁。这样你才能在绑定面板里访问 Controller 或 Pawn 的属性。
如果你创建资产时把 Context Actor Class 设成 BP_GuardCharacter,编辑器里就能看到这个类的公开属性,绑定会更友好。如果保持太泛的 Actor,编辑器不知道你有 GuardHomeLocation、GuardPerceptionComponent 这类项目字段。
External Data 是什么
External Data 是 Task、Condition、Evaluator 运行时需要额外访问的对象或结构,比如:
| 外部数据 | 用途 |
|---|---|
UWorldSubsystem |
查全局管理器 |
UAIPerceptionComponent |
读取感知目标 |
UGuardBlackboardComponent |
读取项目自定义状态 |
UMassSignalSubsystem |
Mass 里发延迟信号 |
C++ Task 可以在 Link 里声明外部数据句柄,运行时通过 ExecutionContext 获取。通用写法是:声明我需要什么,运行这棵树的 Component 或 Mass Context 负责把实际对象喂进来。
源码依据
UStateTreeSchema 提供 IsStructAllowed、IsClassAllowed、IsExternalItemAllowed、GetContextDataDescs、IsScheduledTickAllowed 等接口。UStateTreeComponentSchema 注释说明它用于带 StateTreeComponent 的 Actor,并有 ContextActorClass。UStateTreeAIComponentSchema 注释说明它用于 StateTreeAIComponent,并保证访问 AIController,Actor context 可用于访问受控 Pawn。FStateTreeExternalDataDesc 描述外部数据类型、名称、句柄和 Required/Optional 要求。
架构分析
Schema 是 StateTree 的边界合同。它告诉资产“你能访问哪些世界对象”,也告诉编辑器“哪些节点能添加”。普通 Actor 交互、AIController 行为、Mass Entity 行为的上下文完全不同,所以不要把 Schema 当创建资产时随便选的模板;它实际上决定了这棵树能不能稳定运行。
使用案例
守卫 AI 的推荐设置:
- StateTree 资产 Schema:
StateTree AI Component。 - AIController Class:
BP_GuardAIController。 - Context Actor Class:
BP_GuardCharacter。 BP_GuardAIController上添加StateTreeAIComponent。BP_GuardCharacter暴露HomeLocation、PatrolIndex或感知组件引用。- 在 StateTree 绑定面板里从 Context Actor 绑定这些属性。
如果你在绑定面板里看不到 BP_GuardCharacter 的字段,优先检查 Schema 的 Context Actor Class,而不是怀疑绑定系统坏了。
项目落地
项目可以为常用系统做自定义 Schema。例如“交互物 StateTree”统一保证有 AInteractableActor 和 UInteractionSubsystem;“关卡机关 StateTree”统一保证有 ALevelScriptActor 或项目机关组件。这样内容侧创建资产时不会随便选 Schema,能减少一半早期错误。
常见坑
不要把 AI 用的树建成普通 Component Schema,Move To 和 AI Task 会缺上下文。不要把 Mass 的树拿到 Actor StateTreeComponent 上直接跑,Mass Schema 和实例数据模型不同。不要在 Task 里用 GetWorld()->GetFirstPlayerController() 乱取数据,应该通过 Context 或 External Data 明确声明。不要把 Required 外部数据留空,否则树可能初始化失败。
源码路径索引
StateTreeModule/Public/StateTreeSchema.hGameplayStateTreeModule/Public/Components/StateTreeComponentSchema.hGameplayStateTreeModule/Public/Components/StateTreeAIComponentSchema.hStateTreeModule/Public/StateTreeExecutionTypes.h