Ich kenne einige Unterschiede zwischen Update() und FixedUpdate() und vor kurzem habe ich beide Funktionen in einem Skript verwendet. Der Code funktioniert, aber ich habe eine Frage:

Verursacht die Verwendung dieser beiden Funktionen Probleme? Ist es sicher, beide zu verwenden?

Antwort

Aktualisierungsreihenfolge

Wenn Sie die Spiellogik und Interaktionen, Animationen, Kamerapositionen usw. verfolgen, können Sie verschiedene Ereignisse verwenden. Das übliche Muster besteht darin, die meisten Aufgaben innerhalb der Aktualisierungsfunktion auszuführen, es gibt jedoch auch andere Funktionen, die Sie verwenden können.

FixedUpdate:

FixedUpdate wird häufig häufiger aufgerufen als Update.

Es kann mehrmals pro Frame aufgerufen werden, wenn die Framerate niedrig ist, und es kann überhaupt nicht zwischen Frames aufgerufen werden, wenn die Framerate hoch ist. Alle physikalischen Berechnungen und Aktualisierungen erfolgen unmittelbar nach FixedUpdate. Wenn Sie Bewegungsberechnungen in FixedUpdate anwenden, müssen Sie Ihre Werte nicht mit Time.deltaTime multiplizieren.

FixedUpdate wird unabhängig von der Funktion auf einem zuverlässigen Timer aufgerufen Bildrate

.

Update:

Das Update wird einmal pro Frame aufgerufen. Dies ist die Hauptfunktion des Arbeitspferdes für Frame-Updates.

LateUpdate:

LateUpdate wird nach Abschluss des Updates einmal pro Frame aufgerufen.

Alle Berechnungen, die in Update ausgeführt werden, sind abgeschlossen, wenn LateUpdate beginnt. Eine häufige Verwendung für LateUpdate ist eine folgende Kamera einer dritten Person. Wenn Sie Ihren Charakter in Update bewegen und drehen, können Sie alle Berechnungen der Kamerabewegung und -rotation in LateUpdate durchführen. Dadurch wird sichergestellt, dass sich der Charakter vollständig bewegt hat, bevor die Kamera seine Position verfolgt.

Die gleichzeitige Verwendung von Fixed Update, Update und Late Update ist sicher.

 using UnityEngine; using System.Collections; public class CheckFunctionExecutionOrder : MonoBehaviour { void FixedUpdate () { Debug.Log("FixedUpdate time :" + Time.deltaTime); } void Update () { Debug.Log("Update time :" + Time.deltaTime); } void LateUpdate() { Debug.Log("late Update time :" + Time.deltaTime); } } 

Kommentare

  • Hervorragende Antwort! Es kann sinnvoll sein, eine Coroutine zu erstellen, die vor der Ausführung auf FixedUpdate wartet. Wenn Sie diese Coroutine effektiv von einer Startmethode aus starten, erhalten Sie ein LateFixedUpdate (das zwar nicht so nützlich ist, aber seine Verwendung hat).
  • Das Multiplizieren mit Time.deltaTime ist in FixedUpdate immer noch eine gute Idee. Sie können damit beispielsweise Geschwindigkeiten in " Einheiten pro Sekunde " anstelle von " Einheiten ausdrücken per tick " und wenn Sie Ihren festen Zeitschritt ändern, müssen Sie ' nicht zurückgehen und alle Ihre Parameter neu einstellen, um die zu erhalten gleiche Geschwindigkeiten. Der Vorteil von FixedUpdate ist, dass Time.deltaTime beim Zugriff von FixedUpdate immer die stabile fixedDeltaTime zurückgibt, anstatt wie bei Update in jedem Frame ein variables Ergebnis basierend auf Framerate und Zeitskalierung zu erhalten.

Antwort

Sie werden tatsächlich alle gleichzeitig ausgeführt. Ihre Skripte erledigen nur Dinge in diesen Funktionen. Update wird einmal pro Frame aufgerufen und FixedUpdate wird einmal bei jedem „Physik-Update“ (welches) aufgerufen ist einmal jede festgelegte Zeitspanne, die Sie anpassen können).

Es gibt auch LateUpdate , wenn bestimmte Funktionen ausgeführt werden sollen Die Aktualisierungsfunktion dieses Referenzrahmens. Eine vollständige Liste der Nachrichten finden Sie in der Referenz MonoBehaviour .

Hier ist ein Link zum Unity-Tutorial, das dies behandelt .

Kommentare

  • Physik-Update ist steuerbar? Ich meine, wenn ich Fixed TimeStep auf einen bestimmten Wert setze, wird das Fixed Update nach dieser Zeit ausgeführt? und die Spielphysik wird auch nach dieser Zeit funktionieren?
  • @MuhammadFaizanKhan So sollte es funktionieren. Ich ' bin mir in der aktuellen Version von Unity nicht sicher, aber es war so, als ich die Antwort schrieb. Grundsätzlich wird die Aktualisierung für jeden Frame aktualisiert, und die Physik hat eine eigene Framerate und Aktualisierungsfunktion, die von der anderen Aktualisierungsfunktion getrennt ist.

Antwort

Es ist sicher, Update (), FixedUpdate () und LateUpdate () in einem Skript zu verwenden. Zumindest habe ich und hatte noch nie Probleme.Im Allgemeinen verwende ich Update () für meine Hauptschleifen, FixedUpdate () für Dinge wie Physik und LateUpdate () für Schleifen, die ich nach allem anderen ausführen möchte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.