感知
< Zh
感知是NPC思考流程的第一阶段。此阶段,NPC将产生可见、可听的实体列表。NPC会忽略它不关心的实体与声响。
待完善: 更多感知(实体与声响)相关的详细说明有助于理解
Contents
概念
空间化的NPC感知的两个重要概念是PVS和LOS:
- PVS Potentially Visible Set/潜在可见集: 一组从NPCvisleaf 能够见到的visleafs。PVS是用visleafs测量出的空间区域,对于NPC所在位置而言,它是潜在可视区域。如果另一个实体(通常是Player或者NPC)进入这个区域,那么NPC可能考虑做一个视锥测试及视线测试。与LOS (Line of Sight)相比,PVS不被props和func_detail笔刷限制,也不限于NPC恰好看向的方向。
- FOV Field of View/视场: 在Source中, NPC的FOV值是 Angular Field of View/角度视场计算的视锥. FOV的边,或者其投影到的一侧代表了视野边缘。(相反,Player的FOV值代表了视锥的水平角FOV,而不是整个视锥。楔体的长方体截面对应着玩家的长方形屏幕)
- PAS Potentially Audible Set/潜在声音集: PVS是用visleafs测量出的空间区域,在这个区域内的声源NPC可能听得到。与视野不同,听觉不受限于有方向的视锥。
NPC 配置
快速概括NPC实体在Hammer中实现各种NPC行为的配置。
键值
Squad Name/小队名
有相同的小队名(以及相匹配小队名)的NPC会共享敌人信息,并且会采取轮番攻击以及掩护彼此等策略(取决于AI能力)。
Sleep State/睡眠状态
睡眠状态将让npc停滞直到指定的条件达成
睡眠状态将阻止NPC渲染与思考(think) ,并且它会等待Wake输入或特定条件的达成。 睡眠的NPC也不会播放闲置的声响。出于性能原因,让NPC作为地图未激活的一部分而进入睡眠状态是常见的技术。
- sleepstate = 0 : None (default)
- NPC生成时不会进入睡眠状态。
- sleepstate = 1 : Waiting for threat
- NPC初始即睡眠状态。一旦建立威胁LOS ,NPC将被唤醒。
- LOS测试是独立于NPCViewcone 的。只要NPC与威胁之间可以画出一条线,那么NPC将被唤醒。
- 这个设置可以让NPC纳入视野。例如在转角的情况。
- [澄清]: 除了敌人之外,什么构成威胁?
- sleepstate = 2 : Waiting for PVS
- NPC初始即睡眠状态。一旦玩家进入NPC的PVS ,NPC将被唤醒。
- 根据世界几何体的情况, NPC可以被很早的唤醒。但应该确保NPC不会突然出现在视野内。
- sleepstate = 3 : Waiting for input, ignore PVS
- NPC初始即睡眠状态。NPC仅可以被外部输入唤醒,例如wake输入,小队成员(须设置唤醒小队标识),唤醒半径(见下方)。
- sleepstate = 4 : Auto PVS
- NPC初始即睡眠状态。一旦玩家进入NPC的PVS,NPC将被唤醒。只要离开PVS后,NPC又将进入睡眠状态,这甚至能暂停敌人对玩家的追逐。然而,它们不会忘记自己的目标,一旦被唤醒将继续追逐。
- 不应该与Wake Radius一同使用。当玩家在唤醒半径,但是又不在PVS时,这可能制造唤醒-睡眠的无限循环。
- sleepstate = 5 : Auto PVS after PVS
- NPC初始即睡眠状态。在首次建立'PVS接触'时,它将进入自动PVS模式。
Wake Radius/唤醒半径
Auto-wake if player within this distance.
距离值distance为非0时, 玩家一进入该距离内NPC就会唤醒。距离唤醒与条件唤醒互补,不会覆盖它们。
Wake Squad/唤醒小队
如果设置"Yes",NPC将自动唤醒所有小队成员。
Flags/标识位
- Wait for Script
- 不同于睡眠状态.
- NPC只会在脚本运行后被激活,例如 scripted_sequence 和 aiscripted_schedule 。这意味着一开始NPC不认识敌人。这可以被用来让NPC待在原地直到脚本触,在脚本完成后,NPC离开等待状态。注意,当NPC被攻击后也会离开等待状态。
- Wait Till Seen
- NPC仅仅在玩家看见NPC后才被激活,“被玩家看见”测试似乎没有使用进入玩家FOV的方案。
I/O for NPC scripting/NPC脚本I/O
- BaseNPC Input : "Wake" : 如果NPC在睡眠状态,唤醒它。
- BaseNPC Input : "UpdateEnemyMemory" (targetname) : 更新NPC对自身目标的记忆.在对NPC新增敌对目标时有用, 比如!player。
- BaseNPC Output : "OnSleep" : NPC进入睡眠状态后开火。
- BaseNPC Output : "OnWake" : NPC从睡眠状态激活后开火。
- BaseNPC Outputs : "OnFoundPlayer" / "OnFoundEnemy" (targetname) : 当NPC发现玩家/敌人后开火.NPC不能在睡眠状态或者脚本执行中执行改输出。