[Unreal Engine 4] SAS - Smart AI System

KAEPS133

Freizeitschrauber(in)
Hallo,

aktuell bin ich in den Vorbereitungen zu meinem neuen Spiel. Revenge: Rhobar's myth werde ich Voraussichtlich im Frühjahr fertig gestellt haben. Da ich mittlerweile die Mittelalter Assets nicht mehr wirklich sehen kann,aber die Motivation und Qualität bei Revenge weiterhin hoch halten möchte habe ich mit den Vorbereitungen für mein neues Spiel begonnen.

Mein neues Projekt ist ein Agenten Taktik Shooter – ein inoffizieller Nachfolger von Project IGI. Der Grundsätzliche Code ist schon vorhanden und Funktioniert schon.Aber darum geht es in diesem Thread gar nicht. Wie man am Titel möglicherweise erkennen kann geht es um die Künstliche Intelligenz.

SAS_Logo.png


Beschreibung der KI:
Die KI muss vornehmlich in offenen Gelände und Militärbasen funktionieren.Innenräume sind in kleiner Größe und geringer Anzahl vorhanden.Einem Soldaten kann im Editor eine Route gegeben werden inklusive Standorte wo für eine angegebene Zeit Wache gehalten werden soll.Dazu soll die KI jederzeit möglich sein auf Optische Ereignisse sowie Geräusche zu reagieren. Bei Geräuschen soll grob am Ursprungsort des Geräusches gesucht werden, ebenso nachdem die Sicht zum Spieler unterbrochen wurde. Jeder Gegner hat einen unterschiedlichen Level an Mut, wird dieser unterschritten wird gewürfelt was massiert.
a) Richtung Spieler Stürmen
b) in Deckung gehen/warten und nach Verstärkung rufen → alle die das hören kommen
c) versuchen einen Alarmschalter zu erreichen und globalen Alarm auslösen

Die KI soll so selbständig wie möglich reagieren und bis auf die Eingabe einer Route keinerlei Scripts erhalten um so dynamisch auf die unterschiedlichen Lösungsmöglichkeiten wie möglich zu reagieren.


Technische Daten:

Engine: Unreal Engine 4.9.2

AI States:
- Guard
- Patrol
- Search
- Attack
- Scared
- DEAD

Screenshots:

AI Test Map, in Grün das Nav-Mesh für die KI:
DEV_AI.PNG

Einfacher versuch um eine Deckung zu suchen:
SearchCover.PNG

Videos:
https://www.youtube.com/playlist?list=PLzHULi7L-HUJDHe1Bk1V1jfEzDXxJNx-p

Downloads:
– / –

Version:
0.6a(24.10.2015)


Aktueller Stand:
- die KI wechselt zuverlässig zwischen den einzelnen States
- das Sehen und Hören funktioniert zuverlässig, dazu wird auf Treffer vom Spieler reagiert
- das Suchen und Angreifen funktioniert
- die KI hat ein Mut-Level System, ist ein Bot verängstigt durch Beschuss und/oder Treffer ruft dieser Verstärkung


Sinn und Zweck:
Mir ist bewusst das mit den aktuellen Informationen das ganze noch ziemlich schwer vorzustellen und zu diskutieren ist. Aufgrund von anstehenden Prüfungen und Hardwareproblemen bin ich im Januar sehr eingeschränkt in meinen Möglichkeiten. Diese Zeit möchte ich aber nutzen um ein wenig Brainstorming zu betreiben. Da mir unter Garantie nicht alle Zustände (direkt) einfallen, möchte ich hier einfach alle möglichen Ideen sammeln was ich machen kann/muss bzw. beachten müsste. Haut einfach alles mögliche raus was euch zu einer guten KI einfällt die in diese Richtung von Spiel passen könnte. Ich werde den Thread regelmäßig mit Bildern, Videos und Downloads updaten.


Bis dahin schon mal vielen Dank!
 
Zuletzt bearbeitet:
Die Idee gefällt mir sehr gut, was man beachten sollte: - KI sollte zusammenarbeiten - also zusammenstürmen -aus verschiedenen Richtungen kommen um den Spieler einzukreisen also einer von vorn einer von links usw. (So etwa wie bei Watch_Dogs)

Nicht 10 min hinter gleicher Deckung stehen

Vielleicht fällt den anderen noch was ein.
 
In der Unreal Engine kann man im Blueprint ein Pawn Sensing Component hinzufügen. Da kann man Sichtradius sowie Winkel, die Reichweite des Gehörs und die akzeptierten Lautstärken festlegen.

Und daraus wird dann jeweils ein OnSeePawn oder OnHearNoise getriggert. Von da an geht es dann je nach Wunsch weiter.

PawnSensing.PNG

Ich arbeite aktuell auch nur in Blueprints da eine KI im Visuellen Programmieren und Debuggen doch deutlich 'einfacher' zu realisieren ist als in C++. Deswegen kann ich dir noch nicht sagen wie das in C++ aussieht, dürfte aber vom Prinzip nicht viel anders sein.

Wie jetzt das Sehen und Hören in der Engine verankert ist - keine Ahnung. Aber deswegen benutze ich ja auch 'fertige' Engines da ich mich mit sowas nicht unbedingt rumschlagen möchte.

|-----------------|

Habe jetzt mal 2 Screenshots hinzugefügt. Ein mal die Map auf der ich das teste und meine ersten versuche um Deckung zu finden (konnte ich aber noch nicht richtig testen).
Die Stellen die als Deckung dienen können sind im Editor als COVER_NODE gekennzeichnet und werden aktuell von mir noch von Hand gesetzt. Dazu habe ich die KI mal vom TICK entkoppelt. Bis vorhin war die KI mit höherer FPS Zahl deutlich schneller im reagieren.

Jetzt wird alle 0.1 Sekunde das State geprüft und vielleicht gewechselt. Die Sensing Component aktualisiert sich alle 0.25 Sekunden. Ich möchte die Werte noch so groß wie möglich bekommen ohne das es auffällt, denn das wird bei ~20 Bots gleichzeitig sehr auf lasten der CPU gehen.
 
Zuletzt bearbeitet:
So ich hab mal weiter an der KI gefummelt. Das suchen von 'Deckung' funktioniert soweit, ist in die Logik aber noch nicht eingebunden. Dabei wird aktuell einfach der nächste Cover_NODE gesucht, ob da jetzt ein Objekt da ist das Deckung bieten könnte wird noch gar nicht berücksichtigt. Es ist im Prinzip ein dazwischen geschobener Wegpunkt.

Wenn der Bot von einer kugel getroffen wird ändert sich der Status auf SEARCH und der Bot geht in die Richtung aus dem der Schuss gekommen ist. Der Status wird dann nach 15-25 Sekunden zurückgesetzt sofern kein neuer Treffer, Geräusch oder Sichtkontakt passiert. Die Zeitspanne wie lange der Status bleibt muss dann in einer richtigen Map getestet werden. Dazu habe ich noch unnötige Überprüfungen aus der Dauerschleife genommen, die Wegpunkte Ressourcen schonender gestaltet (Die wegpunkte rufen den BOT in 1 Sekunden Intervallen zu sich, der Bot geht von sich aus zu keinem Wegpunkt) wodurch ich die Performance jetzt schon deutlich besser ist.

Ein Performance Problem habe ich auch schon gefunden, erklären kann ich es aber noch nicht. Wenn ich eine Route anlege und der Letzte Routen mit der ID-5 als nächsten Knoten den mit ID-0 hat, sprich den Kreis schließt und der Knoten 5 auf "Bleib hier für X Sekunden" steht gibt es einen kurzen Mikroruckler. Hat der letzte Knoten nicht die Information das der Bot hier warten soll läuft alles bestens. Wenn man das weiß lässt sich das leicht vermeiden, warum es aber so ist weiß ich bis jetzt noch nicht.

Zum Wochenende hin sollte ich auch wieder einen kompletten PC haben, dann sollte das erste Video auch nicht mehr lange auf sich warten lassen.
 
So mal ein kleines Update. War die letzte Zeit leider sehr beschäftigt mit lernen und meinem anderen Projekt. Jetzt geht es aber auch hier mal wieder weiter.

Ich habe ein wenig am Waypoint-System gearbeitet:
Nodes.PNG
Das ganze ist jetzt einfacher zu erkennen und man sieht auch besser wie die Route verläuft. Rechts im roten Kasten ist alles was man zum erstellen einer Route benötigt. Sollte vom Aufbau relativ selbsterklärend sein. Das schöne an dem ganzen System ist, das das im Prinzip alles ist was die KI benötigt. Man setzt, falls gewünscht, eine Route zum patrouillieren mit ganz groben Eckpunkten und die KI sucht selbst den kürzesten Weg. Die Treppe im Vordergrund braucht dann eben keinen Node unten und oben. Wobei bei einer Treppe das noch zu verschmerzen wäre, richtig toll wird das wenn die KI aus einem Gebäude raus ins Frei wandern soll oder umgekehrt. Der passende Weg durch Räume und Türen wird dann selbst gesucht.

Das ganze Funktioniert auch schon sehr zu verlässlich. Ich werde dann noch blaue CoverNodes und rote AlertNodes einbauen und dann ist die gesamte Wegfindung der KI abgeschlossen.
 
So endlich kann ich hier mal wieder ein kleines Update bringen.

Die letzten Wochen und Monate habe ich vor allem damit verbracht um die KI rum ein komplettes Spiel zu bauen. Da ich einfach gemerkt habe das es wahnsinnig schwer ist eine KI zu testen und zu Balancen wenn man nicht richtig mit der Spielen kann. Dazu habe ich nun einen voll funktionsfähigen, sehr anspruchsvollen Taktikshooter gebaut der schon 2 1/2 'fertige' Maps besitzt.

Die KI habe ich soweit angepasst das jeder Bot ein individuelles Mut-Level hat. Das sinkt durch Beschuss/Treffer, ist es unterschritten gibt es 3 Möglichkeiten die dann ausgewürfelt werden.
Der Bot stürmt in aller Verzweiflung den Spieler oder sucht die nächstbeste Deckung und ruft nach Verstärkung und alarmiert alle Bots in Hörweite. Beide sind schon umgesetzt, haben aber noch so ein paar Probleme und sind derzeit deaktiviert.
Die 3. Möglichkeit ist momentan die einzige die immer ausgewählt wird. Da sucht der Bot den nächsten Alarmknopf und schlägt globalen Alarm.

Da gehen dann alle Wachen zu ihren zugewiesen Hotspots (die sammeln sich an zentralen stellen) und fangen an zufällig rum zu wandern und nach dem Spieler zu suchen. Nach ein paar Minuten wird der Alarm wieder aufgehoben und die Bots gehen wieder ihren normalen Tätigkeiten nach. Das funktioniert soweit auch schon wunderbar, ich muss aber noch mit den Zeitbereichen für die Zufälligkeit spielen.

Video, Bilder, Spielankündigungen und eine closed Alpha kommt in kürze :)
 
Möglichkeit 3 erinnert mich ein wenig an MGS ;)

Klingt auf jeden Fall sehr interessant. Freu mich schon auf weitere Infos.
 
Nach längerer Funkstille mal ein paar neue Infos.

Ich habe in den letzten Wochen und Monaten sehr viel rumprobiert. Mein erster Anlauf war so ein hybrid zwischen Stackmachine und Statemachine. Das hat soweit ganz gut funktioniert, hatte aber so ein paar Probleme beim Wechseln der Zustande und die KI hat ab und zu "gezuckt" da der Zustand bei jedem Tick gewechselt wurde. Das lag an der Stackmachine die im Hintergrund gelaufen ist und den Zustandswechsel angestoßen hat.

Daraufhin hab ich einen Versuch mit einer reinen Stackmachine versucht - was eine Katastrophe :ugly:
Das war für normales Rumlaufen und interagieren mit anderer KI ziemlich cool, sobald dann unplanmäßige Ereignisse wie das reagieren auf den Spieler hinzu gekommen sind wurde es ganz schrecklicher Code und es war nahezu umwartbar.

Seit ein paar Tagen bin ich nun an einer reinen Statemachine dran und das scheint auch wunderbar zu funktionieren. Zwischen den Hauptzuständen wechselt die KI zuverlässig und ohne Bugs. Jetzt fehlen noch die kleineren Zwischenzustände, der Wechsel dazwischen funktioniert aber genau so wie zwischen den Hauptzuständen und sollte keine so große Probleme verursachen. Da das jetzt auch der 3. Anlauf für die KI ist, verwende ich auch endlich Vererbung in den Blueprints und der Code ist unfassbar kurz und übersichtlich.

Ich denke am Wochenende mache ich mal ein Video. Langsam nimmt es eine super Form an! :)
 
Wie versprochen 3 Videos:

Eingebundener Inhalt
An dieser Stelle findest du externe Inhalte von Youtube. Zum Schutz deiner persönlichen Daten werden externe Einbindungen erst angezeigt, wenn du dies durch Klick auf "Alle externen Inhalte laden" bestätigst: Ich bin damit einverstanden, dass mir externe Inhalte angezeigt werden. Damit werden personenbezogene Daten an Drittplattformen übermittelt.
Für mehr Informationen besuche die Datenschutz-Seite.
Eingebundener Inhalt
An dieser Stelle findest du externe Inhalte von Youtube. Zum Schutz deiner persönlichen Daten werden externe Einbindungen erst angezeigt, wenn du dies durch Klick auf "Alle externen Inhalte laden" bestätigst: Ich bin damit einverstanden, dass mir externe Inhalte angezeigt werden. Damit werden personenbezogene Daten an Drittplattformen übermittelt.
Für mehr Informationen besuche die Datenschutz-Seite.
Eingebundener Inhalt
An dieser Stelle findest du externe Inhalte von Youtube. Zum Schutz deiner persönlichen Daten werden externe Einbindungen erst angezeigt, wenn du dies durch Klick auf "Alle externen Inhalte laden" bestätigst: Ich bin damit einverstanden, dass mir externe Inhalte angezeigt werden. Damit werden personenbezogene Daten an Drittplattformen übermittelt.
Für mehr Informationen besuche die Datenschutz-Seite.

Den Startpost habe ich auch etwas angepasst und die Playlist hinzugefügt.
 
Zurück