Schneller Tipp Pause, Zeitlupe und Doppelzeit in Unity

Ein Unity-Spiel anzuhalten ist einfach. Es gibt ein paar Dinge, die Sie beachten sollten, aber wir werden am Ende dieses Tipps darauf eingehen. Wir werden ein paar einfache GUI-Schaltflächen hinzufügen, um die Zeit in einem grundlegenden Unity-Projekt zu steuern.


Endergebnisvorschau

Werfen wir einen Blick auf das Endergebnis, auf das wir hinarbeiten:


Schritt 1: Erstellen Sie ein neues Projekt

Beginnen wir mit dem Öffnen von Unity und dem Erstellen eines neuen Projekts. Möglicherweise möchten Sie den Vorgängen eine Animation oder eine Art Aktion hinzufügen, so dass Sie tatsächlich einen Effekt sehen können, wenn Sie die Tasten drücken. In dem angeführten Beispiel habe ich nur ein paar einfache Würfel gemacht.

Ein neues Projekt zu öffnen, ist schön und einfach. Wenn der Ladevorgang abgeschlossen ist und Sie den Projektassistenten angezeigt haben, können Sie auf die Registerkarte 'Neues Projekt erstellen' klicken und einen Dateinamen eingeben. Den Rest erledigt die Einheit. Wenn das Fenster des Projektassistenten beim Starten von Unity nicht angezeigt wird, gehen Sie zu Datei> Neues Projekt.


Schritt 2: Erstellen Sie ein neues JavaScript-Skript

Unity hat ein eigenes GUI-System eingebaut, das weit über diesen Tipp hinausgeht. Sagen wir einfach, dass alles GUI-weise in einer aufgerufenen Funktion geschieht OnGUI und die GUI-Klasse bietet eine ganze Reihe cooler Dinge wie einen Button.

Fahren Sie fort und erstellen Sie ein neues Skript über das Menü Assets - wählen Sie aus Assets> Erstellen> JavaScript:

Ihr neues Skript sollte im Projektfenster angezeigt werden. Klicken Sie einmal auf das Skript und es sollte hervorgehoben werden, damit Sie es umbenennen können. Benennen Sie das Skript "PauseScript" und drücken Sie die Eingabetaste. Jetzt wollen wir mit der Codierung beginnen, also doppelklicken Sie diesmal. Dies sollte den Standard-Skripteditor mit der darin enthaltenen Vorlage / Standardcode von Unity öffnen. Wenn der Skripteditor geladen ist, löschen Sie den Standardcode und ersetzen Sie ihn durch den folgenden Code:

 function OnGUI () // Schaltfläche "Pause" anzeigen if (GUI.Button (Rect (0,0,120,30), "TOGGLE PAUSE")) // Rufe unsere Toggle-Funktion auf doPauseToggle (); 

GUI.Button erfordert ein Rect (das die x, y, Breite und Höhe unserer Schaltfläche enthält) und die Zeichenfolge, die darin angezeigt werden soll. Herauszufinden, ob die Taste gedrückt wurde oder nicht, ist so einfach wie das Setzen der Taste GUI.Button Methode in eine if-Anweisung zeichnen.


Schritt 3: Kodieren der Pause-Umschaltfunktion

Hier beziehen wir uns auf eine Funktion, die wir anrufen werden doPauseToggle (). Dies ist eine einfache Funktion, die prüft, ob wir angehalten sind oder nicht, und dann die richtige Aktion ausführt. Fügen Sie den folgenden Code am Ende Ihres PauseScript.js-Skripts unterhalb der OnGUI-Funktion hinzu, die wir in Schritt 2 hinzugefügt haben:

 function doPauseToggle () // Hier überprüfen wir, ob wir auf einer Zeitskala über 0 laufen, wenn (Time.timeScale> 0) // Zeitskala über Null liegt, also müssen wir das Spiel hier pausieren. pauseGame () ;  else // Die Zeitskala war kleiner als Null, also machen wir das Spiel hier unpause unPauseGame (); 

Time.timeScale So gehen wir mit dem Pausieren des Spiels um. Im Wesentlichen ändern wir die Skala, zu der die Zeit vergeht. Wenn timeScale 1.0 ist, ist die Zeit in Echtzeit. Bei Null (0) wird die Zeit angehalten. Also in unserem doPauseToggle Funktion überprüfen wir einfach, ob die Zeit größer als Null ist, ohne Pause, wenn dies der Fall ist, rufen wir eine neue auf pauseGame () Funktion. Andernfalls wird unPauseGame () aufgerufen.


Schritt 4: Codierungspause- und Pause-Funktionen

Die Funktionen in Schritt 3, pauseGame () und unPauseGame (), einfach das manipulieren Time.timeScale Geben Sie entweder 0 oder 1 an. Fügen Sie den folgenden Code am Ende Ihres Skriptes PauseScript.js unterhalb des in Schritt 3 hinzugefügten Codes hinzu:

 function pauseGame () // setze den Maßstab, zu dem die Zeit auf 0, Einfrierzeit (!) vergeht (!) Time.timeScale = 0;  function unPauseGame () // setze den Maßstab, zu dem die Zeit auf 1 übergeht und wieder in Echtzeit ausgeführt wird Time.timeScale = 1; 

Ob Sie es glauben oder nicht, das ist alles, was Sie tun müssen, um einer Unity-Datei eine Pause-Schaltfläche hinzuzufügen. Wenn Sie eine Aktion in Ihrer Unity-Szene haben, werden Sie jetzt sehen, dass sie beim Klicken auf die Schaltfläche angehalten wird und nicht mehr aufhört! Beachten Sie, dass Sie nichts sehen, wenn Sie in Ihrer Szene nichts los sind.


Schritt 5: Bewegen in Zeitlupe

Denkst du, was ich denke? Wenn 0 Pausen einnimmt und 1, geht es um 0,5? Denken Sie an Aufzählungszeit!

Lassen Sie uns zunächst einen neuen Button hinzufügen OnGUI () Funktion. Lassen Sie dies am unteren Rand der Funktion, direkt über dem Schließen Klammer.

 // eine 'slowmo'-Schaltfläche anzeigen if (GUI.Button (Rect (0,30,80,30), "SLOWMO")) // Aufruf unserer Toggle-Funktion slowMo (); 

Jetzt benötigen wir eine neue Funktion, um den Zeitfaktor auf weniger als 1 einzustellen. Scrollen Sie zum Ende Ihres PauseScript.js-Skripts und fügen Sie diese neue Funktion hinzu:

 function slowMo () // setze die Waage auf 5, und setze in slowmo Time.timeScale = 0,1; 

? Damit beweisen Sie, dass Sie in Unity nicht unbedingt Neo sein müssen!


Schritt 6: Doppelte Zeit!

Um Spaß zu haben, lassen Sie uns zum Schluss alles doppelt verrückt machen. Obwohl ich dies nicht in einer echten Spielmechanik gesehen habe, habe ich gesehen, dass die Zeit vorübergehend skaliert wurde, um einen Partikeleffekt zum Laufen zu bringen - es war ein Feuereffekt und der Autor wollte, dass der Bildschirm schnell mit Feuer gefüllt wird, um den Hintergrund zu bringen von seinem Menübildschirm zum Leben. Nachdem das Menü geladen und das Feuer den Bildschirm gefüllt hatte, wurde die Zeit für eine Sekunde hoch eingestellt. Dann reduzierte er die Zeit wieder auf 1, sodass sich die Flammen richtig bewegten und alles andere im Spiel auf normalem Tempo lief.

Um eine doppelte Zeit hinzuzufügen, gehen Sie wie in Schritt 5 vor und fügen eine neue Schaltfläche hinzu, die eine neue Funktion aufruft. Die neue Funktion setzt einfach unseren timeScale auf 2. Find the OnGUI () Funktion in Ihrem Skript "PauseScript.js" und fügen Sie über dem Ende der Funktion und über dem Schließen Folgendes hinzu geschweifte Klammer.

 // Zeigt eine 'double time'-Schaltfläche an, wenn (GUI.Button (Rect (0,60,120,30), "DOUBLE TIME")) // unsere Toggle-Funktion aufrufen doubleTime (); 

Recht. Wir haben eine Schaltfläche, fügen wir diese doubleTime () - Funktion hinzu:

 function doubleTime () // setze den Maßstab, zu dem die Zeit auf 0,5 übergeht und in slowmo läuft Time.timeScale = 2; 

Versuchen Sie zum Spaß, den timeScale auf bis zu 100 einzustellen und sehen Sie, was passiert.


Nehmen wir eine Bestandsaufnahme unseres Skripts. Hier ist die PauseScript.js vollständig, nur für den Fall, dass auf dem Weg etwas Schlimmes passiert ist:

 function OnGUI () // Schaltfläche "Pause" anzeigen if (GUI.Button (Rect (0,0,120,30), "TOGGLE PAUSE")) // Rufe unsere Toggle-Funktion doPauseToggle ();  // Eine 'slowmo'-Schaltfläche anzeigen, wenn (GUI.Button (Rect (0,30,80,30), "SLOWMO")) // unsere Toggle-Funktion aufrufen slowMo ();  // Zeigt eine 'double time'-Schaltfläche an, wenn (GUI.Button (Rect (0,60,120,30), "DOUBLE TIME")) // unsere Toggle-Funktion aufrufen doubleTime ();  function doPauseToggle () // Hier überprüfen wir, ob wir auf einer Zeitskala über 0 laufen, wenn (Time.timeScale> 0) // Zeitskala über Null liegt, also müssen wir das Spiel hier pausieren ();  else // Die Zeitskala war kleiner als Null, also machen wir das Spiel hier unpause unPauseGame ();  function pauseGame () // setze den Maßstab, zu dem die Zeit auf 0, Einfrierzeit (!) vergeht (!) Time.timeScale = 0;  function unPauseGame () // setze den Maßstab, zu dem die Zeit auf 1 übergeht und wieder in Echtzeit ausgeführt wird Time.timeScale = 1;  function slowMo () // setze den Maßstab, zu dem die Zeit auf 0,1 übergeht und in slowmo läuft Time.timeScale = 0,1;  function doubleTime () // setze den Maßstab, zu dem die Zeit auf 0,5 übergeht und in slowmo läuft Time.timeScale = 2; 

Letzte Worte und ein paar Gotchas!

Es ist wichtig sich das zu merken Time.timeScale hat keinen Einfluss auf den Code innerhalb eines Aktualisieren() Funktion. Das Update findet bei jedem "Tick" statt und findet außerhalb der Zeitskala statt. Wenn Sie also etwas tun müssen, um das Spiel zu pausieren, z. B. eine Hintergrundanimation, ist der Ort, an dem es platziert werden kann, höchstwahrscheinlich Update. Weitere Informationen hierzu finden Sie in der Unity-Dokumentation.

Beachten Sie das, wenn Sie das ändern Time.timeScale value: Alle zeitbezogenen Aktionen wie Aufrufe der Funktion Invoke oder alle Timer, die Werte aus Time.time verwenden, sind ebenfalls von der Änderung betroffen. Wenn Ihr Spiel mit der doppelten Geschwindigkeit läuft, müssen Sie die Geschwindigkeit Ihrer zeitbasierten Aktionen halbieren. Wenn Sie beispielsweise ein Rennspiel mit Rundenzeitgeber haben und Time.timeScale auf 2.0 eingestellt ist, müssen Sie dies tun verlangsamen Sie den Rundenzeitgeber um eine Hälfte, um die Zeit genau zu messen).

Physikreaktionen sind nicht direkt betroffen, daher sollte Ihr Spiel so laufen, wie es normalerweise bei Kollisionen und aus physikalischer Sicht der Fall wäre - nur auf einer anderen Zeitskala.

Das ist es! Danke, dass Sie meinen schnellen Tipp gelesen haben. Mit herumspielen Time.timeScale und ich freue mich darauf, in Ihren Projekten coole Matrix-ähnliche Effekte zu sehen. Viel Spaß beim Spielen!