Jeg vet noen forskjeller mellom Update()
og FixedUpdate()
og nylig har jeg brukt begge funksjonene i ett skript. Koden fungerer, men jeg har et spørsmål:
Gir det noen problemer å bruke begge disse funksjonene? Er det trygt å bruke dem begge?
Svar
Oppdater bestilling
Når du holder oversikt over spilllogikk og interaksjoner, animasjoner, kameraposisjoner osv., er det noen forskjellige hendelser du kan bruke. Det vanlige mønsteret er å utføre de fleste oppgaver i oppdateringsfunksjonen, men det er også andre funksjoner du kan bruke.
FixedUpdate:
FixedUpdate kalles ofte oftere enn oppdatering.
Det kan kalles flere ganger per ramme hvis bildefrekvensen er lav, og det kan hende det ikke blir ringt mellom bildene i det hele tatt hvis bildefrekvensen er høy. Alle fysikkberegninger og oppdateringer skjer umiddelbart etter FixedUpdate. Når du bruker bevegelsesberegninger i FixedUpdate, trenger du ikke å multiplisere verdiene dine med Time.deltaTime.
FixedUpdate kalles på en pålitelig tidtaker, uavhengig av bildefrekvens
.
Oppdatering:
Oppdatering kalles en gang per ramme. Det er den viktigste arbeidshestfunksjonen for rammeoppdateringer.
LateUpdate:
LateUpdate kalles en gang per ramme etter at oppdateringen er ferdig.
Alle beregninger som utføres i Update vil være fullført når LateUpdate begynner. En vanlig bruk for LateUpdate vil være følgende tredjepersons kamera. Hvis du får karakteren din til å bevege seg og vende seg inne i Update, kan du utføre alle kamerabevegelses- og rotasjonsberegninger i LateUpdate. Dette vil sikre at tegnet har beveget seg helt før kameraet sporer posisjonen.
For å bruke fast oppdatering er oppdatering og sen oppdatering samtidig trygt.
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); } }
Kommentarer
- Fremragende svar! Det kan være verdt å inkludere at du kan lage en coroutine som venter på FixedUpdate før du kjører; å starte denne coroutine fra en startmetode effectivley gir deg en LateFixedUpdate (som, selv om den ikke er så nyttig, har sine bruksområder).
- Multiplisering med Time.deltaTime er fortsatt en god idé i FixedUpdate. Den lar deg uttrykke ting som hastigheter i " enheter per sekund " i stedet for " enheter per kryss ", og hvis du endrer ditt faste tidspunkt, vinner du ' t må gå tilbake og justere alle parametrene dine for å få samme hastigheter. Fordelen i FixedUpdate er at Time.deltaTime alltid returnerer den stabile fixedDeltaTime når den er tilgjengelig fra FixedUpdate, i stedet for å få et variabelt resultat hver ramme basert på framerate og tidsskalering, slik det gjør i Update.
Svar
De kjører faktisk alle samtidig, manusene dine gjør bare ting i disse funksjonene. Oppdatering kalles en gang per ramme og FixedUpdate kalles en gang hver «fysikkoppdatering» (som er en gang hver faste tid du kan justere).
Det er også LateUpdate , hvis du vil at visse funksjoner skal kjøres etter Oppdateringsfunksjonen til referanserammen. For en fullstendig liste over meldinger, se MonoBehaviour referansen.
Her «er en lenke til Enhetsveiledning som dekker dette .
Kommentarer
- Fysikkoppdatering er kontrollerbar? Jeg mener at hvis jeg setter Fixed TimeStep til en verdi, vil den faste oppdateringen kjøre etter den tiden? og spillfysikken vil også fungere etter den tiden?
- @ MuhammadFaizanKhan Det burde være slik det fungerer. Jeg ' er ikke sikker i den nåværende versjonen av Unity, det var slik det var da jeg skrev svaret. I utgangspunktet oppdateres oppdateringen hver ramme, og fysikken har sin egen bildefrekvens og oppdateringsfunksjon atskilt fra den andre oppdateringsfunksjonen.
Svar
Det er trygt å bruke Update (), FixedUpdate () og LateUpdate () alt i ett skript. I det minste har jeg det og har aldri hatt noen problemer.Jeg bruker vanligvis Update () for hovedløkkene mine, FixedUpdate () for ting som fysikk, og LateUpdate () for løkker jeg vil utføre etter alt annet.