Smart Objects

自动关联目录:Smart Objects

覆盖说明:官方 Gameplay Systems 正文点名 Smart Objects 为 AI 系统之一(已核实)。子页面无法枚举,本篇按引擎模块书写。

1. 定位

Smart Objects 让"场景里可被使用的东西"自己描述怎么用——椅子怎么坐、门怎么开、掩体怎么躲。AI 不再需要为每个交互对象写死逻辑。

一句话定位:把"怎么用这个东西"的知识从 AI 侧搬到物体侧,AI 只负责"我想找个东西做某件事"。

2. 结构

Smart Object(场景里的对象)
   └── 若干 Slot(使用位置)
          ├── 定义:类型、变换、占用规则
          └── 行为定义(怎么用:动画、移动、完成条件)

请求方(AI)
   └── 用 Gameplay Tag 表达需求(如 SmartObject.Type.Seat)
          → 查询可用 Slot
          → 占用(Claim)
          → 执行行为定义
          → 释放(Release)
概念说明
Smart Object场景中的可交互对象
Slot对象上的具体使用位置(一把椅子可以有多个座位)
行为定义怎么使用(通常配动画/移动)
Tag 过滤用 Gameplay Tag 表达"我要找什么"
占用(Claim)防止多个 AI 抢同一个 Slot

3. 与旧做法的对比

旧做法Smart Objects
知识位置AI 侧(if 找到椅子 then 播放坐的动画)物体侧
新增交互物要改 AI 逻辑只加资产
复用差好(同一套椅子逻辑到处用)
占用管理自己写内建 Claim/Release

收益最明显的场景:开放世界里有大量同类交互点(营地、座位、工作台),AI 行为又需要统一。

4. 代价与权衡

设计收益代价什么时候不该用
知识放物体侧新增交互物不用改 AI资产配置工作量前移只有一两个交互物时过度设计
Tag 过滤需求表达统一(复用 FGameplayTag)标签体系要先规划见 Tag 篇的设计建议
Claim/Release内建占用,不会抢忘记 Release 会永久占用异常路径必须释放
行为定义使用方式可视化配置复杂交互仍需代码简单交互划算,复杂的不一定

5. 踩坑与排查

坑现象怎么验证
AI 找不到 Smart ObjectTag 不匹配或未注册到子系统检查 Tag 与注册
两个 AI 抢同一个位置没走 Claim确认是否调用占用流程
位置被永久占用异常路径没 Release中断/死亡时要释放
使用了但动画不对行为定义配置问题检查 Slot 的变换与行为定义
与导航脱节AI 走不过去Slot 位置需要在 NavMesh 上
调试看不到没有可视化需要开启 Smart Object 的调试绘制

6. 排查顺序

1. 找不到?→ Tag 过滤 + 是否注册到子系统
2. 抢位置?→ Claim 流程
3. 永久占用?→ Release 路径(含异常)
4. 表现不对?→ Slot 变换与行为定义
5. 走不过去?→ Slot 是否在 NavMesh 上

参考