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.
Update
immer seltener aufgerufen, und Ihre Simulation leidet stark darunter. Sie werden es vielleicht nicht bemerken, während die Simulation einfach ist, aber sie wird leicht schrecklich brechen, wenn es nicht so ist.Von: http://unity3d.com/learn/tutorials/modules/beginner/scripting/update-and-fixedupdate
Der in FixedUpdate verwendete Zeitschritt ist nicht variabel.
Wenn Ihr Spiel zu verzögern beginnt, wenn es aufholt, möchten Sie nicht mehr als 10 Sekunden Physik in einem Update, daher wird es normalerweise in FixedUpdate ausgeführt, das in einem festen Intervall aufgerufen wird.
Beispielsweise:
Wo:
quelle
FixedUpdate
nicht in einem festen Intervall angerufen. Die eigentliche NaturFixedUpdate
ist es, mehrere Physikzyklen in einem Frame zusammenzufassen, wenn Ihr Spiel zu verzögern beginnt, und Zyklen zu überspringen, wenn es zu schnell läuft, damit der Durchschnitt zum festen Aktualisierungszeitschritt passt. Unity ist kein Multithreading-System, daher gibt es keine Möglichkeit, FixedUpdate-Aufrufe in einem festen Intervall zu garantieren (was passiert, wenn ein FixedUpdate zu lange dauert). Selbst wenn es so wäre, wäre es wahrscheinlich immer noch so gut wie unmöglich.Update
wird so schnell wie möglich angerufen. Die Variable 'Time.deltaTime' wird auf die tatsächliche Zeit eingestellt, die seit dem letzten Aufruf vergangen ist. Wenn Verzögerung oder ähnliches das Spiel verlangsamt,Update
wird dies immer noch nur einmal aufgerufen, sobald die Verzögerung vorbei ist, mit einem hohen Wert vondeltaTime
.FixedUpdate
wird in regelmäßigen Abständen aufgerufen. Es wird niemals öfter aufgerufen als in 'Time.fixedDeltaTime' angegeben. Wenn Verzögerung oder ähnliches das Spiel verlangsamt,FixedUpdate
wird es mehrmals kurz hintereinander aufgerufen, damit das Spiel aufholt.Time.deltaTime
wird gleich gesetzt,Time.fixedDeltaTime
bevor ausgeführtFixedUpdate
wird, dies ist jedoch nur ein Trick, um die Migration von Code zwischen den beiden zu vereinfachen.Im Allgemeinen
Update
sollte für interpolierbares Verhalten undFixedUpdate
für Verhalten verwendet werden, die schrittweise berechnet werden müssen oder von denen abhängen, die dies tun, z. B. physikbasierte Bewegung. Wenn Sie irgendeine Art von SchleifeUpdate
entlang der Linien für schreibenfor(time=0;time<=deltaTime;time+=someStep)...
, sollten Sie dies wahrscheinlich stattdessen in FixedUpdate tun.quelle