Qual è la differenza tra Update e FixedUpdate in Unity e dovrei preoccuparmi?


10

Mi è stato detto di usare Update()per la grafica e la FixedUpdate()fisica, ma a volte i miei input non si registrano quando uso FixedUpdate(). Funziona bene se uso Update()per tutto però.

Dovrei preoccuparmi FixedUpdate()o sto facendo qualcosa di sbagliato?

Risposte:


10

FixedUpdatepuò funzionare più veloce o più lento rispetto a Updateseconda delle impostazioni. Dipende dal carico (quanto veloce Updateè in esecuzione) e dalla velocità impostata FixedUpdate(disponibile in Modifica-> Impostazioni progetto-> Tempo). Idealmente, poiché Updateviene eseguito una volta per frame, è qui che si desidera acquisire l'input. Se devi agire sull'input nel FixedUpdatemetodo (come controllare i corpi fisici), imposta i flag Updatee gestiscili in FixedUpdate:

bool leftMouseDown = false;

void Update()
{
    if(Input.GetMouseButtonDown(0))
        leftMouseDown = true;
}

void FixedUpdate()
{
    if(leftMouseDown )
    {
        //update physics bodies with input
        leftMouseDown = false;
    }
}

È comunque una buona idea controllare la fisica dal FixedUpdatemetodo, poiché è improbabile che la fisica debba essere aggiornata spesso, e la fisica su un aggiornamento fisso è molto più facile da prevedere ( determinismo ) rispetto alla fisica su un aggiornamento variabile.


che dire se invece di una condizione bool (es.GetMouseButtonDown) dobbiamo leggere il valore da un asse (Input.GetAxis ("Horizontal"))? Se l'aggiornamento viene eseguito più volte di FixedUpdate, qual è il tuo consiglio in tal caso? Dovremmo eventualmente considerare di calcolare il valore medio dell'asse verificatosi durante i vari Update prima di utilizzarlo in Update? (+1 a
settimana

Come faccio a sapere quanto è veloce il mio FixedUpdate?
Tokamocha,

1
@Tokamocha La velocità per l'aggiornamento fisso è impostata in Modifica-> Impostazioni progetto-> Ora.
MichaelHouse

@Heisenbug Personalmente userò solo l'ultimo valore e vedrò come funziona. Se ottengo risultati imprevisti, potrei calcolare una media corrente del valore dell'asse fino a quando non viene elaborato da FixedUpdate. Questa è una di quelle cose che richiedono alcuni test di gioco per capire davvero cosa "sembra" giusto.
MichaelHouse

1
Ho scoperto in recenti test che, contrariamente a quanto implicito nei documenti, nuovi flag di input sono già disponibili in FixedUpdate (almeno su PC). Quindi impostando un flag in Update e poi agendo su di esso nel prossimo FixedUpdate successivo (cioè il frame successivo), come mostrato qui, si può effettivamente aggiungere un frame di latenza al gioco, relativamente alla gestione diretta dell'input in FixedUpdate. Ciò richiede una certa attenzione, tuttavia, per evitare la doppia gestione dell'input sui frame con più FixedUpdate o la mancanza di input sui frame senza FixedUpdate.
DMGregory

7

Devi capire cosa fa ciascuno. Update()viene chiamato il più spesso possibile (non sono sicuro, forse può essere limitato), in entrambi i casi - ogni frame. FixedUpdate()viene chiamato per ogni costante di tempo (quindi "fisso").

L'input entra in Update(), così semplice (perché come hai notato FixedUpdate()potrebbe non catturare l'evento di input). La logica di gioco tuttavia potrebbe andare in uno dei due. La fisica deve essere deterministica ed è per questo che dovrebbe esserlo FixedUpdate(). Altre cose non devono. A seconda dell'uso, è necessario decidere quale funzione è appropriata.

Althouth vale la pena di dire che alcune applicazioni hanno tutto l'aggiornamento della logica di gioco FixedUpdate()(anche al di fuori di Unity) - si chiama "ciclo di gioco a passaggio fisso". Avere tutto il codice di aggiornamento in una funzione a passaggio fisso ti dà determinismo e rende più probabile che la tua app si comporti allo stesso modo ogni volta (e su ciascun dispositivo). Permette anche alcune funzioni fantasiose, come i replay.


Quindi, se metto tutto in FixedUpdate () il mio gioco registrerà comunque tutti gli input, giusto?
Tokamocha,

1
No, puoi inserire tutti gli aggiornamenti della logica di gioco ma non il controllo di input.
NPS,

2
questa risposta è piena di informazioni mancate. Prima di tutto FixedUpdate viene chiamato 1 / fixedDeltaTime volte al secondo , non ogni n: th fixedDeltaTime. In secondo luogo, la logica di gioco dovrebbe sempre andare in FixedUpdate in quanto semplifica la ragione. L'aggiornamento è solo a scopo di rendering (so che quasi nessuno nella comunità Unity lo segue, ma è proprio così che dovrebbe essere fatto). Terzo, FixedUpdate e la sua relazione con il motore fisico non hanno nulla a che fare con il determinismo.
thr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.