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 Object | Tag 不匹配或未注册到子系统 | 检查 Tag 与注册 |
| 两个 AI 抢同一个位置 | 没走 Claim | 确认是否调用占用流程 |
| 位置被永久占用 | 异常路径没 Release | 中断/死亡时要释放 |
| 使用了但动画不对 | 行为定义配置问题 | 检查 Slot 的变换与行为定义 |
| 与导航脱节 | AI 走不过去 | Slot 位置需要在 NavMesh 上 |
| 调试看不到 | 没有可视化 | 需要开启 Smart Object 的调试绘制 |
6. 排查顺序
1. 找不到?→ Tag 过滤 + 是否注册到子系统
2. 抢位置?→ Claim 流程
3. 永久占用?→ Release 路径(含异常)
4. 表现不对?→ Slot 变换与行为定义
5. 走不过去?→ Slot 是否在 NavMesh 上参考
- FGameplayTag · 导航系统 · 行为树
- 官方
Gameplay Systems分类(Smart Objects)
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/c3ed415f.html
更新于:2026年10月10日