Zum Hauptinhalt springen

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.

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.

Navmesh

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)
}
}

}



Triangulation 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.

Enemy

Sichtfeld

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

AnimationCurve