Sprache auswählen

UE4IconMit dem Voranschreiten in meinem Spieleprojekt Espionage, stoße ich auch ständig auf neue Herausforderungen, die ich mit Blueprints meistern will. In diesem Zusammenhang hab ich mir kürzlich Gedanken zu einem NPC-Patroulliensystem mit Wegpunkten gemacht. Allerdings sollte das Wegsystem einigermaßen flexibel sein, so dass es für verschieden komplizierte Wegpunktpfade eingesetzt wwerden kann. Wie ich das in Blueprints umgesetzt habe, findet ihr in folgendem Artikel.

Soweit ich über Wegpunktesysteme in Unreal Engine im Internet nachlesen konnte, waren diese alle auf dem Ansatz aufgebaut, dass in den Level ein Wegmarker hinzugefügt wurde, der nicht dargestellt ist, aber für den NPC als Ziel seiner Bewegung dient. Basierend auf diesem Ansatz und einiger Tutorials auf Youtube (unter anderen dieses hier AI Navigation Tutorial) zu dem Thema, hatte ich ein Verständnis davon wie ich grundsätlich einen Wegmarker für einen NPC platziere und über einen Blueprint die Bewegungsabfolge steuere. 

Bild 1: Blueprint des AI kontrollierten NPCs. Die Variable Waypoint1 enthält das Objekt zu dem der NPC als nächstes aufen wird. Die Cst*-Events sind für zukünftige Änderungen geplant, so dass der NPC auch nach Levelstart noch getriggert werden kann ( z.B. Spieler kommt in Sicht oder Alarm ausgelöst)

 

Allerdings tendiere ich grundsätzlich dazu meine Lösungen soweit generisch zu halten, dass ich diese später in unterschiedlichtsen Situationen wiederverwenden kann. Deswegen wollte ich das ganze im R

ahmen meines Spiels Universum: Espionage auch so lösen, dass ich nicht bezüglich der Patrouillenmuster eingeschränkt bin. Damit meine ich, dass ich keine EInschränkung der Form, dass der Pfad maximal 5 Wegpunkte haben kann, hinnehmen muss. Aus diesem Grund wollte ich ein Wegpunktesystem für meinen NPC, das prinzipiell beliebig viele Wegpunkte verarbeiten kann.

Der intuitive erste Ansatz war deswegen, dass ich dem NPC über eine Variable in den Blueprint eine Liste aller seiner Wegpunkte mitgeben. Diese Liste würde dann im Blueprint iteriert und der NPC bewegt sich entsprechenden der Sortierung in der Liste von einem Wegpunkt zum anderen. Allerdings stieß ich dabei schnell auf mein erstes Problem, wie ich einem Blueprint in einer Variablen eine Liste von Actor-Objekten mitgeben kann. Denn das sind die Wegpunkte letzten Endes, Actor-Objekte. Im Kontext von Unreal Engine handelt es sich dabei um Actoren, die nicht dargstellt werden. Außerdem war ich dann im Patrouillenweg festgelegt. D.h. ich konnte nicht dynamisch auf Gegebenheiten an einem Wegpunkt reagieren. 

Bild 2: Blueprint zur Umsetzung der Wegpunktlogik. Der Blueprint wird bei Überschneidung von Character und Wegpunkt-Collisionbox getriggert und läßt damit den NPC zum nächsten Wegpunkt laufen.

Deswegen kam mir ein zweiter Gedanke,den ich letzten Endes umgesetzt habe. Ich realisierte ein System von referenzierenden Wegpunkten. Das bedeutet, dass ein Wegpunkt an sich nur sich selber und einen Verweis auf den nächsten anzulaufenden Wegpunkt kennt. Der NPC bekommt zu Beginn eine Referenz auf seinen ersten anzulaufenden Wegpunkt. Mittels "AI move to Location" lässt sich der NPC im Blueprint an sein Ziel bewegen. Am Wegpunkt angekommen, wird der Blueprint des Wegpunktes durch ein BeginCollisionOverlap-Event ausgelöst. Dieser Blueprint setzt für den NPC mittels "AI move to Location" ein neues Ziel. Damit lassen sich beliebig komplexe Patrouillenwege realisieren. Selbst eine Verwzeigung mittels modifizierten (z.B. Verzweigungswegpunkten) Wegpunkten lassen sich damit umsetzen.

Dieses Verfahren setze ich nun in meinem Spiel zunächst für NPCs mit festen Pfaden ein. Die nächste Aufgabe wird dann NPC-Bewegungen mit zufälligen Patrouillenwegen sein, aber dazu gibts dann einen extra Artikel.