Enemy Perception
Tipo: Exec (In → Out)
Categoría: AI
Execution Order: 40 (primero del sistema modular)
Detecta al objetivo usando distancia, ángulo de campo visual (FOV) y raycast. Publica los resultados en variables ai_* que el resto del sistema modular lee.
Propiedades
| Propiedad | Tipo | Por defecto | Descripción |
|---|---|---|---|
| Target | Enum | (objetos de escena) | Objeto a detectar |
| View Distance | Float (≥0.1) | 12.0 |
Rango máximo de detección |
| Aggro Radius | Float (≥0.0) | 2.5 |
Radio de detección automática sin FOV ni raycast |
| Use FOV | Bool | True |
Limitar detección a un cono frontal |
| FOV Angle | Float (1–360) | 90.0 |
Apertura total del cono en grados |
| Use Raycast | Bool | True |
Requerir línea de visión sin obstáculos |
| Raycast Prop | String | "" |
Propiedad BGE que filtra obstáculos del raycast |
| Memory Duration | Float (≥0.0) | 3.0 |
Segundos que recuerda al objetivo tras perderlo (0 = olvido inmediato) |
| Perception Interval | Float (≥0.0) | 0.0 |
Segundos entre comprobaciones (0 = cada frame) |
| Debug | Bool | False |
Imprimir estado por consola |
Sockets
| Socket | Dirección | Tipo |
|---|---|---|
| In | Entrada | Exec |
| Out | Salida | Exec |
Variables publicadas
| Variable | Tipo | Descripción |
|---|---|---|
self.ai_can_see |
bool | True si el target es visible este frame |
self.ai_has_line_of_sight |
bool | True si el raycast llega al target sin obstáculos |
self.ai_dist |
float | Distancia XY al target (9999 si no existe) |
self.ai_target |
KX_GameObject|None | Referencia al objeto target |
self.ai_target_pos |
Vector|None | Posición del target si visible; None si oculto |
self.ai_last_seen_pos |
Vector|None | Última posición conocida (persiste después de perder vista) |
Comportamiento
Lógica de detección (cada comprobación)
Si distancia ≤ aggro_radius:
→ detección inmediata (sin FOV, sin raycast)
Si distancia ≤ view_distance:
Si use_fov:
→ calcular dot product con eje frontal Y del enemigo
→ si dot ≥ cos(fov_angle/2): continuar
Si use_raycast:
→ rayCast al target
→ detección solo si hit == target
Si no use_raycast:
→ detección por distancia + FOV
Perception Interval
Si Perception Interval > 0, la comprobación completa solo se ejecuta cada N segundos. Esto ahorra CPU en niveles con muchos enemigos. La publicación de variables (ai_can_see, etc.) solo se actualiza en esos frames.
Memoria
Cuando el target se pierde de vista, ai_last_seen_pos conserva la última posición conocida durante memory_duration segundos. Transcurrido ese tiempo, ai_target se pone a None.
ai_can_see = False no borra ai_last_seen_pos — esto permite que AI State Machine envíe al enemigo a buscar en ese punto.
Uso en el sistema modular
Enemy Perception debe ejecutarse antes de AI State Machine. El execution_order = 40 garantiza que sus variables estén actualizadas cuando el SM las lee:
[OnUpdate] → [Enemy Perception] → [Damage Receiver] → [AI State Machine] → ...
Ejemplo de configuración
Guardia con cono frontal y memoria de 5 segundos
Target: Player
View Distance: 15.0
Aggro Radius: 2.0
Use FOV: True
FOV Angle: 120.0
Use Raycast: True
Memory Duration: 5.0
Perception Interval: 0.1 (actualiza cada 100ms)
Enemigo omnisciente sin FOV
Use FOV: False
Use Raycast: False
View Distance: 20.0
Notas
- La distancia para FOV y memoria se calcula en el plano XY — la altura no afecta la detección.
- El coseno del ángulo de FOV se calcula en compilación, no en runtime, para ahorrar CPU.
- Si el target se destruye durante el juego, todas las variables
ai_*se resetean a sus valores por defecto sin errores. - El modo
debugimprimesee,dist, ylospor consola cada frame — útil para ajustar parámetros.