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.
Antworten:
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.
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)
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.
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).
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.
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).
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):
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.
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.
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).
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 .quelle