Ich wollte dies als Kommentar schreiben, aber es war ziemlich langwierig, also habe ich daraus eine Antwort gemacht.
Die aktuellen Antworten sind größtenteils richtig, aber ein paar Dinge, die erwähnt werden, sind irreführend / falsch.
Im Allgemeinen werden die meisten Aufgaben im Zusammenhang mit dem Spiel ausgeführt Update
.
Zum Beispiel möchten Sie nicht nach Eingaben fragen FixedUpdate
(nicht wegen der Leistung, sondern weil die Anrufe einfach nicht richtig funktionieren). AI fällt in dasselbe Boot.
Ständig aktualisierte Physik ist die einzige spielbezogene Aufgabe, FixedUpdate
für die es sich eignen sollte. Nicht kontinuierliche / gelegentliche Anrufe zu Dingen wie Physics.Raycast
oder Rigidbody.AddForce
gehören sogar dazu Update
. Meine Erwähnung von Rigidbody.AddForce
steht anscheinend im Widerspruch zu dem, was in der Dokumentation impliziert werden könnte, aber der Schlüssel ist Continuous vs Non-continuous.
Ein großer Grund, warum nur kontinuierliche Physik dazugehört, FixedUpdate
ist die tatsächliche Natur von FixedUpdate
. Andere Antworten haben erwähnt, wie FixedUpdate zu einem festen interval, but that's slightly misleading. In reality, a script is passed a time in Time.deltaTime
/ Time.fixedDeltaTime
* aufgerufen wird, der nicht direkt der tatsächlichen Zeit zwischen Anrufen entspricht, sondern der simulierten Zeit zwischen Anrufen.
(* Time.deltaTime
und Time.fixedDeltaTime
sind der gleiche Wert, wenn sie in FixedUpdate
[Unity kann erkennen, ob der aktuelle Anruf Time.deltaTime
während entstanden ist FixedUpdate
und zurückkehrt Time.fixedDeltaTime
] aufgerufen werden. )
Natürlich kann derselbe Weg Update
wegen der unterschiedlichen Leistung auch nicht konstant aufgerufen werden FixedUpdate
. Der Hauptunterschied besteht darin, dass jeder Frame, FixedUpdate
der nicht oft genug aufgerufen wurde, um das richtige Intervall zwischen Anrufen zu ermitteln, mehrmals aufgerufen wird (oder nicht aufgerufen wird , wenn der Durchschnitt zu hoch ist). In den Dokumenten zur Ausführungsreihenfolge heißt es, dass FixedUpdate mehrmals in einem Frame aufgerufen werden kann:
... FixedUpdate: FixedUpdate wird häufig häufiger aufgerufen als Update. Es kann mehrere Male pro Frame aufgerufen werden, wenn die Framerate niedrig ist, und es kann überhaupt nicht zwischen Frames aufgerufen werden, wenn die Framerate hoch ist ...
Dies wirkt sich nicht auf die Physik aus, da der Rest der Ausführungsreihenfolge und die Engine so gut wie alles andere, was Sie eingeben FixedUpdate
, betroffen ist und Probleme verursacht.
Wenn Sie z. B. die AI-Verarbeitung einbinden FixedUpdate
, besteht kein Grund anzunehmen, dass die AI keine Aktualisierungen für mehrere Frames hintereinander überspringt. Jedes Mal, wenn `FixedUpdate ins Hintertreffen gerät, wird Ihre KI mehrere Male in einem einzigen Frame aktualisiert, bevor Dinge wie Physik und Eingaben / Bewegungen von Spielern verarbeitet werden um Fehler und unberechenbares Verhalten aufzuspüren.
Wenn Sie in einem festen Intervall etwas tun müssen, verwenden Sie andere von Unity bereitgestellte Methoden wie Coroutines
und InvokeRepeating
.
Und ein kleiner Hinweis zu Time.deltaTime
und wann man es benutzt:
Der einfachste Weg, um den Effekt von Time.deltaTime zu beschreiben, besteht darin, eine Zahl von Einheit pro Frame in Einheit pro Sekunde zu ändern . Wenn Sie beispielsweise ein Skript wie transform.Translate(Vector3.up * 5)
in Update haben, verschieben Sie die Transformation im Wesentlichen mit einer Geschwindigkeit von 5 Metern pro Frame . Das heißt, wenn die Framerate niedrig ist, ist die Bewegung langsamer und wenn die Framerate hoch ist, ist die Bewegung schneller.
Wenn Sie denselben Code verwenden und in ändern, transform.Translate(Vector3.up * 5 * Time.deltaTime)
wird das Objekt mit einer Geschwindigkeit von 5 Metern pro Sekunde bewegt . Das bedeutet, dass sich das Objekt unabhängig von der Framerate 5 Meter pro Sekunde bewegt (je langsamer die Framerate ist, desto sprunghafter wird die Bewegung des Objekts, da es sich alle X Sekunden immer noch um den gleichen Betrag bewegt).
Im Allgemeinen möchten Sie, dass Ihre Bewegung pro Sekunde erfolgt. Auf diese Weise verhält sich Ihre Physik / Bewegung unabhängig von der Geschwindigkeit des Computers genauso, und auf langsameren Geräten treten keine seltsamen Fehler auf.
Und es hat keinen Sinn, es zu verwenden FixedUpdate
. Aufgrund dessen, was ich oben erwähnt habe, erhalten Sie bei jedem Aufruf den gleichen Wert (den Wert für den festen Aktualisierungszeitschritt), und Ihre Werte werden dadurch nicht beeinträchtigt. Die in definierte Bewegung / Physik FixedUpdate
wird bereits in Einheiten pro Sekunde angegeben, sodass Sie sie nicht benötigen.