感知

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)中文 (zh)Translate (Translate)

感知是NPC思考流程的第一阶段。此阶段,NPC将产生可见、可听的实体列表。NPC会忽略它不关心的实体与声响。


待完善: 更多感知(实体与声响)相关的详细说明有助于理解

概念

空间化的NPC感知的两个重要概念是PVS和LOS:

  • PVS(en) Potentially Visible Set/潜在可见集: 一组从NPCvisleaf(en)能够见到的visleafs。PVS是用visleafs测量出的空间区域,对于NPC所在位置而言,它是潜在可视区域。如果另一个实体(通常是Player或者NPC)进入这个区域,那么NPC可能考虑做一个视锥测试及视线测试。与LOS(en) (Line of Sight)相比,PVS不被props和func_detail笔刷限制,也不限于NPC恰好看向的方向。
  • 视锥(en)代表NPC目前的空间几何可见范围: 视锥的有效角度是NPC的FOV(en)角度,视锥长轴线的有效长度是NPC的范围(en)。视锥方向由NPC目前的朝向或其角度决定。 视锥的边界代表了NPC的视野边缘。
  • 范围(en)是NPC能够作出识别或反应时,与目标保持的最远距离。如果FOV(en)是视锥的有效范围,那么范围(en)就是视锥的有效深度。这似乎对所有NPC适用;通常为2048个单位。如果Long Visibility 标记开启, 范围将是无限的, 而Think Outside PVS标记不影响视锥范围。默认情况下,你从NPC的范围外射击NPC时,它什么也不会做。
  • FOV(en) Field of View/视场: 在Source中, NPC的FOV值是 Angular Field of View/角度视场计算的视锥. FOV的边,或者其投影到的一侧代表了视野边缘。(相反,Player的FOV值代表了视锥的水平角FOV,而不是整个视锥。楔体的长方体截面对应着玩家的长方形屏幕)
  • LOS(en) Line of Sight/视线: 如果一个潜在的目标包含在NPC的视锥中,LOS将用射线测试目标是否藏在另一个物体的后面;LOS会被所有的固体(en)几何体阻挡(模型、func_detail笔刷等等),除非笔刷/模型有一个SolidMask(en)固体蒙版NotSolid to LOS/对射线不当作固体,即Transparent/透明。例如(SolidMask:Grate/固体蒙版:架子,对子弹与LOS而言不是固体,还有防弹玻璃等....)
  • PAS(en) 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(en),NPC将被唤醒。
LOS测试是独立于NPCViewcone(en)的。只要NPC与威胁之间可以画出一条线,那么NPC将被唤醒。
这个设置可以让NPC纳入视野。例如在转角的情况。
[澄清]: 除了敌人之外,什么构成威胁
  • sleepstate = 2 : Waiting for PVS
NPC初始即睡眠状态。一旦玩家进入NPC的PVS(en),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(en)aiscripted_schedule(en)。这意味着一开始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不能在睡眠状态或者脚本执行中执行改输出。