Argus
Enemy Awareness & Detection AI
Drop-on enemy awareness and detection for stealth games. Argus watches the world through configurable senses (vision, hearing, smell, clues), builds suspicion through a 5-tier state machine, and coordinates squads, while your prefab keeps full control of movement, animation, and combat. Use the no-code guard, or subscribe to events and drive your own controller. Ships with a live in-game debugger so you can see exactly why a guard does what it does.
Named for Argus Panoptes, the hundred-eyed guardian who never slept.
A nine-part demo, one mechanic per video.
Every Argus mechanic gets its own short demo. Watch the playlist for the full picture, or skim the list to see what is covered.
Playlist · 9 videos Watch on YouTube → - 01Vision & Line-of-Sight
- 02Crouching to Break Sight
- 03Hearing with Occlusion
- 04Light-Aware Detection
- 05Body Discovery (Clues + Smell)
- 06Squad Alert Propagation
- 07Threat Priority Arbitration
- 08Force-Alert / Damage Hook
- 09Guard Archetypes
Two ways to use it.
Drop on the guard, hit Play
Add ArgusGuard to a character with a NavMeshAgent. It patrols, investigates,
searches, and chases on its own. Wire attack, animation, and sound to its inspector
events, the same way you wire a Button's OnClick. Zero scripting.
Subscribe and drive your own rig
Argus is an observer. It raises events and exposes CurrentState. Subscribe
and drive your own controller, a root-motion rig, or custom non-NavMesh locomotion.
Prefer typed bindings? Implement IArgusGuardReactions for an
autocomplete-friendly alternative to the inspector events. You stay in charge of how
the character actually moves.
The observer and the actor stay separate.
Sensors feed an awareness model, which drives a suspicion FSM, which raises state changes. Your adapter (or the no-code guard) is the only thing that acts, so Argus drops into any prefab without touching what already works.
Smell · Clues
+ decay / forget
threshold transitions
chases
Everything a stealth sandbox needs.
Observer architecture
Argus watches the world, builds up awareness, runs a suspicion FSM, and raises events. It never touches movement, animation, IK, or ragdoll, so your prefab keeps full control. A thin adapter (or the no-code guard) reacts to state changes.
5-tier suspicion meter
Unaware to Suspicious to Investigating to Alarmed to Combat, with configurable thresholds, combat hysteresis (enter at 0.95, hold to 0.5), and a sticky Alarmed dwell so guards do not flip-flop. Once in Combat, non-sight stimuli are damped 10x so a stray noise behind cover does not pull a guard off your trail.
Per-source, per-type awareness
Every (source, sense) pair gets its own decaying track. A guard who sees and hears the same target tracks Sight and Sound independently, so a later footstep cannot downgrade an active sighting's priority or quietly drop the guard out of chase. Tracks decay, get forgotten after the configured window, and re-spotting within that window ramps from where it left off instead of starting from scratch.
Four perception senses
Vision (focused and peripheral cones, line-of-sight smoothing), Hearing (a static sound bus), Smell (persistent scent sources), and Clue discovery (static world evidence like corpses, blood, and opened doors).
AlertDirector squad coordination
Drop one on a zone root. When any guard hits Investigating, it propagates awareness to nearby guards with distance falloff and shares the last-known position. If that guard stays hot, the alert keeps re-broadcasting every 1.5 seconds so the squad actually converges instead of forgetting. Coordinated, not telepathic.
Threat priority arbitration
A guard chasing a player it can see does not stay fixated on an old corpse clue. Argus separates "how alarmed am I" from "what should I act on" with designer-tunable per-stimulus priority rules. Per-type tier caps mean a smelled corpse reaches Investigating but never Combat; only Sight or Touch can trigger a blind attack. Combat is fed by a separate channel, so a relayed squad alert raises the alarm but cannot trip an attack on a phantom.
Crouch and cover stealth
Drop StealthVisibilityHeight on the player and the guard's vision raycast aims at the player's actual sample height. Crouch behind a half-wall to clip the sightline. One bool flips it, no animation rigging required. Pair with VisionSensor.eyeHeight so the guard's eyes sit above low cover.
One-line damage hook
ApplyStimulus(Custom, position, 1.0) snaps any guard to Combat regardless of vision or LOS. Wire it into your weapon's OnHit handler, an alarm switch, an explosion VFX, anything that should make the AI react without going through cones. Use a lower intensity for alert-without-combat (a 0.7 from an alarm bell that just puts the squad on edge).
Squad search formation
When alerted, the closest responder inspects the body at a respectful standoff, then physically backs off to a perimeter slot. Other squadmates take deterministic ring positions and face outward. No huddling, no rotating-CCTV-camera spin. Each guard runs the same slot algorithm independently and they all agree on who owns which slot. Tunable ring radius, standoff distance, inspection beat, and look mode (RandomGlances default, ScanArc, ContinuousSpin legacy).
Light-aware stealth
Drop LightStealthSampler next to a guard's VisionSensor and vision builds awareness slower in shadow. Estimates brightness from scene lights (directional, spot, point with falloff and LOS to each), works in URP, HDRP, and Built-in, with no shadowmap dependency.
Drop-on detection meter
A billboarded awareness bar above each guard with tier-threshold ticks. Screenshot-readable from any angle, render-pipeline-agnostic. First-class (not demo-only) so you can ship it in your own game.
Presets and ScriptableObject tuning
Every threshold, decay rate, and dwell time lives in a SuspicionConfig asset. Ships with Vigilant and Distracted presets; drag one onto a guard to change its whole personality with no code.
HFSM + Behavior Tree core
A clean hierarchical state-machine driver plus a composable behavior-tree core (Selector, Sequence, Action, Condition leaves) underpin the stealth layer and are reusable for your own AI.
Centralized 10 Hz ticker
One driver ticks every agent, so there is no per-agent Update churn and no FindObjectsOfType scans. Sensors register to static channels and are iterated, not searched.
The asset keeps getting bigger.
Argus is a living project, not a one-off drop. Recent additions:
Drop two components, press F9, and inspect any guard live. Three awareness channels, the priority threat, every active track, and a "Why" narrative that says exactly what is rising and what is decaying.
A guard chasing a player it can see does not get pulled off by an old corpse clue. Per-stimulus priority rules and per-type tier caps so only Sight or Touch can ever trigger Combat.
StealthVisibilityHeight aims the vision raycast at the player sample height. Crouch behind a half-wall to clip the sightline. One bool, no rigging.
ApplyStimulus(Custom, pos, 1.0) snaps any guard to Combat regardless of LOS. Wire it into OnHit, an alarm switch, or an explosion. Lower intensity for alert-without-combat.
Closest responder inspects the body at a standoff, the rest fan out to deterministic perimeter slots facing outward. No huddling, no rotating-CCTV spin.
LightStealthSampler estimates scene brightness so vision builds slower in shadow. URP, HDRP, and Built-in, no shadowmap dependency.
Per-vertex shape that mirrors what the sensor actually does at each angle. PracticalNotice mode shows the radius where a centered, lit target reaches Suspicious in about 2.5 seconds, so inside the cone reads as "you will be spotted".
One feature per scene, with a per-scene README that explains what it shows, what components are involved, what to copy, and what knobs to tweak. Each one has a video in the playlist above.
Subscribe to events. Drive your own controllers.
Prefer to skip the no-code guard? The whole thing is event-driven. Listen for the state
change, flip your own behaviors. No inheritance, no base-class lock-in. The single source
of truth is agent.CurrentState.
// React to a guard's state. Nothing else required.
void OnEnable() => _agent.FsmStateChanged += HandleState;
void HandleState(FsmStateBase from, FsmStateBase to) {
switch (to.displayName) {
case "Unaware": _patrol.Enable(); _combat.Disable(); break;
case "Investigating": _search.GoTo(_agent.Awareness.LastKnownPosition); break;
case "Combat": _patrol.Disable(); _combat.Enable(); break;
}
} Four senses, one awareness model.
VisionSensor
Two-cone model: a focused cone at full intensity and a wide peripheral cone that ramps off. Distance falloff, occluder linecasts, asymmetric LOS smoothing (instant on first sight, smoothed on loss), and an optional light-based stealth hook so guards see less in the dark.
HearingSensor
Subscribes to a static sound bus. Effective radius scales with event intensity, with per-type weighting (footstep vs gunshot vs yell) and optional per-wall occlusion attenuation.
SmellSensor
Persistent-emission model. Drop a ScentSource on a corpse, campfire, or the player; scents decay over time and are blocked hard by walls. Tuned to lead to investigation, not instant alarm.
ClueDiscoverySensor
Static world evidence: corpses, blood pools, footprints, opened doors, dropped items. Wide notice cone, one-shot or persistent clues, LOS-gated. Drives guards into Suspicious or Investigating.
A live in-game debugger.
Drop ArgusDebugHud and ArgusDebugWorldOverlay into any scene,
press F9, and inspect any guard's reasoning in real time. Tab cycles guards, F9 hides.
- Three awareness channels (raw, tier-driving, combat) plotted live, so you can see what is feeding what.
- The priority threat with its cap tier, plus every active track with its own priority and combat-qualifying flag.
- A per-frame vision breakdown: distance, angle, lighting, LOS blocker, and time-to-Suspicious.
- An awareness-truthful "Why" narrative that tells you exactly why the meter is moving: "Combat channel rising because: Sight from Player", "Saturated at 1.00 from Sight", "Falling because: stimuli outweighed by decay".
- Sensor warnings that catch the trap configs (target mask is Nothing, range is zero, no SuspicionConfig assigned) before they cost you an hour.
- World overlay draws lines from the guard to its last-known position, priority threat, and squad-reported spots in the Game view.
Five states, with hysteresis where it counts.
| State | Awareness | Behavior |
|---|---|---|
| Unaware | 0.0 – 0.3 | Patrol or idle |
| Suspicious | 0.3 – 0.6 | Stop, look toward last-known position |
| Investigating | 0.6 – 0.9 | Walk to last-known position |
| Alarmed | 0.9 – 0.95 | Active search, sticky 15s dwell |
| Combat | 0.95 → exit 0.5 | Engage, ~4s persistence after LOS break |
No surprises in the box.
The detection core needs nothing but Unity itself. The optional no-code guard and demo use Unity's AI Navigation, which installs automatically. If your project runs Unity 6, Argus runs.
Get it on the Asset StoreArgus is a perception, suspicion, and alerting toolkit, not an all-in-one template. It does not include a visual graph editor, a combat or weapon system, or required character art (a CC0 animated demo is included). You bring your own attack logic and art, and connect them through events. I would rather you know that up front than refund later.
Questions, answered.
Does Argus move my enemies for me?
Only if you want it to. The core is a pure observer: it works out what a guard sees and suspects, then raises events, and your character keeps control of movement. If you would rather not write that glue, drop on the no-code ArgusGuard and it drives patrol, investigate, search, and chase on a NavMeshAgent for you.
How do I add it to a new enemy?
Two ways. No code: drop ArgusGuard on a character with a NavMeshAgent and sensors, assign a SuspicionConfig (or a shipped preset), and wire its UnityEvents. No scripting. Full control: implement a two-method interface and drive your own controller from the events.
Can I tune guard personalities?
Yes. Behavior lives in a SuspicionConfig asset: thresholds, decay, forget time, hysteresis, dwell. Argus ships Vigilant and Distracted presets, or make your own and drag it onto a guard. No code changes needed.
Is the source included?
Full, readable C# source. No compiled DLLs, no obfuscation. Inline tooltips explain the reasoning behind every default, and a README documents the whole architecture.
Can I break a chase by running behind the guard?
No. In Combat the guard pursues your live position, so you have to genuinely break line of sight and open distance to escape. It is tunable, and you can switch it off if you prefer.
Ship the stealth game you've been sketching.
Full source, a ready-to-play demo, and a developer who actually answers.