RTS - Units können Zielpunkt nicht erreichen

  • Guten Tag zusammen,


    ich probiere mich gerade in Genre der Echtzeit-Strategie aus. Soweit läuft alles. Jetzt habe ich nur das Problem, dass alle, sagen wir mal, 20 Einheiten zu der Position laufen, an welcher ich mit meinem Maus-Cursor geklickt habe. Eigentlich gut so, jedoch kann bei dieser Anzahl an Einheiten nicht jeden den von mir gesetzten Zielpunkt erreichen. Dementsprechend bleiben die Einheiten nicht am Zielpunkt stehen, sondern schieben und "drängeln" sich gegenseitig und das unentwegt.


    Wie umgehe ich dieses Problem?

    Danke euch schon mal im Voraus.

  • Bibo

    Hat den Titel des Themas von „RTS - Units laufen alle zu einem Punkt“ zu „RTS - Units können Zielpunkt nicht erreichen“ geändert.
  • Die Einheiten werden in einem "Grid" zusammengefasst und halten einen Mindestabstand ein. Bei vielen Spielen der Art siehst du das auch, wenn du mehrere Einheiten auswählst und einen Zielpunkt anklickst, dann wird oft zur Bestätigung ein Zielcurser auf dem Boden angezeigt. Bei mehreren Einheiten werden dann auch mehrere Zielcurser eingeblendet, mit einem gewissen Mindestabstand, so wie die Einheiten sich am Ziel dann auch aufstellen. Diesen Mindestabstand müssen sie dann beim Bewegen halt auch einhalten.

    • Offizieller Beitrag

    Die Frage ist auch was du willst ?


    Wenn du 100 Kinder in echt durch ein Dort zu einem bestimmten Punkt laufen lassen würdest, dann würden einzelne Kinder einen anderen Weg einschlagen. (Sie würden sich nicht als Gruppe bewegen.

    Sind die Kinder am Treffpunkt ankommen dann hätten auch nicht alle Platz auf diesem Zentimeter. :)

    In der Realität gäbe es also genau das selbe Problem.


    Eine Möglichkeit wäre zb dass sich alle Einheiten an einem Punkt treffen. Du wählst eine Anzahl an Einheiten aus zb 10 Stück und alle diese Einheiten bewegen sich zu einem bestimmten Punkt. Erst wenn alle 10 Einheiten diesen Punkt erreicht haben, bewegen sich alle zusammen zum eigentlichen Zielpunkt. Hierbei könnten die Einheiten einen unterschiedlichen Abstand zueinander einhalten.

    So hab ich das in Strategiespielen jedenfalls noch nicht gesehen wäre mit Sicherheit ein intersanter Ansatz.


    Es wäre eher so das jede Einheit von dem Punkt an der sie sich befindet auf dem kürzesten Weg zum Zielpunkt Läuft fährt, fliegt.

    Nun kommt es auf die Größe deiner Einheit an. 10 Busse brauchen viel mehr platz als 10 Soldaten.

    Das bedeutet du brauchst eine Variable die zb InRange heißt und die definiert wie nah die Einheit zusammenstehen dürfen. Bei großen Einheiten ist dieser Wert größer und bei kleines Einheiten entsprechend kleiner. Das ist vor allem bei gemischten Einheiten wichtig.


    Du klickst den Zielpunkt an, und nun prüfst du abhängig von deiner InRange Variable wohin sich welche Einheit bewegt.

    Eher in einer Area statt zu einem festen Punkt die alle Einheiten ansteuern. Je nach wie viele Einheiten du ausgewählt hast, umso mehr Zielpunkte brauchst du die Random inRange des Zielgebietes liegen. Du könntest an der Ziel Position jeder Einheit ein rotes X Spawnen an dem man erkennt wohin sich die Einheit bewegt. Durch dieses X prüfst du gleichzeitig ob die Zielpositions True ist. zb in dem du dies durch ein Linetrace testet. Steht an der Stelle ein Auto, muss eine neue Postion bestimmt werden. Diese Prüfung jagst du durch eine Schleife bist die Endposition alle Einheiten True sind.


    Die Frage ist auch was soll passieren wenn dein Zielpunkt zb in der Mitte eines Sees liegt ? Im grunde würde alle Einheiten wie bekloppt um diesen See laufen und versuchen zum Mittelpunkt des Sees zu kommen ohne den See zu durchqueren.

    Da wäre es doch dann sinnvoll. Wenn du durch die InRange Variable langsam vergrößtest und wenn dieser Wert höher ist als XYZ dann verwendest du den ersten gültigen Wert als neue Ziel Position. Alle Einheiten würden dann zu dieser neuen Position laufen, abhängig von dem InRange Wert. Diese Punkt wäre gleichzeitig der Wert der dem eigentlich Ziel am nächsten ist.

  • Es wäre eher so das jede Einheit von dem Punkt an der sie sich befindet auf dem kürzesten Weg zum Zielpunkt Läuft fährt, fliegt.

    Nun kommt es auf die Größe deiner Einheit an. 10 Busse brauchen viel mehr platz als 10 Soldaten.

    Ich glaube, zumindest du, hast mich da falsch verstanden. Deswegen habe ich Grid auch in Anführungszeichen gesetzt. Damit ist jetzt natürlich nicht das starre Modell einer Tabelle oder so gemeint, zumindest nicht, was die Bewegung angeht.


    Vielmehr muss man eigentlich schon von Anfang an dafür sorgen, dass die Einheiten einen Mindestabstand einhalten. Man sieht das bei einigen Spielen halt, wenn man sie produziert und sie laufen auf den Sammelpunkt, dann orientieren sich alle Einheiten neu und nehmen eine gewisse Grundstellung ein. Wenn man sie jetzt alle auswählt und bewegt, dann bewegen sich alle relativ von ihrer derzeitigen Startposition halt zum Zielpunkt. Also nicht alle Einheiten zu diesem Punkt laufen, sondern alle Einheiten 200 Meter nach Westen. Durch die unterschiedlichen Start- und Zielpunkte, die daraus ja notgedrungen entstehen, können sich die Einheiten dann natürlich auch ihren eigenen Weg suchen.


    Man muss halt nur in einem Grid versuchen festzuhalten, wie die Einheiten zu Beginn zueinander aufgestellt waren und diese Anordnung dann auf den Zielpunkt übertragen. Natürlich machen dann so einige zusätzliche Plausabilitätskontrollen trotzdem noch Sinn, die es ermöglichen sich am Zielort neu zu ordnen. Ein Panzer kann in der Regel wohl eher nicht im Meer stehen, oder auf einem Felsen oder so. Deswegen halt auch am Ziel noch einmal überprüfen, ob die Bewegung für einzelne Einheiten erlaubt ist.

    • Offizieller Beitrag

    Mhh interessantes Thema und vielleicht gar nicht so einfach.

    Es war nicht meine Absicht dir zu widersprechen. Ich hab einfach nur geschrieben was mir in den Sinn gekommen ist.

    Auf jeden Fall gibt es dafür sehr viele Möglichkeiten.


    Grid kann ja nun vieles bedeutet.

    Wobei ich unter Grid eher feste Punkte statt Random Zielpunkte verstehen würde.

    Wenn ALLE Einheiten einen Mindestabstand einhalten, würden doch sehr sehr viele Einheiten in einer Schlange hintereinander laufen ?

    Dann hätte aber trotzdem nicht alle den selben Abstand zueinander ^^




    Die Idee mit diesem Grid und Grundposition finde ich interssant das hab ich auf jeden Fall schon öfter gesehen.

    Was passiert den bei Engstellen, wenn diese Formation nicht aufrecht erhalten werden kann ?


    Ich frag mich ob das technisch nicht auch so geregelt ist, dass die Einheiten einen Abstand zu einem fiktiven Punkt einhaltet Dadurch ergäbe sich doch auch solche Formation.


    Einheiten die dicht beianeinander stehe, folgen dem selben fiktiven Punkt der sich in Richtung Ziel bewegt und Einheiten die etwas weiter weg stehen, suchen sich den Weg selbst und folgen nicht der Gruppe.

    Man könnte machen, wenn sich die Soldaten auf dem Weg treffen und in einer Range sind, folgen sie ebenfalls als Gruppe dem fiktiven Ziel. Dadurch würden auch aus einzelnen Soldaten immer größere Gruppen die wenn sie einmal zusammen sind auch zusammen bleiben.

  • Nun, das ist das, was ich meine. Man muss halt das Grid von Start an den Zielpunkt übertragen, wie die Einheiten dort hinkommen ist, dann wieder eine Mischung von Anweisung und KI. Ich meine, stell dir das mal real vor. Da sind 10 Panzer und der General sagt, da im Norden, 2 Kilometer, da ist das Ziel.


    Alle Panzer werden sich auf den Weg machen, das Ziel zu erreichen. Trotzdem werden sie sich ja nicht übereinander stapeln. Für den Weg dorthin muss man dann eine KI Rangfolge auswürfeln. Wenn die Gruppe an einen Engpass kommt, dann müssen die Einheiten sich halt einigen, wer Vorrang hat. Wer zuerst kommt, mahlt zuerst, wenn zwei Einheiten wirklich haargenau zur selben Zeit eintreffen muss man halt per Zufall auswürfeln, wer zuerst darf.


    Also eigentlich haben wir hier zwei Grundkonzepte. Durch die, ich weiß noch immer nicht, wie ich es besser benennen soll, Gridübertragung von Start auf Ziel, hast du halt leicht unterschiedliche Start- und Zielwerte, weswegen da schon eine dynamischere Bewegung entsteht, dann kann man vielleicht noch einbauen, dass die Einheiten ein paar Sekunden unterschiedlich lange brauchen um auf den Befehl zu reagieren, und dann halt der Weg dorthin, wo sich die Einheiten halt an gewissen Stellen einigen müssen, wer nun Vorrang hat und wer kurz warten muss.

  • Wenn die Units auf dem Weg zum Ziel keine Formation brauchen, ist es simpel, du berechnest einfach eine Formation am Zielpunkt mit Positionen für jede Unit, und erteilst den entsprechenden MoveTo Befehl.


    In den meisten RTS soll die Formation aber auch unterwegs eingehalten werden und sich dynamisch an das Terrain anpassen.

    In diesem Fall muss man die Units zuerst zusammen ziehen. Hier muss man entscheiden, in welchem Radius das geschehen soll. Die Formation kann nicht auf weit entfernte Einheiten warten, nahe Einheiten müssen aber aufschliessen können, typischerweise verlangsamt die Formation, um das geschehen zu lassen.

    Dann muss die Formation in Laufrichtung berechnet werden. Je nach Rotation muss dabei die ganze Formation neu berechnet werden.


    Auch kleinere Rotationsänderungen unterwegs führen dazu, dass die Formation auseinanderfallen würde, das passiert zwangsläufig, weil diese eine höhere Distanz zu gehen haben bei Kurven. Entsprechend muss die Formation auch hier verlangsamen. All das erlaubt es dann, dass sich in die Bewegungsrichtung orientiert und dabei stets in Formation.


    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Ich bin zwar absolut unfähiger Anfänger, aber ich geb jetzt trotzdem meinen Senf dazu, da ich momentan auch an genau diesem Problem bastle. Da ich eh wollte, dass meine Bewegungsziele angezeigt werden spawne ich ausgehendend von dem Zielpunkt Decal in der gewünschten Formation und die Einheiten bewegen sich dann zu ihrem Decal. Unterwegs habe ich dann auch noch das Knubbelproblem, da ich auch noch mit dem DetourCrowdAIController arbeite. Ich versuche es momentan mit einem Dummy-Charakter, der dauerhaft mithilfe seiner Position die Soll-Position der Units berechnet und die entsprechenden Move-Befehle gibt. Das buggt momentan noch brutal, ist aber vieleicht ein Ansatz. Dabei hat der Dummy eine geringere Geschwindigkeit als die Einheiten, um das problem mit den rotierenden Formationen zu lösen. Ich freue mich über Feedback beziehungsweise weitere Ideen, da ich keine Ahnung habe, ob das Sinn macht was ich tue...

  • Für alle interessente: Hier ist meine, zugegeben, unfertige Lösung.


    Ich nehme ein Grid/Raster. Das erstelle ich folgendermaßen:

    Hit Result Under Mouse Cursor -> Damit bekomme ich die Cursorposition. Mit der Node 2D Grid Exectuion Macro lasse ich nun 5x5 Punkte in einem Grid rund um die Cursorposition erstellen. Wenn hierbei der Sector Size groß genug gewählt wird, können die Einheiten ohne Probleme sich aneinander vorbei bewegen ohne sich gegenseitig zu "schieben". Die Positionen speichere ich als Vector Array und zwar nur so viele, wie ich Einheiten ausgewählt habe. Noch ein For Each Loop hinterher mit dem ich jeder Einheit eine Position aus dem Vector Array zuweise und Fertig.


    Problem bislang ist, dass RVOAvoidance zusammen mit IA Controller Class Detour Crowd nicht wirklich funktionieren wollen. Die Units "schlittern" dann gerne mal am Zielpunkt vorbei.


    Nächster Schritt: Aktuell nehme ich die Positionen aus dem Vector Array und lasse dort, bevor sich die Einheiten in Bewegung setzen, Cubes spawnen. Diese sollen später dann erste mal prüfen ob sich dort bereits Einheiten oder Gegner befinden. Während ich gerade schreibe kommt mir die Idee, vielleicht doch besser auf SphereTrace umzusteigen.


    Aber so habe ich bislang das beste Ergebnis.

  • interessant wie viele Ansätze es dafür gibt.


    Meiner wäre EQS mit einem Navigation Invoker gewesen.

    In einem vorherigen Projekt hat das ohne Probleme funktioniert.


    Problem bislang ist, dass RVOAvoidance zusammen mit IA Controller Class Detour Crowd nicht wirklich funktionieren wollen. Die Units "schlittern" dann gerne mal am Zielpunkt vorbei.

    Du kannst den Detour Crowd Controller in den Project Settings weiter anpassen. Unter Umständen lässt sich dein Fehler so beheben