Wie kann ich die Schnellvorlauffunktion für mein Tower Defense-Spiel wie in http://fieldrunners.com/ und anderen TD-Spielen implementieren ?
Ich benutze Unity 3D. Würde es etwas geben, das weniger Frames pro Sekunde oder eine Art von manuell eingestellter schneller Bewegung von Feinden und Turm-Schussgeschwindigkeit usw. ermöglicht?
unity
tower-defense
timing
Syed
quelle
quelle
Antworten:
Wenn Ihr Spiel keine komplizierten oder rechenintensiven Simulationen enthält, die eine
Update()
Unterteilung in unabhängige Aktualisierungszeitleisten erfordern, können Sie den Code in Ihren Funktionen auf der Grundlage des Time.time-Werts von Unity erstellen und in Ihrem Code den Time-Wert festlegen .timeScale, um zu sein, was immer Sie wollen. 0 == pausiert, 1 = normal, unsere Tester lieben es, timeScale> 1 zu setzen, um Dinge schneller zu erledigen.http://unity3d.com/support/documentation/ScriptReference/Time-timeScale.html
quelle
Ansatz: Höhere Simulationsrate
Ihr Timing für Ihre Benutzeroberfläche sollte von Ihrer eigentlichen Spieleschleife entkoppelt sein, ebenso wie Ihr Rendering. Nehmen wir zum Beispiel an, Ihre Welt läuft mit vierfacher Geschwindigkeit. Nehmen wir an, dass Ihr Spiel bei Ihrer Grundgeschwindigkeit (1x) 30 Updates pro Sekunde ausführt.
Wenn Sie sich im Schnellvorlaufmodus befinden, haben Sie dann etwa Folgendes:
Mit anderen Worten, das Spiel läuft insgesamt nicht schneller. Der Simulationsteil ist.
Daraus können Sie zwei Dinge ableiten:
Sie benötigen eine Spiellogik einfach genug zu halten , dass Sie kann es leicht viermal schneller auf Ihrer Zielplattform laufen, oder Sie müssen Methoden einzuführen verschiedene Aspekte des Spiels schneller zu extrapolieren - dies zur Folge haben kann, wenn auch in einem Modell , das ist unterscheidet sich von dem, was es gewesen wäre, wenn Sie einfach eine schnellere Simulation verwendet hätten. Der Kompromiss wären also die Verarbeitungskosten für die Genauigkeit. Siehe Ansatz 2 unten.
Es ist die Trennung von Bedenken, die es Ihnen ermöglicht, Ihre Weltsimulation auf einfache Weise zu beschleunigen, wobei diese Trennung Modell, Ansicht und Steuerung ( MVC ) ist. Wenn Ihre Weltdaten (M), Renderlogik (V) und Spiellogik (C) verwechselt sind, können Sie dies wirklich nicht, zumindest nicht ohne massive Migräne.
Ansatz: Hochrechnung auf Basis von Zeitdeltas
Wie oben erwähnt, müssen Sie die Bewegung basierend darauf berechnen, wie weit sich etwas in einer bestimmten Zeit bewegt hätte. Dies setzt jedoch voraus, dass Ihre Spielphysik in ihrer Simulation von Natur aus realistischer ist, was möglicherweise nicht der Fall ist. Dies ist ein etwas größeres und wesentlich komplexeres Thema. Sie müssen mehr Fragen stellen, wenn Sie wissen möchten. Im Wesentlichen werden Sie einige Berechnungen durchführen, um die Dinge richtig zu machen. Sie müssen sich mit der gegenseitigen Durchdringung bei Kollisionen und vielen anderen Problemen befassen, auf die ich hier nicht näher eingehen werde.
Schlussfolgern
Dies gibt Ihnen den allgemeinen Überblick. Ihre Sprachauswahl ist Ihre eigene, vermutlich wissen Sie entweder, wie Sie das in Unity tun, oder Sie tun es nicht. Wenn Sie das Timing in einer beliebigen Sprache durchführen möchten, müssen Sie die Vor- und Nachteile im Detail verstehen. Ich empfehle, mit den Artikeln von Gaffer zu beginnen und die Unity-API-Dokumente zu lesen.
quelle
Grundsätzlich sollte die Aktualisierung der Spielelogik von der Aktualisierung der Spielgrafiken abgekoppelt werden - das heißt, die Simulation des Spiels, der KI, der Einheitenbewegung usw. sollte nicht an die Geschwindigkeit gebunden sein, mit der das Spiel wiedergegeben wird . Normalerweise berechnet die Hauptspielschleife, wie viel Echtzeit seit der letzten Spielaktualisierung vergangen ist, und sendet diesen Deltazeitschritt an die Aktualisierungsroutinen jedes einzelnen Spiellogikobjekts.
In einem solchen Szenario wird es einfach, eine Zeitskalierung (einschließlich Schnellvorlauf) in Ihrem Spiel zu implementieren. Multiplizieren Sie einfach die Zeit der Spiellogik vorab mit einem Skalarwert, der bestimmt, wie schnell die Zeit beschleunigt oder verlangsamt werden soll. Standardmäßig ist dieser Wert eins. Wenn der Benutzer beispielsweise die Taste "Schnellvorlauf" drückt, wird dieser Wert auf 1,5 gesetzt, und die gesamte Simulation scheint um 50% schneller zu sein. Sie würden jedoch trotzdem mit der gleichen Rate rendern.
Ich bin mit Unity nicht sehr vertraut und könnte daher im folgenden Vorschlag falsch liegen, aber Unity verfügt über eine Zeitverwaltungskomponente, die für die Implementierung hilfreich sein kann. Tatsächlich verfügt es bereits über eine Zeitskala-Eigenschaft. Die Beschreibung der Komponente impliziert, dass die Klasse für Physikobjekte entworfen wurde, sie kann jedoch auch auf Ihr Szenario angewendet werden.
quelle