Ich erstelle ein Spiel mit einer Kachelkarte, die aus Tausenden von Gitterfeldern besteht. Derzeit ist auf jedem Quadrat ein Rechteckcollider zum Überprüfen von Kollisionen vorhanden.
Bei vielen tausend winzigen Blöcken ist es jedoch ineffizient, alle auf Kollisionen zu überprüfen. Wenn ich im Voraus gewusst hätte, dass die Tilemap so aussehen würde, hätte ich einfach 3 oder 4 große Collider anstelle von Tausenden von kleinen verwenden können:
Gibt es eine Art Standardalgorithmus zum Kombinieren vieler kleiner benachbarter Kacheln zu maximal großen? Wenn ja, könnte es hier jemand beschreiben oder auf Literatur zu solchen Algorithmen verweisen?
Alternativ ist die Vorverarbeitung der Kachelcollider auf diese Weise möglicherweise der völlig falsche Ansatz. Wenn ja, welche ist die richtige, um mit der Effizienz einer extrem großen Anzahl von Collidern umzugehen?
quelle
Antworten:
Ich fand diesen Algorithmus nützlich für die love2d Engine ( lua language )
https://love2d.org/wiki/TileMerging
Hier folgt das love2d Beispiel zu meinem aktuellen Projekt. In rot sehen Sie meine Wandcollider.
quelle
Wenn Sie zerstörbares Terrain erschaffen möchten, besteht meine Vorgehensweise in Unity darin, Collider nur an den Randblöcken Ihrer Welt zu platzieren. So möchten Sie zum Beispiel Folgendes erreichen:
Alle diese grünen Blöcke enthalten einen Collider, der Rest nicht. Das spart eine Menge Rechenaufwand. Wenn Sie einen Block zerstören, können Sie die Collider auf benachbarten Blöcken ziemlich einfach aktivieren. Denken Sie daran, dass das Aktivieren / Deaktivieren eines Colliders teuer ist und sparsam erfolgen sollte.
Die Tile-Ressource sieht also folgendermaßen aus:
Es ist ein Standard-Spielobjekt, aber es kann auch gepoolt werden. Beachten Sie auch, dass der Box-Collider standardmäßig deaktiviert ist. Wir würden nur aktivieren, wenn es sich um ein Randplättchen handelt.
Wenn Sie Ihre Welt statisch laden, müssen Sie Ihre Kacheln nicht bündeln. Sie können sie alle auf einmal laden, ihren Abstand von der Kante berechnen und bei Bedarf einen Collider anwenden.
Wenn Sie dynamisch laden, empfiehlt es sich, einen Kachelpool zu verwenden. Hier ist ein bearbeitetes Beispiel für meine Aktualisierungsschleife. Es werden Kacheln basierend auf der aktuellen Kameraansicht geladen:
Im Idealfall würde ich einen viel ausführlicheren Beitrag verfassen, da sich hinter den Kulissen einiges mehr abspielt. Dies kann Ihnen jedoch helfen. Bei Fragen stehe ich Ihnen gerne zur Verfügung.
quelle