Stavo per scrivere questo come commento, ma alla fine è stato piuttosto prolisso, quindi l'ho trasformato in una risposta.
Le risposte attuali sono per lo più corrette, ma alcune cose menzionate sono fuorvianti / sbagliate.
In generale, entreranno in gioco la maggior parte delle attività legate al gioco Update
.
Ad esempio, non si desidera eseguire il polling per l'input FixedUpdate
(non a causa delle prestazioni, ma semplicemente perché le chiamate non funzionano correttamente). L'IA cade nella stessa barca.
La fisica costantemente aggiornata è l' unica attività correlata al gioco che FixedUpdate
dovrebbe essere utilizzata. Chiamate non continue / occasionali a cose come Physics.Raycast
, o addirittura Rigidbody.AddForce
appartenenti Update
. La mia menzione Rigidbody.AddForce
è apparentemente contraria a ciò che potrebbe essere implicito nella documentazione, ma la chiave è Continuo vs Non continuo.
Una grande ragione per cui appartiene solo la fisica continua FixedUpdate
è la natura reale di FixedUpdate
. Altre risposte hanno menzionato il modo in cui FixedUpdate viene chiamato a un fisso interval, but that's slightly misleading. In reality, a script is passed a time in Time.deltaTime
/ Time.fixedDeltaTime
* che non corrisponde direttamente al tempo effettivo tra le chiamate, ma piuttosto al tempo simulato tra le chiamate.
(* Time.deltaTime
e Time.fixedDeltaTime
hanno lo stesso valore quando vengono chiamati in FixedUpdate
[Unity è in grado di dire se la chiamata corrente ha Time.deltaTime
avuto origine durante FixedUpdate
e ritorna Time.fixedDeltaTime
])
Naturalmente lo stesso modo Update
non può essere chiamato in modo costante a causa delle prestazioni variabili, né lo è FixedUpdate
. La differenza chiave è che, ogni frame, se FixedUpdate
non è stato chiamato abbastanza spesso per fare una media dell'intervallo corretto tra le chiamate, viene chiamato più volte (o non viene chiamato la media è troppo alta). Questo è ciò a cui fanno riferimento i documenti sull'ordine di esecuzione dicendo che FixedUpdate può essere chiamato più volte un frame:
... FixedUpdate: FixedUpdate è spesso chiamato più frequentemente di Update. Può essere chiamato più volte per fotogramma, se la frequenza dei fotogrammi è bassa e potrebbe non essere chiamata tra i fotogrammi se la frequenza dei fotogrammi è alta ...
Ciò non influisce sulla fisica a causa della natura del resto dell'ordine di esecuzione e del motore, ma qualsiasi altra cosa inserita FixedUpdate
verrà influenzata e causerà problemi.
Ad esempio, se si inserisce l'elaborazione AI all'interno, FixedUpdate
non c'è motivo di presumere che l'IA non salterà gli aggiornamenti per più frame di fila. Inoltre, ogni volta che `FixedUpdate rimane indietro, la tua IA si aggiornerà più volte in un singolo fotogramma prima che cose come la fisica e l'input / movimento del giocatore vengano elaborati, il che è almeno uno spreco di elaborazione, ma è anche estremamente probabile che causi duro per rintracciare bug e comportamenti irregolari.
Se è necessario eseguire un'operazione a intervalli fissi, utilizzare altri metodi forniti da Unity come Coroutines
e InvokeRepeating
.
E una piccola nota su Time.deltaTime
e quando usarlo:
Il modo più semplice per descrivere l'effetto di Time.deltaTime è cambiare un numero da unità per frame a unità al secondo . Ad esempio, se si dispone di uno script con qualcosa di simile transform.Translate(Vector3.up * 5)
ad Update, essenzialmente si sta spostando la trasformazione a una velocità di 5 metri per frame . Ciò significa che se il framerate è basso, il movimento è più lento e se il framerate è alto, il movimento è più veloce.
Se prendi lo stesso codice e lo cambi in transform.Translate(Vector3.up * 5 * Time.deltaTime)
, l'oggetto viene spostato a una velocità di 5 metri al secondo . Ciò significa che, indipendentemente dal framerate, l'oggetto si sposterà di 5 metri ogni secondo (ma più lento è il framerate, più il movimento dell'oggetto apparirà più fugace poiché si sposta sempre della stessa quantità ogni X secondi)
In generale, vuoi che il tuo movimento sia al secondo. In questo modo, indipendentemente dalla velocità a cui sta andando il computer, la tua fisica / movimento si comporteranno allo stesso modo e non avrai strani bug che si apriranno su dispositivi più lenti.
E non ha senso usarlo FixedUpdate
. A causa di ciò che ho menzionato sopra, otterrai ogni volta lo stesso valore (il valore Timestep aggiornamento fisso) e non farà nulla ai tuoi valori. Il movimento / la fisica definiti in FixedUpdate
saranno già in unità al secondo, quindi non ne avrai bisogno.