UE5.8 Mass Framework 专题系列

UE5.8 Mass 专题(九):Mass AI、StateTree 与 SmartObject

讲 MassAIBehavior、UMassStateTreeTrait、FMassStateTreeInstanceFragment、MassStateTreeSubsystem、MassSmartObjectUserFragment、Claim/Use SmartObject Task 与行为架构。

总览

Mass AI 的目标不是给每个实体挂一个 AIController,而是把“决策数据”和“批量执行”分开。UE5.8 的 MassAIBehavior 提供 UMassStateTreeTraitFMassStateTreeInstanceFragmentFMassStateTreeSharedFragment、Mass StateTree Processor 和大量任务;MassSmartObjects 提供 SmartObject 用户 Fragment、Claim/Use 流程和世界交互点。两者组合起来,适合做人群巡游、排队、使用设施、逃离、闲逛等行为。

在这个模型里,StateTree 更像“每个实体的小状态机数据”,而不是每实体一个完整 UObject 行为树。Processor 批量推进 StateTree,任务读写 Mass Fragment,移动和交互仍交给其他 Mass 模块。

UE5.8 Mass 专题(九):Mass AI、StateTree 与 SmartObject 配图
StateTree 决策写入 Mass Fragment,SmartObject 提供世界交互点;Mass Processor 负责把这些决策批量执行。

源码依据

MassStateTreeTrait.hUMassStateTreeTraitBuildTemplate 把 StateTree 执行能力加入实体,并通过 RequiredAssetDataTags 限制资产 Schema 为 MassStateTreeSchemaMassStateTreeFragments.h 定义 FMassStateTreeInstanceFragment,其中保存 FMassStateTreeInstanceHandle 和上次更新时间;FMassStateTreeSharedFragment 保存 StateTree 资产。MassSmartObjectFragments.hFMassSmartObjectUserFragment 保存 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 资产配置建议:

  1. 使用 Mass StateTree Schema。
  2. Evaluator 读取业务 Fragment,例如心情、预算、疲劳。
  3. Task 只写意图 Fragment 或调用 Mass SmartObject Task。
  4. 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.h
  • MassAI/Source/MassAIBehavior/Public/MassStateTreeFragments.h
  • MassSmartObjects/Public/MassSmartObjectFragments.h
  • MassAI/Source/MassAIBehavior/Public/Tasks/MassUseSmartObjectTask.h