Gegner-KI
Für die Gegner KI haben wir uns entschieden, das von Unity integrierte System NavMeshAgent
zu verwenden. Damit lassen sich Hindernisse automatisch umgehen, Pfade effizient berechnen und Bewegungen flüssig animieren. Außerdem ist es performant und gut mit Unitys Physik Engine kompatibel.
Mit "KI" meinen wir hier keine lernfähige künstliche Intelligenz, sondern eine klassische, regelbasierte Logik, wie sie in den meisten Spielen verwendet wird.
NavMesh-Erstellung zur Laufzeit
Damit der NavMeshAgent
funktioniert, benötigt man ein sogenanntes NavMesh
, also eine begehbare Fläche, auf der sich Gegner bewegen können. Normalerweise wird das NavMesh im Editor gebacken, da diese Operation sehr rechenintensiv sein kann. Allerdings wird unser Dungeon zur Laufzeit generiert, weswegen das NavMesh ebenfalls zur Laufzeit erstellt werden muss.
Dafür verwenden wir ein eigenes Skript:
public class BakeNavMesh : MonoBehaviour
{
private NavMeshSurface surface;
private void Start()
{
surface = GetComponent<NavMeshSurface>();
}
public void BuildNavMesh()
{
surface.BuildNavMesh();
}
}
Sobald alle Räume platziert sind, wird dieses Skript aufgerufen und das NavMesh automatisch erstellt.
Wegpunkte generieren
Für Gegner benötigen wir Wegpunkte innerhalb des Dungeons, damit ein Pfad generiert werden kann. Dazu triangulieren wir das NavMesh und wählen zufällig Punkte aus.
public void CreateNewWayPoint()
{
NavMeshTriangulation triangulation = NavMesh.CalculateTriangulation();
NavMeshHit hit;
while(wayPoints.Count < numberOfWayPoints)
{
int VertexInt = Random.Range(0, triangulation.vertices.Length)
if(NavMesh.SamplePosition(triangulation.vertices[VertexIndex], out Hit, 20f, 11))
{
wayPoints.Add(Hit.position)
}
}
}
Abbild: Trianguliertes Navmesh
Gegner Verhalten & Angriff
Je nach Gegnertyp verwenden wir eigene KI-Klassen (z.B. Nahkämpfer oder Fernkämpfer), die sich im Verhalten unterscheiden - etwa bei Lebenspunkten, Angriffsradius oder Animationen. Die Gegner reagieren auf den Spieler, sobald er sich im Sichtfeld befindet. Für die Sichtprüfung verwenden wir Raycasting, um festzustellen, ob sich der Spieler innerhalb einer bestimmten Reichweite und Blickrichtung befindet.
Gegner-Skalierung mit Animation Curves
Um Gegner dynamisch an den Spielfortschritt anzupassen, verwenden wir Animation Curves
, mit denen sich Statuswerte wie Leben, Schaden und Geschwindigkeit pro Dungeon-Etage skalieren lassen. Jede dieser Kurven beschreibt, wie ein bestimmter Wert sich im Laufe der Spielzeit verändert. Zum Beispiel kann das Leben eines Gegner bei niedrigen Etagen nur leicht ansteigen, aber in höheren Etagen exponentiell zunehmen.
Die Kurvenwerte werden dann beim Platzieren eines Gegners ausgelesen.
Vorteil: Änderungen am Balancing können direkt über die Kurven im Unity-Editor vorgenommen werden