In diesem Tutorial sehen wir uns an, was Time.deltaTime in Unity ist und wie man es verwendet.
Die Videoversion dieses Tutorials ist derzeit in dieser Sprache nicht verfügbar.
Videotranskript
Hallo zusammen! In diesem Tutorial sehen wir uns an, was Time.deltaTime in Unity ist und wie man es verwendet.
Dieses einsteigerfreundliche Tutorial ist perfekt für alle, die neu im Scripting mit C# in Unity sind, da das Thema grundlegend ist und gut verstanden werden sollte, weil es in vielen Skripten und Tutorials vorkommt.
Das Tutorial wurde mit Unity 2022 erstellt, aber Time.deltaTime gibt es bereits seit mehreren Versionen der Software und es wird sehr wahrscheinlich auch in Zukunft verfügbar sein.
Time.deltaTime ist eine Variable, die die Zeit in Sekunden angibt, die zwischen dem letzten Frame und dem aktuellen Frame vergangen ist, also die Zeit, die zur Berechnung des vorherigen Frames benötigt wurde.

Sie wird verwendet, um Bewegungen und Animationen unabhängig von der Framerate zu machen, indem man üblicherweise die Geschwindigkeit eines Objekts in Einheiten pro Sekunde in jedem Frame mit Time.deltaTime multipliziert.
Auf diese Weise variiert die Geschwindigkeit pro Frame abhängig von der Framerate, wodurch auf Geräten mit unterschiedlicher Leistung dieselbe Geschwindigkeit gewährleistet wird.
Sehen wir uns ein praktisches Beispiel zu dem eben Gesagten an, mit einem sehr einfachen Fall: der Bewegung eines Objekts entlang einer Achse mit konstanter Geschwindigkeit. Füge ein Objekt in die Szene ein und richte die Ansicht von oben in einer Isometric-Ansicht aus.

Gib dem Objekt ein C#-Skript und nenne es zum Beispiel movement. Erstelle dann ein Vector3, um eine Verschiebung von einer Einheit anzugeben, die wir in einer Sekunde zurücklegen möchten:
private Vector3 obVelocity = new Vector3(0.0f, 0.0f, 1.0f);
Wir wissen, dass Update bei jedem Frame aufgerufen wird. Allerdings wissen wir nicht, mit wie vielen Frames pro Sekunde das Spiel laufen wird, da dies von verschiedenen Parametern abhängt.
Wenn unsere Framerate konstant 50 Frames pro Sekunde betragen würde, könnten wir obVelocity auf 0.0f, 0.0f, 0.02f ändern und bei jedem Aufruf von Update, also bei jedem Frame, 0.02 Einheiten zurücklegen. Das würde zu einer Verschiebung von einer Einheit pro Sekunde führen.
Da wir diese Möglichkeit nicht haben, schreiben wir in Update:
transform.position += (obVelocity * Time.deltaTime);

Speichere das Skript und kehre zum Unity-Editor zurück, um das Ergebnis zu beobachten. Das Objekt bewegt sich linear und behält eine Geschwindigkeit von einer Szeneneinheit pro Sekunde bei.
Zusammenfassend: Um ein Objekt mit einer bestimmten Geschwindigkeit zu bewegen, die in Szeneneinheiten pro Sekunde ausgedrückt wird, speichere diese Geschwindigkeit in einer Variable und multipliziere sie innerhalb der Update-Funktion mit Time.deltaTime, wie ich es dir eben gezeigt habe.
Sehen wir uns nun ein weiteres Beispiel an.
In der Szene, die ich jetzt verwende, hat die Main Camera ein Bewegungsskript erhalten, das die Pfeiltasten erkennt, indem Input.GetAxis für Horizontal und Vertical verwendet wird.
Die Werte von Horizontal und Vertical reichen jeweils von -1 bis 1. Wenn ich diese Werte direkt in der Update-Funktion des Skripts mit Time.deltaTime multiplizieren würde, würde ich eine Verschiebung von einer Einheit pro Sekunde in der Szene erhalten. Diese Lösung bietet jedoch keine Möglichkeit, die Geschwindigkeit anzupassen.
Um dieses Problem zu lösen, definiert man am einfachsten eine private Variable mit dem Serialized-Modifikator, die im Inspector sichtbar und veränderbar ist, während man das Spiel im Editor testet.
In dem Beispiel, das ich dir im Video zeige, heißt diese Variable speed und hat anfangs den Wert 12.

In der Update-Funktion wird die Bewegung über controller.Move verwaltet, da der Charakter mit einer Character Controller-Komponente verknüpft ist, die mit der Move-Funktion bewegt wird.
Die Funktion wird mit einem recht langen Parameter aufgerufen, der in zwei Teile unterteilt ist.
Im ersten Teil wird die Verschiebung entlang der X- und Z-Achse auf Grundlage der Benutzereingaben berechnet, die in der Variable move gespeichert sind, welche ein Vector3 ist.
Im zweiten Teil wird die Schwerkraft berechnet, wenn ein Sprung ausgeführt wird.

Time.deltaTime wird sowohl bei der Berechnung der Bewegung entlang der Achsen als auch bei der vertikalen Bewegung durch die Schwerkraft verwendet. Den zweiten Teil lassen wir jedoch außer Acht, da er eine längere Erklärung erfordern würde, und konzentrieren uns auf den ersten.
Der Bewegungsvektor move wird mit Time.deltaTime multipliziert, wie wir es bereits beim Würfel im ersten Beispiel gesehen haben, zusätzlich wird er mit der Float-Variable speed multipliziert.
Anschließend wechsle ich in den Unity-Editor und starte das Spiel, um dir zu zeigen, wie man die Bewegungsgeschwindigkeit des Charakters in Echtzeit ändern kann, indem man im Skript-Tab den Wert des Parameters Speed anpasst.
Auf diese Weise kann man die Geschwindigkeit zu Beginn des Spiels kalibrieren.
Da diese Geschwindigkeit mit Time.deltaTime multipliziert wird, wissen wir, dass sie auf verschiedenen Geräten gleich bleibt, unabhängig von der Ausführungs-Framerate.
Da speed eine Variable im Code ist, kann sie auch während des Spiels basierend auf bestimmten Ereignissen verändert werden.
Zum Beispiel könnte der Spieler einen Trank trinken, der es ihm ermöglicht, sich doppelt so schnell zu bewegen, oder sich im Gegenteil langsamer als gewöhnlich fortzubewegen.
Der entscheidende Punkt ist, dass diese Geschwindigkeit auf verschiedenen Geräten konsistent bleibt, da sie dank Time.deltaTime unabhängig von der Framerate ist.
Zusammenfassend haben wir in diesem Video zwei einfache Beispiele für die Verwendung von Time.deltaTime gesehen.
In Kürze werde ich ein Video über Rotationen mit Slerp veröffentlichen, in dem Time.deltaTime verwendet wird, um Rotationen mit konstanter Geschwindigkeit zu erreichen, unabhängig von der Framerate.
Das war alles für dieses Tutorial. Bis bald!