Kann man eine KI/NPC auch ohne Navmesh bewegen?

  • Hi zusammen.


    Kennt sich jemand zufällig mit NPCs und Navmeshes aus?


    Ich habe nämlich folgendes Problem. Ich versuche gerade ein paar Tieren etwas Leben einzuhauchen. Dazu möchte ich sie allerdings recht frei bewegen lassen. Zum Beispiel sollen Waldtiere sich vorwiegend im Wald aufhalten, also nach vielen Bäumen suchen. Einige sollen sich auf Wiesen gerne aufhalten und wieder andere, zum Beispiel Krähen sollen auch gerne mal auf Felder gehen.


    Nun ist mein Problem aber, alle Tutorials die ich zu dem Thema finde benötigen ein Navmesh. Also selbst, wenn ich die Node GetRandomReachablePointInRadius verwende bezieht diese sich auf ein vorhandenes Navmesh. Nun möchte ich aber wie gesagt nicht zig Navmeshes auf meine Map verteilen, sondern lieber andere Kriterien nehmen als Grundlage für den Wegpunkt. Allerdings sollen die Kreaturen natürlich trotzdem nicht gegen eine Wand, Baum oder sonst was laufen. Geschweige denn Klippen runter Stürzen oder in irgendeiner anderen Form Harakiri betreiben.


    Also wie immer lange Rede gar kein Sinn... gibt es eine Alternative zu GetRandomReachablePointInRadius, die sich nicht auf ein Navmesh bezieht?

  • Hallo,


    ohne Navmesh wird es nicht funktionieren.


    Ich habe für so etwas für UNITY den A-Star-Algorithmus implementiert.


    Ich rastere die Spielfläche und setze als "Obstacle" getaggte entsprechend als zu umgehendes Hindernis.

    Ich kann dabei die "Felder" mit Kosten belegen, sprich, sie nicht als erste Wahl für den jeweiligen Character ausweisen.

    Ich habe je nach Anforderung die Funktion zum Erstellen des Rasters angepasst, so dass bestimmte Felder für Character 1 begehbar waren, für C2 jedoch nicht.


    Funktioniert wunderbar und lädt zum Experimentieren ein...


    Es wird den Algorithmus bestimmt an die UE geben.

    Falls nicht und/oder bei Interesse überlasse ich dir gerne meinen Code.

    Er ist nur in C# programmiert und für die UNITY-Engine, was beides kein großes Hindernis darstellen sollte.


    "Climbing the Hill" is auch ein interessanter Ansatz für solche Probleme der Wegfindung und Gewichtung von Wegpunkten/Objekten.

  • Das Problem ist halt, das ich meine Spielewelt prozedural erstellen lasse. Sprich nicht einmal ich weiß was hinter dem nächsten Berg steckt, also Wiese, Wald, Meer oder was auch immer.


    Ich könnte natürlich pro Chunk ein Navmesh erstellen. Das hat aber den Nachteil, dass die Tiere und NPCs halt nur innerhalb dieses Navmeshes agieren können. Zumindest habe ich das so verstanden, das ein Navmesh auch die Begrenzung darstellt. Wenn dem nicht so ist wäre das ja wiederum ein geringeres Problem. Ich müsste dann ja nur herausfinden welche Vegetation wo ist. Sprich Anbaufelder wo sich dann Krähen lieber hingezogen fühlen.


    Oder ich ziehe das Navmesh über die ganze Karte. Allerdings sehe ich da auch ein Speicherproblem. Ich glaube nicht, das auch nur irgend ein Objekt eine quasi endlose Größe erreichen kann oder sollte.

  • Möglich ist es, aber du musst potentiell viel Arbeit reinstecken.


    Wozu braucht man ein Navmesh?

    Im Grunde will man ja beim Pathfinding einen Pfad finden mit dem man am günstigsten von Punkt A nach B kommt. Das Navmesh ist eine Lösung bei der man Informationen zur Navigation in ein extra Mesh steckt, welches etwas gröber aufgelöst ist. Du kannst es dir wirklich wie ein Netz aus Punkten vorstellen.

    Was nun im Pathfinding passiert ist eine Art Suchalgorithmus, der schaut wie man am besten zum Ziel kommt. Diese Lösung ist ziemlich gut für komplexes Terrain mit verwinkelten Gängen und einer AI die gezielt bestimmte Positionen erreichen muss. (Z.B. in einem Arena Shooter, wo eine AI z.B. eine zum Spawner eines bestimmten Pickups/Waffe gehen will, dies ist somit recht einfach gelöst, weil man als AI Programmierer nur den Befehl "gehe zu Punkt X" geben muss.


    Was gibt es für anderer Möglichkeiten?

    Müssen deine AI gesteuerten Pawns gar nicht mal so intelligent sein, bestimmte Punkte zu erreichen könntest du diese reaktiv agieren lassen. D.h. du lässt sie einfach in eine Richtung laufen indem du den Velocity Vector setzt, währendessen schaust du über Traces ob die Figur mit etwas kollidieren könnte und lenkst in eine geeignete Richtung um. Im Grunde so wie die billigen Staubsaugerroboter, die nach dem Chaosprinzip arbeiten.


    Zumindest als einfache Lösung könnte so etwas herhalten.

    Für komplexeres müsstest du natürlich auch etwas komplexeres programmieren. Andere Lösungen wären z.B. dass man prozedural mit dem Level ein Netzauf Waypoints generiert, über die Verbindungen zwischen zwei Waypoints weißt du in welche richtung du deine AI laufen lassen kannst.


    Denk am besten genau drüber nach was deine AI können muss. Wenn sie "ziellos" umherstreift, dann reicht die erste Lösung. Wenn sie klare Ziele hat und komplexe Wege überwinden musst, musst du schauen wie du diese Informationen in dein Level verpackst, abfragst und den optimalen Weg findest.


    Ich hoffe das hilft dir etwas, oder gibt dir Ideen.

  • Das Problem ist halt, das ich meine Spielewelt prozedural erstellen lasse. Sprich nicht einmal ich weiß was hinter dem nächsten Berg steckt, also Wiese, Wald, Meer oder was auch immer.

    Das stellt kein Problem dar. Solange man Wald, Wiese, Meer oder was auch immer als solche identifizieren kann funktioniert es.

    Und zur Identifikation existieren genügend Methoden.


    Die Grenze des begehbaren Bereichs wird mittels "NavMeshBoundsVolume" definiert.

  • Ach so, habe ich noch vergessen zu fragen. Kann ein NPC eigentlich nur innerhalb eines Navmeshes operieren in dem er sich gerade aufhält? Oder sind die Navmeshes, wenn es mehrere gibt, miteinander verbunden. Weil wenn, dann würde ich mich lieber für die Lösung ein Mesh pro Chunk entscheiden. Das erscheint mir eine sauberere Lösung zu sein.

    • Hilfreich

    Ein NPC kann in mehreren Navmeshes operieren.

    Du bestimmst mittels "NavMeshBoundsVolume" ob die Meshes miteinander verbunden sind.

    Um sich zwischen diesen bewegen zu können müssen sie aneinander grenzen, ansonsten schaffst du nichtbegehbare Zonen, No-Go-Areas...


    "NavModifierVolume" kann hilfreich sein, begehbare Zonen temporär als nichtbegehbare zu deklarieren.

  • Automatisches rebuild sollte funktionieren.

    Projektsettings->NavMesh

    Ist jetzt nur eine Vermutung, Force Rebuild wird angewendet, wenn die Map geladen ist.

    Runtime Generation auf Dynamic stellen für permanentes Rebuild. Dynamic Modifier ist mir noch unklar. Das hier sind aber nur vermutungen die ich noch nie getestet habe.


    Hier aber noch ein Video vom alten Stand. Deswegen bin ich darauf gekommen.

  • Danke, werde ich mal ausprobieren.


    Muss da eh noch einiges machen. Bisher funktioniert meine Maperstellung ja noch so ähnlich wie bei Minecraft, mit demselben Ergebnis logischerweise. Also ich muss da eh noch einiges machen. Bisher existiert es nur damit beim Testen meine Spielfigur nicht endlos fällt und ich nicht nur eine Floorplatte habe :D.


    Also da habe ich eh noch einiges vor. Aber ich werde es mal im Auge behalten. Immer her mit allen Möglichkeiten die so einfallen.


    Noch habe ich ja mit meiner Wolfsanimation zu tun, ansonsten wäre mir ja gar nicht aufgefallen das es ohne Navmesh gar nicht geht.


    Bin am Ende mal gespannt was dabei rauskommt.