感知系统

自动关联目录:感知系统

覆盖说明:官方 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 SourceAI 完全感知不到检查目标身上的组件与注册的 Sense
团队没设敌我不分或完全不检测检查 SetGenericTeamId 与 Affiliation 配置
边界反复触发/丢失没设迟滞LoseSightRadius 要大于 SightRadius
感知很慢视觉目标太多或更新太频繁降低更新频率、限制目标数
看得见但打不到感知与攻击逻辑用的是不同数据确认黑板写入与读取一致
感知到了但行为树没反应没写进黑板检查回调里是否更新黑板键
死亡目标仍在感知列表没移除目标销毁时应注销刺激源
隔墙能"看到"视线检测未生效检查碰撞通道与检测设置

7. 排查顺序

1. 完全感知不到?→ 目标是否有 Stimuli Source + 注册了对应 Sense
2. 敌我不分?→ 团队 ID 与 Affiliation
3. 边界抖动?→ 迟滞参数
4. 慢?→ 视觉目标数与更新频率
5. 感知到但没反应?→ 是否写入黑板

8. 调试

手段用途
Gameplay Debugger看当前感知到的目标列表与状态
Visual Logger回放感知事件
ai.debug.* / 感知相关 CVar调试绘制(视野锥、感知范围)

参考