effizienteste Möglichkeit, ein Rastersystem in Einheit zu erstellen

7

Ich erstelle ein kleines Tower Defense-Spiel, um mich mit der Einheit vertraut zu machen.

Zuerst wollte ich ein Rastersystem emulieren, indem ich Berührungen / Mausklicks aufzeichnete und die Koordinaten auf die nächsten ganzen Zahlen rundete. Dies ist sehr kostengünstig und eignet sich gut zum Platzieren von Dingen. Ich bin jedoch ein bisschen ein KI-Geek und habe beschlossen, ein greifbareres Raster zu erstellen, damit die Agenten darauf nach Pfaden suchen können.

Dazu benötige ich ein Knotenraster und für diese Knoten müssen einige Informationen angehängt sein. Wäre es eine viel bessere Idee, dies vollständig im Code zu tun? Oder könnte ich damit durchkommen, tatsächliche Würfel in einem großen Raster auf der Karte zu platzieren?

Das wäre sicherlich einfach, da ich dann gegen sie strahlen könnte - aber ich habe es versucht und das Rendern, dass viele Würfel das Spiel sehr verlangsamen!

Ich nehme an, meine Frage ist: Ist es unnötig teuer, eine Ladung Würfel so einzurichten, aber nicht zu rendern? Oder sollten die Kosten für eine Ladung würfelförmiger Kollisionsvolumina nur unwesentlich höher sein als die Emulation im Code? (wenn überhaupt...)

Auch als Nebenfrage - sollte ich in der Lage sein, beispielsweise 200 Würfel zu rendern und ein reibungsloses Spiel zu haben? Vermisse ich einige Instanzoptionen? Ich nahm an, dass die Dinge automatisch instanziiert würden.

Sir Yakalot
quelle
1
Um die Nebenfrage zu beantworten: In meiner ersten Erfahrung mit der Einheit hatte ich mehr als 1000 Instanzen von gerundeten Würfeln in meinem Spiel und hatte keine Probleme.
Ali1S232

Antworten:

6

Ich werde Ihre Frage nicht in der richtigen Reihenfolge angreifen, auch weil ich Probleme mit der Art und Weise sehe, wie ich denke, dass Sie das Problem angreifen.

Diese [Würfel] wären sicherlich einfach, da ich dann gegen sie strahlen könnte - aber ich habe es versucht und das Rendern, dass viele Würfel das Spiel sehr verlangsamen!

Ich weiß nicht, warum dies langsam sein würde, es sei denn, Sie erstellen, ändern und zerstören diese Würfel zur Laufzeit ständig, aber selbst dann sind 200 Würfel ein Kinderspiel für die Einheit (wenn Sie anfangen, 10.000 gleichzeitig interagierende Elemente zu sagen Die Einheit kann anfangen, Probleme zu haben.

Sie müssen keine physischen "Objekte" in Ihrer Welt haben, um zwischen ihnen zu strahlen. Sie müssen lediglich Objekte in Ihrer Welt haben (leere GameObjects)

Ich nehme an, meine Frage ist: Ist es unnötig teuer, eine Ladung Würfel so einzurichten, aber nicht zu rendern? Oder sollten die Kosten für eine Ladung würfelförmiger Kollisionsvolumina nur unwesentlich höher sein als die Emulation im Code? (wenn überhaupt...)

200 Würfel (sogar 200 RigidBodies) sind in Unity nicht so viel. Der Teil über das Emulieren in Code hängt davon ab, was Ihre Knoten unbedingt wissen müssen.

Auch als Nebenfrage - sollte ich in der Lage sein, beispielsweise 200 Würfel zu rendern und ein reibungsloses Spiel zu haben? Vermisse ich einige Instanzoptionen? Ich nahm an, dass die Dinge automatisch instanziiert würden.

Die Instanzierung in Unity basiert auf dem Fertighaussystem (im Grunde genommen machen Sie Ihr Ding, erstellen Sie ein Fertighaus und verwenden Sie es dann immer wieder in Ihrem Spiel / Ihren Szenen).

Zuerst wollte ich ein Rastersystem emulieren, indem ich Berührungen / Mausklicks aufzeichnete und die Koordinaten auf die nächsten ganzen Zahlen rundete. Dies ist sehr kostengünstig und eignet sich gut zum Platzieren von Dingen. Ich bin jedoch ein bisschen ein KI-Geek und habe beschlossen, ein greifbareres Raster zu erstellen, damit die Agenten darauf nach Pfaden suchen können.

Wenn Sie Ihr gesamtes Spiellevel / Ihre gesamte Spieleszene in einem festen Raster maskieren können, sollten Sie theoretisch in der Lage sein, die Standard-Rasterdurchquerung zu verwenden, aber Ihre gesamte Buchhaltung muss wahrscheinlich spezifisch wertorientiert sein, und am Ende läuft dies nicht sehr sauber / effizient sein.

Dazu benötige ich ein Knotenraster und für diese Knoten sind einige Informationen angehängt. Wäre es eine viel bessere Idee, dies vollständig im Code zu tun?

Ja, nein, vielleicht hängt es davon ab, welche Informationen Ihre Knoten unbedingt benötigen (der einfachste Knoten, den ich mir für ein Tower Defense-Spiel vorstellen kann, ist ein Punkt, ein Bool besetzt und ein Bool erreichbar).

Oder könnte ich damit durchkommen, tatsächliche Würfel in einem großen Raster auf der Karte zu platzieren?

Wieso würdest du das machen? Ich sehe keinen Wert außer etwas zu haben, das Sie physisch im Editor sehen können, und wenn es Zeit ist, das Spiel auszuführen, werden Sie mit diesen Cudes als Würfel nichts anfangen. Warum sollten Sie sie also überhaupt haben, wenn Sie sie nur nehmen wollen? weg ihre Kollision und Rendering. Alles, was Sie übrig haben, ist eine Transformation, die Sie sofort haben könnten, wenn Sie leere gameObjects haben.

der einfachste Weg , Knoten in der Einheit zu tun ist leer Gameobjects (vor allem für die Position), zu erstellen und sie dann für alle Variablen ein Skript geben Sie benötigen , und alle dann diese Knoten auf ihre eigene Ebene setzen.

BEARBEITEN (Als Antwort auf die Anfrage nach mehr Details im Kommentar):

Ist es nicht so, einen Würfel zu erstellen, seine Kollision zu beseitigen und dasselbe zu rendern wie ein leeres gameObject zu erstellen?

Ja und nein. Ja, es ist dasselbe in Bezug auf Physik und Rendering, aber nein in Bezug auf die Buchführung der Motoren. Bei jedem FixedUpdate (insbesondere im Nicht-Release-Modus) nimmt das System alle Komponenten, die ein Objekt hat, und die gleichen für seine untergeordneten Komponenten, und legt sie zur Berechnung ab. Wenn eine dieser Komponenten nicht aktiv ist, wird sie weggeworfen. Es wird also immer noch versucht, Dinge mit den inaktiven Komponenten zu tun. Es ist einfach nicht so viel. Wenn Sie dies genügend oft multiplizieren, kann dies möglicherweise eine zusätzliche halbe Sekunde pro Frame betragen, aber das ist wahrscheinlich dort oben.

Sind leere gameObjects standardmäßig würfelförmig?

Stellen Sie sich ein leeres gameObject aus Sicht der Anwendung als einen Modifikator vor, der etwas oder nichts modifiziert. Ich kann ein leeres gameObject erstellen und es dann um die Welt / Szene bewegen, und dann kann ich es drehen und skalieren, aber wenn es keine Kinder hat, passiert nichts, aber die Änderungen werden aufgezeichnet. Wenn ich dann eine Kugel nehme und erschaffe und sie zu einem Kind dieses leeren gameObject mache, übernimmt dieses Kind diese Änderungen und hat seine eigenen Werte in Bezug auf sein übergeordnetes Objekt gespeichert, aber im Wesentlichen der physischen Logik ist dieses leere gameObject nichts (keine Größe, Form oder irgendetwas), aber es hat eine Transformation und kann Komponenten empfangen.

Denn wenn sie nicht der Vorteil eines Würfelgitters sind, wären sie die Grundlagen eines navMesh.

Ihr Recht auf einen Punkt. Wenn ich das Wortgitter sage, denken die meisten Leute über das Zeichnen von Kästchen nach und haben alle diese Kästchen einheitliche Abmessungen, aber wenn wir Dinge in diese Kästchen einfügen, ist alles, was uns wirklich wichtig ist, ein Punkt im Raum (normalerweise das Zentrum für 3D, aber für 2D-Sprites oben links) Wenn wir also die Kästchen wegnehmen und stattdessen nur diese Punkte im Raum behalten, haben wir immer noch ein Raster, wir haben nur keine Kästchen.

Sie können weiterhin alle Ihre bevorzugten Pfadfindungsalgorithmen mit Punkten / Knoten verwenden, die Sie mit einem Raster erstellt haben, und vieles mehr. Berechnen Sie den Abstand zwischen ihnen und wenden Sie ein Gewicht auf diesen Abstand an (Dijoksra und A *). Ermöglichen Sie dem Agenten, Knoten gleichzeitig zu multiplizieren (Fuzzy-Logik), verfolgen Sie die Bewegungen des Spielers durch ein festgelegtes Gittermuster und geben Sie dann ein Gewicht an zu einer Reihe von Regeln, die entsprechen, und dann den Agenten eine Antwort basierend auf dem höchsten Gewicht auswählen lassen (Systeme ausüben).

Ein Raster ist nur eine visuelle Darstellung, die der Player möglicherweise nie sieht (es sei denn, Sie möchten diese Kästchen tatsächlich in 2D in OK auf dem Bildschirm zeichnen, aber in einer 3D-Perspektive kann dies schnell verwirrend werden, insbesondere wenn sich die Kamera drehen kann).

Könnten Sie erklären, was Sie meinen, als Sie sagten: "Aber Ihre gesamte Buchhaltung muss wahrscheinlich spezifisch wertorientiert sein, und am Ende wird dies nicht sehr sauber / effizient sein."

Ich meinte, dass jeder Agent die gleiche Rundung durchführen muss, die Sie für Ihre Mausklicks ausführen, was sehr wertorientiert ist, und dass Sie am Ende viel von der gleichen Bereinigungsarbeit für hartcodierte Werte ausführen müssen, und Sie erhalten das gleiche Ende Führen Sie Überprüfungen wie beim Ausführen durch if(X>300){//do something}. Wenn Sie jedoch nur die Knoten finden, die hier am nächsten liegen (es liegt an Ihnen, ob Sie Diagonalen möchten), und wenn Sie dies wirklich möchten, können Sie dieselbe Logik für Mausklicks verwenden, anstatt Werte zu runden, indem Sie einfach durch Raycast den nächsten Knoten finden .

gardian06
quelle
Vielen Dank für diese Antwort! Zwei Fragen - Ist das Erstellen einer Ladung leerer Spielobjekte nicht dasselbe wie das Erstellen einer Ladung Würfel und das Entfernen ihrer Kollisions- und Rendereigenschaften? Sind leere gameObjects standardmäßig würfelförmig? Denn wenn sie nicht der Vorteil eines Würfelgitters sind, wären sie die Grundlagen eines navMesh. Könnten Sie auch erklären, was Sie meinen, als Sie sagten: "Aber Ihre gesamte Buchhaltung muss wahrscheinlich spezifisch wertorientiert sein, und am Ende wird dies nicht sehr sauber / effizient sein." Danke noch einmal!
SirYakalot
@ AsherEinhorn siehe bearbeiten
gardian06