UE5.8 Smart Objects 专题系列

UE5.8 Smart Objects 专题(九):Mass SmartObjects 与 ZoneGraph 人群系统

从 MassSmartObjects 的 Fragment、请求、Processor 和 MassAIBehavior StateTree Task 讲到 ZoneGraph 上的人群如何找、Claim、移动到并使用 Smart Object。

总览

普通 AI 是“一个角色找一个对象”。Mass 是“成百上千实体持续找可用对象”。所以 MassSmartObjects 不应该让每个实体每帧直接扫 USmartObjectSubsystem。它用 Fragment、请求、Processor、StateTree Task 把查询批处理化,并和 ZoneGraph 的车道/人行道位置结合。

UE5.8 Smart Objects 专题(九):Mass SmartObjects 与 ZoneGraph 人群系统 配图
Mass 接入 Smart Object 的关键是异步候选请求、UserFragment、StateTree Task 和 ZoneGraph 位置目标。

使用案例

城市人群找座位:行人沿 ZoneGraph 走,StateTree 进入 Rest 状态,FMassFindSmartObjectTask 发送候选请求,UMassSmartObjectCandidatesFinderProcessor 批量处理,返回 FMassSmartObjectCandidateSlots。随后 FMassClaimSmartObjectTask 从候选里 Claim 一个 Slot,得到 ClaimedSlotTransform,移动任务把实体带到目标位置,最后 FMassUseSmartObjectTask 开始使用,计时或事件结束后释放。

架构分析

FMassSmartObjectUserFragment 是 Mass 实体能用 Smart Object 的身份证。它保存 UserTags、当前 InteractionHandleInteractionStatusInteractionCooldownEndTime。没有这个 Fragment,实体就没有 Smart Object 使用状态。

FMassFindSmartObjectTask 不直接返回一个 ClaimHandle,而是输出候选集合 FMassSmartObjectCandidateSlotsFMassClaimSmartObjectTask 再从候选里 Claim,并输出 FSmartObjectClaimHandle 和 Slot Transform。FMassUseSmartObjectTask 则接收 ClaimHandle,把交互状态推进到使用阶段。

ZoneGraph 版本的 FMassZoneGraphFindSmartObjectTarget 会把 Claim 的 Smart Object 转成 FMassZoneGraphTargetLocation,适合人群沿 Lane 移动到可达入口,而不是直接飞到世界坐标。

Mass 配置路径

  1. 给 Mass Entity Config 加 UMassSmartObjectUserTrait,让实体拥有 SmartObjectUser Fragment。
  2. 给需要被人群使用的对象配置 SmartObjectDefinition,ActivityTags 例如 Activity.SitActivity.Shop.Browse
  3. 确保 MassSmartObjects Processor 在正确 Phase 运行。
  4. StateTree 里按顺序使用 Find Smart Object、Claim SmartObject、移动到目标、Use SmartObject。
  5. 配置 InteractionCooldown,避免实体刚释放就立刻抢回同一个点。

项目落地

Mass 项目要控制查询密度。不要让所有实体同时 SearchInterval 为 0。给不同人群分层:路人休息每 10 秒查一次,任务 NPC 每 1 秒查一次,玩家附近实体提高频率,远处实体降低频率。再用 MRU Slots 避免反复选择刚用过的 Slot。

常见坑

  • 没加 UserTrait:StateTree Task 找不到 FMassSmartObjectUserFragment
  • 所有实体同帧查询:候选查找 Processor 瞬时成本飙升。
  • 不设冷却:实体可能反复占用同一个对象。
  • 忘记 ZoneGraph 可达性:世界坐标最近不代表沿 Lane 可走。
  • 普通 Actor 和 Mass 混用没规划优先级:玩家、剧情 NPC、路人要有明确 ClaimPriority。

源码依据

FMassSmartObjectUserFragment 保存 UserTags、InteractionHandle、InteractionStatus 和 Cooldown。UMassSmartObjectCandidatesFinderProcessor 批量构建候选;UMassSmartObjectTimedBehaviorProcessor 处理计时行为;UMassSmartObjectUserFragmentDeinitializer 负责 Fragment 移除时清理回调。MassAIBehavior 提供 FMassFindSmartObjectTaskFMassClaimSmartObjectTaskFMassUseSmartObjectTaskFMassZoneGraphFindSmartObjectTarget

源码路径索引

  • MassSmartObjects/Public/MassSmartObjectFragments.h
  • MassSmartObjects/Public/MassSmartObjectRequest.h
  • MassSmartObjects/Public/MassSmartObjectProcessor.h
  • MassSmartObjects/Public/MassSmartObjectUserTrait.h
  • MassAIBehavior/Public/Tasks/MassFindSmartObjectTask.h
  • MassAIBehavior/Public/Tasks/MassClaimSmartObjectTask.h
  • MassAIBehavior/Public/Tasks/MassUseSmartObjectTask.h
  • MassAIBehavior/Public/Tasks/MassZoneGraphFindSmartObjectTarget.h