Wie kann ich eine "Schnellvorlauf" -Funktion in meinem Spiel implementieren?

15

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?

Syed
quelle
Haben Sie versucht, die Update-Häufigkeit zu erhöhen? Möglicherweise müssen Sie Frames überspringen.
concept3d

Antworten:

7

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

Chronischer Spielprogrammierer
quelle
18

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:

  • World Logic führt für jedes Update der Benutzeroberfläche und des Renderers 4 Updates durch. Dies bedeutet, dass 120 Updates pro Sekunde ausgeführt werden müssen. So Ihre Welt Modell wird (Daten) mit dieser Rate aktualisiert.
  • Renderer- und Benutzeroberflächenlogik rufen weiterhin ab oder führen mit 30 Aktualisierungen pro Sekunde eine beliebige Aktion aus.

Mit anderen Worten, das Spiel läuft insgesamt nicht schneller. Der Simulationsteil ist.

Daraus können Sie zwei Dinge ableiten:

  1. 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.

  2. 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.

Ingenieur
quelle
Wenn Sie den Ansatz mit der höheren Simulationsrate verwenden und die Verlangsamung unterstützen möchten , müssen Sie wahrscheinlich eine extrem langsame Basissimulationsrate haben und diese standardmäßig mit 100 Simulationsschritten / Frame ausführen.
Bobobobo
9

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
1
Es ist definitiv auf sein scenerio anwendbar. Alles, was er tun müsste, ist Time.timeScale auf einen Multiplikator zu setzen und alles wird einfach schneller. Es ist eine allgemeine Änderung. Wenn es also Dinge wie Menü-Interaktionen gibt, werden sie auch schneller.
Tetrad
Nochmals vielen Dank Tetrad :)
Syed