总览
普通 AI 是“一个角色找一个对象”。Mass 是“成百上千实体持续找可用对象”。所以 MassSmartObjects 不应该让每个实体每帧直接扫 USmartObjectSubsystem。它用 Fragment、请求、Processor、StateTree Task 把查询批处理化,并和 ZoneGraph 的车道/人行道位置结合。
使用案例
城市人群找座位:行人沿 ZoneGraph 走,StateTree 进入 Rest 状态,FMassFindSmartObjectTask 发送候选请求,UMassSmartObjectCandidatesFinderProcessor 批量处理,返回 FMassSmartObjectCandidateSlots。随后 FMassClaimSmartObjectTask 从候选里 Claim 一个 Slot,得到 ClaimedSlotTransform,移动任务把实体带到目标位置,最后 FMassUseSmartObjectTask 开始使用,计时或事件结束后释放。
架构分析
FMassSmartObjectUserFragment 是 Mass 实体能用 Smart Object 的身份证。它保存 UserTags、当前 InteractionHandle、InteractionStatus 和 InteractionCooldownEndTime。没有这个 Fragment,实体就没有 Smart Object 使用状态。
FMassFindSmartObjectTask 不直接返回一个 ClaimHandle,而是输出候选集合 FMassSmartObjectCandidateSlots。FMassClaimSmartObjectTask 再从候选里 Claim,并输出 FSmartObjectClaimHandle 和 Slot Transform。FMassUseSmartObjectTask 则接收 ClaimHandle,把交互状态推进到使用阶段。
ZoneGraph 版本的 FMassZoneGraphFindSmartObjectTarget 会把 Claim 的 Smart Object 转成 FMassZoneGraphTargetLocation,适合人群沿 Lane 移动到可达入口,而不是直接飞到世界坐标。
Mass 配置路径
- 给 Mass Entity Config 加
UMassSmartObjectUserTrait,让实体拥有 SmartObjectUser Fragment。 - 给需要被人群使用的对象配置 SmartObjectDefinition,ActivityTags 例如
Activity.Sit、Activity.Shop.Browse。 - 确保 MassSmartObjects Processor 在正确 Phase 运行。
- StateTree 里按顺序使用 Find Smart Object、Claim SmartObject、移动到目标、Use SmartObject。
- 配置 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 提供 FMassFindSmartObjectTask、FMassClaimSmartObjectTask、FMassUseSmartObjectTask 和 FMassZoneGraphFindSmartObjectTarget。
源码路径索引
MassSmartObjects/Public/MassSmartObjectFragments.hMassSmartObjects/Public/MassSmartObjectRequest.hMassSmartObjects/Public/MassSmartObjectProcessor.hMassSmartObjects/Public/MassSmartObjectUserTrait.hMassAIBehavior/Public/Tasks/MassFindSmartObjectTask.hMassAIBehavior/Public/Tasks/MassClaimSmartObjectTask.hMassAIBehavior/Public/Tasks/MassUseSmartObjectTask.hMassAIBehavior/Public/Tasks/MassZoneGraphFindSmartObjectTarget.h