总览
Mass AI 的目标不是给每个实体挂一个 AIController,而是把“决策数据”和“批量执行”分开。UE5.8 的 MassAIBehavior 提供 UMassStateTreeTrait、FMassStateTreeInstanceFragment、FMassStateTreeSharedFragment、Mass StateTree Processor 和大量任务;MassSmartObjects 提供 SmartObject 用户 Fragment、Claim/Use 流程和世界交互点。两者组合起来,适合做人群巡游、排队、使用设施、逃离、闲逛等行为。
在这个模型里,StateTree 更像“每个实体的小状态机数据”,而不是每实体一个完整 UObject 行为树。Processor 批量推进 StateTree,任务读写 Mass Fragment,移动和交互仍交给其他 Mass 模块。
源码依据
MassStateTreeTrait.h 中 UMassStateTreeTrait 用 BuildTemplate 把 StateTree 执行能力加入实体,并通过 RequiredAssetDataTags 限制资产 Schema 为 MassStateTreeSchema。MassStateTreeFragments.h 定义 FMassStateTreeInstanceFragment,其中保存 FMassStateTreeInstanceHandle 和上次更新时间;FMassStateTreeSharedFragment 保存 StateTree 资产。MassSmartObjectFragments.h 中 FMassSmartObjectUserFragment 保存 UserTags、InteractionHandle、InteractionStatus 和冷却时间。
架构分析
Mass AI 最稳的分层是:StateTree 决定意图,Fragment 承载意图,Processor 执行动作。比如 StateTree 的“去咖啡机”状态不应该直接移动 Actor,而是写目标或发起 SmartObject Claim;ZoneGraph 和 Movement Processor 负责移动;到达后 SmartObject Task Claim/Use;完成后 Signal 或 StateTree Transition 切回闲逛。
SmartObject 是把世界可交互点数据化的方式。咖啡机、长椅、售票机、门禁、观景点都可以提供 Slot 和行为定义。Mass 实体通过 FMassSmartObjectUserFragment 记录当前 Claim 和状态,避免多个实体抢同一个位置。
使用案例
一个“路人买咖啡”的行为链:
| 步骤 | StateTree/Task | Mass 数据 |
|---|---|---|
| 闲逛 | Wander | 选择 ZoneGraph 目标 |
| 发现咖啡机 | Find SmartObject Target | 写候选 SmartObject |
| 占用槽位 | Claim SmartObject | 写 InteractionHandle |
| 走到槽位 | ZoneGraph PathFollow | 写 DesiredMovement |
| 使用 | Use SmartObject | 写 InteractionStatus,发延迟 Signal |
| 完成 | Transition | 清理 Handle,进入下一目标 |
StateTree 资产配置建议:
- 使用 Mass StateTree Schema。
- Evaluator 读取业务 Fragment,例如心情、预算、疲劳。
- Task 只写意图 Fragment 或调用 Mass SmartObject Task。
- Transition 条件尽量基于 Fragment/Signal,而不是 Actor 状态。
项目落地
先做三个状态就够:Idle、MoveToTarget、UseSmartObject。等这条链路稳定,再加排队、避让、优先级和异常回退。每个 SmartObject 行为都要定义失败路径:Claim 失败怎么办,移动中目标被占怎么办,使用中实体被销毁怎么办。大规模 AI 最怕“半占用状态”泄漏,必须有 Observer 或超时清理。
常见坑
不要把 Mass StateTree 当普通 Actor StateTree 使用,Task 里不要随意访问个体 Actor。不要把所有行为都写进一个巨大 StateTree,复杂项目可以按人群类型拆资产。不要忽略 SmartObject 冷却和 MRU 槽位,否则实体会反复抢同一个点。不要在 StateTree 每次 Tick 做昂贵查找,候选目标可以由 Processor 批量计算后写 Fragment。
源码路径索引
MassAI/Source/MassAIBehavior/Public/MassStateTreeTrait.hMassAI/Source/MassAIBehavior/Public/MassStateTreeFragments.hMassSmartObjects/Public/MassSmartObjectFragments.hMassAI/Source/MassAIBehavior/Public/Tasks/MassUseSmartObjectTask.h