Ik ken enkele verschillen tussen Update()
en FixedUpdate()
en onlangs heb ik beide functies in één script gebruikt. De code werkt, maar ik heb een vraag:
Levert het gebruik van beide functies problemen op? Is het veilig om ze allebei te gebruiken?
Answer
Bestelling bijwerken
Als je spellogica en interacties, animaties, cameraposities enz. bijhoudt, zijn er een paar verschillende gebeurtenissen die je kunt gebruiken. Het algemene patroon is om de meeste taken uit te voeren binnen de Update-functie, maar er zijn ook andere functies die u kunt gebruiken.
FixedUpdate:
FixedUpdate wordt vaak vaker aangeroepen dan Update.
Het kan meerdere keren per frame worden aangeroepen als de framesnelheid laag is, en het kan helemaal niet tussen frames worden aangeroepen als de framesnelheid hoog is. Alle natuurkundige berekeningen en updates vinden onmiddellijk plaats na FixedUpdate. Wanneer u bewegingsberekeningen toepast binnen FixedUpdate, hoeft u uw waarden niet te vermenigvuldigen met Time.deltaTime.
FixedUpdate wordt aangeroepen op een betrouwbare timer, onafhankelijk van de framesnelheid
.
Update:
Update wordt eenmaal per frame aangeroepen. Het is de belangrijkste werkpaardfunctie voor frame-updates.
LateUpdate:
LateUpdate wordt eenmaal per frame aangeroepen nadat de update is voltooid.
Alle berekeningen die in Update worden uitgevoerd, zijn voltooid wanneer LateUpdate begint. Een veelgebruikt gebruik voor LateUpdate is een volgende camera van een derde persoon. Als je je personage laat bewegen en naar Update draait, kun je alle camerabewegingen en rotatieberekeningen uitvoeren in LateUpdate. Dit zorgt ervoor dat het personage volledig is verplaatst voordat de camera zijn positie volgt.
Het is veilig om Fixed Update, Update en Late Update gelijktijdig te gebruiken.
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); } }
Opmerkingen
- Uitstekend antwoord! Het kan de moeite waard zijn om op te nemen dat u een coroutine kunt maken die wacht op FixedUpdate voordat deze wordt uitgevoerd; het starten van deze coroutine vanaf een startmethode effectivley geeft je een LateFixedUpdate (die, hoewel niet zo nuttig, wel zijn nut heeft).
- Vermenigvuldigen met Time.deltaTime is nog steeds een goed idee in FixedUpdate. Hiermee kunt u zaken als snelheden uitdrukken in " eenheden per seconde " in plaats van " eenheden per tick " en als u uw vaste tijdstap wijzigt, hoeft u ' niet terug te gaan en al uw parameters opnieuw af te stemmen om de dezelfde snelheden. Het voordeel in FixedUpdate is dat Time.deltaTime altijd de stabiele fixedDeltaTime retourneert wanneer deze wordt benaderd vanuit FixedUpdate, in plaats van een variabel resultaat te krijgen voor elk frame op basis van framerate en tijdschaal, zoals het doet in Update.
Answer
Ze draaien eigenlijk allemaal tegelijk, je scripts doen gewoon dingen in die functies. Update wordt eenmaal per frame aangeroepen en FixedUpdate wordt eenmaal per “fysica-update” aangeroepen (die is een keer elke vaste hoeveelheid tijd die u kunt aanpassen).
Er is ook LateUpdate , als u wilt dat bepaalde functies daarna worden uitgevoerd de Update-functie van dat referentieframe. Voor een volledige lijst met berichten, zie de MonoBehaviour -referentie.
Hier is een link naar de Unity-tutorial die dit behandelt .
Reacties
- Fysica-update is controleerbaar? Ik bedoel, als ik Fixed TimeStep op een bepaalde waarde instel, zal de Fixed Update na die tijd worden uitgevoerd? en de spelfysica zal na die tijd ook werken?
- @MuhammadFaizanKhan Zo zou het moeten werken. Ik ' ben er echter niet zeker van in de huidige versie van Unity, hoe het was toen ik het antwoord schreef. In feite wordt de update elk frame bijgewerkt en heeft de fysica zijn eigen framesnelheid en updatefunctie, los van de andere updatefunctie.
Antwoord
Het is veilig om Update (), FixedUpdate () en LateUpdate () allemaal in één script te gebruiken. Ik heb tenminste nog nooit problemen gehad.Ik zal over het algemeen Update () gebruiken voor mijn hoofdloops, FixedUpdate () voor dingen als natuurkunde, en LateUpdate () voor loops die ik na al het andere wil uitvoeren.