Enemy NPC mit Finite State Machine

Mein Code auf Github
Das AgentBehaviour steuert einen eigenständigen KI-Gegner, der auf einem NavMeshAgent basiert und mehrere Wahrnehmungskanäle kombiniert, um glaubwürdiges Verhalten zu erzeugen. Der NPC bewegt sich auf dem NavMesh, wechselt zwischen verschiedenen Verhaltenszuständen wie Idle, Patrouille, Verdacht, Verfolgung und Angriff und nutzt dazu eine eigene StateMachine, die durch einen Detection Manager gespeist wird. Körperhaltung und -ausrichtung werden dabei über separate Rotationsmethods für Beine, Torso, Kopf und Arme gesteuert, sodass der Gegner nicht nur logisch, sondern auch visuell nachvollziehbar reagiert.
Kernstück des Systems ist ein mehrkanaliges Wahrnehmungsmodell: Der Agent nimmt das Ziel über „Sehen“, „Fühlen“ und „Hören“ wahr. Für den Sichtkanal werden mehrere Kegel (nah, zentral, peripher) ausgewertet, die jeweils einen Multiplikator für die Sichtstärke liefern. Befindet sich der Spieler in Reichweite und wird es nicht durch Objekte verdeckt, steigt ein „Sicht-Meter“ kontinuierlich an, abhängig von Distanz, Zone und Raycast-Sichtlinie. Für sehr kurze Distanzen existiert zusätzlich ein „Fühl“-Kanal, der ähnlich funktioniert. Über das Sound-System empfängt der Agent außerdem Ereignisse von außen und berechnet aus Position, Reichweite und Basisintensität eines Geräusches eine gehörte Lautstärke, die wiederum ein „Hör-Meter“ ansteigen lässt. Alle drei Kanäle besitzen Schwellenwerte, die die Wahrnehmung in vier Stufen einteilen: keine Wahrnehmung, passive Verdachtsmomente, aktive Verdachtslage und volle Zielerkennung.
Der Detection Manager übersetzt die Wahrnehmungsdaten in Zustände mit Gedächtnis (None, PassiveSuspicion, ActiveSuspicion, DetectionMemory, DetectingTarget plus deren Memory-Varianten) und gibt damit direkt vor, welche Agent-States aktiv sind und wie der NPC sich verhält. Steht der Detection Manager auf None, liegen keine relevanten Wahrnehmungen vor: Die StateMachine wählt je nach Grundauftrag entweder Stay, der NPC bleibt an seiner Wache- oder Startposition, oder Patrol, in dem er definierte Wegpunkte abläuft und sich ansonsten nicht auf den Spieler bezieht. Wechselt der Detection Manager in PassiveSuspicion oder PassiveSuspicionMemory, wird der Agent-State SuspectPassively aktiv: Der NPC bleibt in seinem Umfeld, richtet Kopf und Oberkörper auf die vom Detection Manager verwaltete Suspicion-Position und signalisiert so erhöhte Wachsamkeit. Stuft der Detection Manager die Lage als ActiveSuspicion ein, geht der Agent in den State SuspectActively über: Die Suspicion-Position wird nun als konkreter Verdachtspunkt behandelt, und ein hemisphärischer Positionsprüfer liefert erreichbare BestSpots rund um diese Position, zu denen der NPC aktiv hinläuft, um von dort aus Sichtkontakt zu bekommen. Sobald der Detection Manager DetectingTarget meldet, kennt er die aktuelle Position des Spielers zuverlässig; daraus resultiert abhängig von der Distanz entweder ein Annäherungsverhalten oder ein Angriffsverhalten: Außerhalb der effektiven Reichweite wird der NPC im Sinne von „ApproachTarget“ offensiv auf den Spieler zulaufen, innerhalb der Reichweite richtet er seine Waffe auf das Ziel, bleibt in dieser Kampfpose und löst über diesen Zustand die Schusslogik des Gun Scripts aus. Treffer durch die Waffe des Spielers fließen direkt zurück in den Detection Manager, setzen das Sicht-Meter sofort auf 100 Prozent, erzwingen DetectingTarget als Detection-Level und treiben damit im nächsten Frame automatisch die zugehörigen Verfolgungs- oder Angriffsreaktionen an. Sollte der NPC den sichtkontakt zum Spieler verlieren, wechselt er zum Zustand DetectionMemory. In diesem  weiß er die letzte bekannte Spielerposition noch für eine begrenzte Zeit und erzwingt den Agent-State ChaseTarget: Der NPC bewegt sich gezielt auf diese Position zu, um den verlorenen Kontakt wiederherzustellen. 
Ein weiterer wichtiger Baustein ist die Navigation und lokale Kollisionsvermeidung. Die Zielpositionen werden nicht blind gesetzt, sondern unter Berücksichtigung der Aufenthaltsorts des  NPCs und des Spielers. Befinden sich beide im selben Areal, nutzt der Controller direkte NavMesh-Ziele auf die Spielerposition, um Kosten zu minimieren. Befinden sie sich in unterschiedlichen Bereichen, kommt der Positionssweeper zum Einsatz, der sinnvolle Positionen mit sichtlinie sucht. Zusätzlich implementiert der Controller eine lokale vermeidung sowohl gegenüber anderen Agents als auch gegenüber dem Spieler selbst. Mithilfe einer OverlapSphere und stochastisch festgelegter Prioritäten entscheidet die NPCs selbst, welcher ausweicht und welcher ungehindert seiner Route folgt.  
Abgerundet wird das System durch eine einfache Animationsanbindung, ein Schadens- und Todesmodell sowie Audio Cues. Die aktuelle Geschwindigkeit des NPCs wird genutzt, um die Geh-Animationen der Beine zu steuern, inklusive einer Skalierung der Abspielgeschwindigkeit je nach Bewegungstempo. Eingehender Schaden reduziert die Lebenspunkte des Agents und triggert Treffer-Sounds; bei Erreichen von null Lebenspunkten werden Collider und sichtbare Teile deaktiviert, ein Todessound sowie Partikel-Effekte abgespielt und das Objekt nach einer konfigurierbaren Verzögerung vollständig deaktiviert. Während der direkten Zielerkennung kann der Agent außerdem in bestimmten Intervallen Callout-Geräusche auslösen, anderen NPCs die Position des Spielers zu kommunizieren.
Insgesamt beschreibt dieser Controller also eine modulare KI, in der Wahrnehmung, Detektionslogik, StateMachine, Navigation, Körperhaltung und audiovisuelle Rückmeldung klar getrennt sind, sich aber gegenseitig beeinflussen. Dadurch entsteht ein Gegner, der nicht nur funktional korrekt auf den Spieler reagiert, sondern dessen innere Zustände – vom leichten Verdacht bis zur aggressiven Verfolgung – durch Bewegung, Ausrichtung und Sound auch für die Spielenden intuitiv lesbar werden.