Im vorherigen Schritt des Unity 3D Tutorials haben wir verschiedene interaktive Objekte in der Szene platziert. Darunter ein Pressure Pad, das mit einer Tür verlinkt ist. Sobald sich der 3D Character auf diesem Pad befindet, wird die Tür geöffnet. Zudem wurde eine bewegliche Plattform hinzugefügt. Die Bewegung wurde in der entsprechenden Komponente mit dem Start- und Zielpunkt definiert.
In diesem Abschnitt lernst du, wie du Gegner zur Szene hinzufügst. Diese sollen natürlich nicht nur in der Szene platziert werden, sondern sich später in der 3D Anwendung dynamisch bewegen. Das lässt sich über das sogenannte Pathfinding in Unity integrieren. Aber starten wir zunächst mit dem Importieren von Gegnern in unserem Level.
Übersicht Unity 3D Tutorial
1/12 – Einrichtung und Installation
2/12 – 3D Character hinzufügen
3/12 – Level Design (Whiteboxing)
4/12 – Level mit Assets erstellen
5/12 – Lighting (Licht erstellen)
6/12 – Interaktive Objekte erstellen
7/12 – NPC, Gegner und Pathfinding erstellen (aktueller Artikel)
8/12 – User Interface mit Lebensanzeige
9/12 – Neustart mit Respawn Funktion
10/12 – Scene und Level wechseln
11/12 – Postprocessing und Kamera Effekte
12/12 – Hauptmenü erstellen und Export Anwendung
Gegner zur Szene hinzufügen
Um Gegner in der 3D Anwendung hinzuzufügen, verwenden wir Prefabs aus dem 3D Gamekit. Navigiere dazu in den Ordner 3D Gamekit -> Prefabs -> Characters -> Enemies. Dort findest du weitere Unterordner, die unterschiedliche Gegner darstellen. Es gibt Chomper, Grenadier und Spitter, die verschiedene Eigenschaften besitzen. Füge doch einmal den Chomper per Drag and Drop an einer beliebigen Stelle in der Szene hinzu.
Gegner in Szene importieren
Wenn du das GameObject Chomper in der Hierarchie selektierst, wirst du feststellen, dass es bereits sehr viele Komponenten gibt. Darunter verschiedene Skripte wie Chomper Behavior, Damageable oder Replace With Ragdoll. Teste doch gleich einmal die Anwendung mit dem Play-Button. Ist die Entfernung zum Gegner sehr groß, befindet er sich im Ruhemodus (Idle). Nähert sich der Character, so sollte der Gegner den Player attackieren. Das funktioniert allerdings bisher noch nicht und es erscheint auch eine Fehlermeldung in der Konsole. Dafür müssen wir noch ein paar Einstellungen vornehmen.
NavMeshSurface beim Gegner hinzufügen
Wir haben noch das Problem, dass der Gegner den Spieler nicht attackiert. Für jeden Gegner, der den Character erkennt, muss dessen Position als Zielposition festgelegt sein. Denn der Gegner soll schließlich den Character attackieren und dafür wird auch dessen Position benötigt. Der Character hat allerdings bereits die Möglichkeit den Gegner zu attackieren und zu zerstören.
Um die Zielposition festlegen zu können, müssen wir noch ein sogenanntes NavMesh erzeugen. Wähle dazu den Untergrund aus. In unserem Unity 3D Tutorial ist das die Plane. Anschließend veränderst du den Layer von 16: Environment auf 22: Terrain. Diese Einstellung ist später für die Berechnung des NavMesh wichtig. Zusätzlich fügst du in diesem GameObject über Add Component die Komponente NavMeshSurface hinzu. Darin findest du den Agent Type. Diesen kannst du auf Chomper ändern. Außerdem wollen wir die Include Layers lediglich auf Environment und Terrain anpassen. Damit wird definiert, auf welcher Oberfläche sich die Gegner bewegen können.
NavMeshSurface in Umgebung
Pathfinding NavMesh erzeugen
Nun ist es wichtig das sogenannte Baking des Navigation Mesh auszuführen. Du kannst dir das Ganze so vorstellen, alle Layer und alle Oberflächen, auf denen sich der Gegner bewegen darf, müssen berechnet werden. Dadurch wird definiert, ob eine Bewegung möglich ist. Beispielsweise auf Basis der Höhe oder ob ein bestimmter Bereich erreichbar ist. Für das Pathfinding werden bewegliche Objekte wie Gegner auch als NavMeshAgent bezeichnet. Der Untergrund, auf dem sie sich bewegen, heißt NavMesh. Um dieses zu erstellen, gibt es den Button Bake.
NavMesh in Unity erstellen
Nachdem du den Button Bake geklickt hast, sollte nach kurzer Zeit der Untergrund blau eingefärbt sein. Das kennzeichnet den Bereich, der für die NavMeshAgents erreichbar ist. In der oberen Abbildung findest du beispielsweise auch Bereiche, die nicht erreichbar sind und dadurch auch nicht blau eingefärbt werden. Wenn neue Objekte in der Szene hinzugefügt oder auch bestehende verschoben werden, dann muss das NavMesh erneut berechnet werden. Das ist sehr wichtig. Jetzt kannst du das Ganze mit dem Play-Button testen. Wenn du dich dem Gegner näherst, sollte er den Character attackieren und ihn auch verfolgen. Teste das doch gleich mit mehreren Gegnern.
Hinweis: Mit dem ultimativen Unity Cheat Sheet erhältst du einen detaillierten Überblick über Tipps & Tricks mit dem Umgang von Unity. Sichere dir jetzt das Cheat Sheet, um deine Anwendungen noch einfacher und effektiver erstellen zu können!
Pathfinding NavMesh anpassen
Wir haben im letzten Schritt das NavMesh berechnet, wodurch sich die Gegner frei bewegen können. Vielleicht ist es aber auch notwendig, dass Bereiche definiert werden müssen, die für Gegner nicht begehbar sind. Wie das genau geht, zeige ich dir jetzt…
Im Unity 3D Tutorial gibt es das Dropship. Hier könnten wir zum Beispiel definieren, dass dieser Bereich für die Gegner nicht betretbar ist. Dafür gibt es das GameObject NavMesh Modifier Volume. Klicke dazu auf das Plus in der Hierarchie und wähle AI -> NavMesh Modifier Volume. Anschließend wird ein Volumen erstellt, mit dem wir diesen Bereich definieren können. In der unteren Abbildung siehst du diesen Bereich.
Zudem ist es wichtig in der Komponente bei Area Type Not Walkable einzustellen. Denn wir wollen verhindern, dass die Gegner sich darin bewegen. Bei Affected Agents hast du außerdem die Möglichkeit einen bestimmten Gegner auszuwählen. Ich lasse das vorerst bei All. Und ein wichtiger Punkt ist der Layer. Hier musst du Terrain verwenden, da ansonsten das Volumen nicht bei der Erstellung des NavMesh berücksichtigt wird.
NavMesh in Unity anpassen
Sobald du alle Einstellungen durchgeführt hast, ist es wichtig das NavMesh zu aktualisieren. Denn aktuell können sich die Gegner weiterhin darin bewegen. Klicke einfach auf den Untergrund und starte die Berechnung mit Bake neu. Danach sollte der Bereich nicht mehr blau eingefärbt sein.
Pathfinding testen
Nachdem soweit alles hinzugefügt wurde, kannst du die Anwendung mit dem Play-Button testen. Laufe einfach auf den Gegner zu, sodass er dir folgt und bewege dich in den vorhin definierten Bereich. Sobald du dich darin befindest und der Gegner dich nicht attackieren kann, halte die Anwendung mit dem Pause-Button an und wechsle zur Scene View. Anhand der blauen Markierung beim Gegner ist zu sehen, dass er den Character erkannt hat. Durch das Volumen ist jedoch eingestellt, dass er es nicht begehen kann. Somit funktioniert das eingestellte Pathfinding.
NavMesh in Unity testen
Im nächsten Schritt werden wir ein User Interface mit einer Lebensanzeige integrieren. Denn aktuell wird das nach einer Attacke der Gegner nicht angezeigt.