感知系统
自动关联目录:感知系统
覆盖说明:官方 Gameplay Systems 正文点名 AI Perception Component 为 AI 系统之一;具体子页面无法枚举,本篇按引擎模块书写。
1. 定位
AI Perception 解决"NPC 知道什么":谁在视野里、谁发出了声响、谁碰到了我。它是 AI 的唯一数据入口。
一句话定位:感知的结果应该写进黑板,决策逻辑从黑板读——不要让行为树直接去做射线检测,那样每个节点都在重复计算。
2. 结构:刺激(Stimulus)模型
刺激源(Stimuli Source) 感知者(AI Perception Component)
玩家、噪音源、尸体 └─ 配置若干 Sense:
│ 注册 ├─ Sight(视觉)
│ ├─ Hearing(听觉)
▼ ├─ Damage(伤害)
AIPerceptionStimuliSourceComponent ├─ Touch(接触)
└─ Team / Prediction(团队、预测)
│
▼
OnPerceptionUpdated 回调
│
▼
写入 Blackboard| 概念 | 说明 |
|---|---|
| Sense | 一种感官(AISense_Sight / Hearing / Damage / Touch / Prediction / Team) |
| Stimulus | 一次具体的刺激事件 |
| 感知者 | UAIPerceptionComponent |
| 刺激源 | UAIPerceptionStimuliSourceComponent |
| 团队 | 用 AIPerceptionSystem 的团队 ID 做敌我区分 |
3. 用法
// 感知者:配置视觉
UAIPerceptionComponent* Perception = CreateDefaultSubobject<UAIPerceptionComponent>(TEXT("Perception"));
SightConfig = CreateDefaultSubobject<UAISenseConfig_Sight>(TEXT("SightConfig"));
SightConfig->SightRadius = 2000.f;
SightConfig->LoseSightRadius = 2500.f;
SightConfig->PeripheralVisionAngleDegrees = 90.f;
SightConfig->DetectionByAffiliation.SetDetectEnemies(true);
Perception->ConfigureSense(*SightConfig);
// 回调
Perception->OnPerceptionUpdated.AddDynamic(this, &AMyAIController::OnPerceptionUpdated);| 要点 | 说明 |
|---|---|
| SightRadius < LoseSightRadius | 进入范围与丢失范围分开,形成迟滞,避免边界抖动 |
DetectionByAffiliation | 只检测敌人/友军/中立 |
| 团队 ID | 通过 SetGenericTeamId 设置 |
| 刺激源注册 | 目标身上要有 AIPerceptionStimuliSourceComponent 并注册对应 Sense |
忘了给目标加 Stimuli Source 组件,是"AI 完全看不到玩家"的第一原因。
4. 各 Sense 的特点
| Sense | 特点 | 成本 |
|---|---|---|
| Sight | 需要视线检测(射线/碰撞),可配置角度与距离 | 中(取决于目标数与检测频率) |
| Hearing | 由噪音事件驱动(如 ReportNoiseEvent) | 低 |
| Damage | 由伤害事件驱动 | 低 |
| Touch | 碰撞触发 | 低 |
| Prediction | 预测目标的未来位置 | 低 |
| Team | 团队感知 | 低 |
视觉是最贵的——它要做实际的可见性检测。目标数量多时应限制 MaxActiveLoops 或降低更新频率。
5. 代价与权衡
| 设计 | 收益 | 代价 | 什么时候不该用 |
|---|---|---|---|
| 感知组件统一入口 | 逻辑集中,可缓存 | 需要为每个 Sense 配参数 | 极简 AI 可直接射线 |
| 迟滞(进入/丢失半径不同) | 边界不抖 | 参数更多 | 简单场景可用同一值 |
| DetectionByAffiliation | 减少无关检测 | 需要正确设置团队 | 无阵营概念时可全开 |
| 高频视觉更新 | 反应快 | 成本线性上升 | 大量 AI 应降频或用 LOD |
| Prediction Sense | 预判位置,射击更准 | 目标移动规律不符时会错 | 匀速目标才准 |
6. 踩坑与排查
| 坑 | 现象 | 怎么验证 |
|---|---|---|
| 目标没有 Stimuli Source | AI 完全感知不到 | 检查目标身上的组件与注册的 Sense |
| 团队没设 | 敌我不分或完全不检测 | 检查 SetGenericTeamId 与 Affiliation 配置 |
| 边界反复触发/丢失 | 没设迟滞 | LoseSightRadius 要大于 SightRadius |
| 感知很慢 | 视觉目标太多或更新太频繁 | 降低更新频率、限制目标数 |
| 看得见但打不到 | 感知与攻击逻辑用的是不同数据 | 确认黑板写入与读取一致 |
| 感知到了但行为树没反应 | 没写进黑板 | 检查回调里是否更新黑板键 |
| 死亡目标仍在感知列表 | 没移除 | 目标销毁时应注销刺激源 |
| 隔墙能"看到" | 视线检测未生效 | 检查碰撞通道与检测设置 |
7. 排查顺序
1. 完全感知不到?→ 目标是否有 Stimuli Source + 注册了对应 Sense
2. 敌我不分?→ 团队 ID 与 Affiliation
3. 边界抖动?→ 迟滞参数
4. 慢?→ 视觉目标数与更新频率
5. 感知到但没反应?→ 是否写入黑板8. 调试
| 手段 | 用途 |
|---|---|
| Gameplay Debugger | 看当前感知到的目标列表与状态 |
| Visual Logger | 回放感知事件 |
ai.debug.* / 感知相关 CVar | 调试绘制(视野锥、感知范围) |
参考
许可协议:CC BY
作者:Davids
本文链接:https://hustjjd.github.io/0c116981.html
更新于:2026年10月10日