Jeg kender nogle forskelle mellem Update()
og FixedUpdate()
og for nylig har jeg brugt begge funktioner i et script. Koden fungerer, men jeg har et spørgsmål:
Skaber brug af begge disse funktioner nogen problemer? Er det sikkert at bruge dem begge?
Svar
Opdater rækkefølge
Når du holder styr på spillogik og interaktioner, animationer, kamerapositioner osv., er der et par forskellige begivenheder, du kan bruge. Det fælles mønster er at udføre de fleste opgaver inden for opdateringsfunktionen, men der er også andre funktioner, du kan bruge.
FixedUpdate:
FixedUpdate kaldes ofte oftere end Update.
Det kan kaldes flere gange pr. billede, hvis billedhastigheden er lav, og den kan muligvis ikke kaldes mellem rammerne, hvis billedhastigheden er høj. Alle fysiske beregninger og opdateringer sker umiddelbart efter FixedUpdate. Når du anvender bevægelsesberegninger i FixedUpdate, behøver du ikke multiplicere dine værdier med Time.deltaTime.
FixedUpdate kaldes på en pålidelig timer, uafhængig af billedhastighed
.
Opdatering:
Opdatering kaldes en gang pr. ramme. Det er den vigtigste arbejdshestfunktion til rammeopdateringer.
LateUpdate:
LateUpdate kaldes en gang pr. frame efter opdatering er afsluttet.
Alle beregninger, der udføres i Opdatering, er afsluttet, når LateUpdate begynder. En almindelig anvendelse af LateUpdate ville være et følgende tredjepersons kamera. Hvis du får din karakter til at bevæge sig og vende inde i Update, kan du udføre alle kamerabevægelses- og rotationsberegninger i LateUpdate. Dette vil sikre, at tegnet er flyttet helt, før kameraet sporer dets position.
Det er sikkert at bruge Fixed Update, Update og Late Update.
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 værd at medtage, at du kan oprette en coroutine, der venter på FixedUpdate, før den udføres; at starte denne coroutine fra en startmetode effectivley giver dig en LateFixedUpdate (som, selvom den ikke er så nyttig, har dens anvendelser).
- Multiplikation med Time.deltaTime er stadig en god idé i FixedUpdate. Det giver dig mulighed for at udtrykke ting som hastigheder i " enheder pr. Sekund " i stedet for " enheder pr. kryds ", og hvis du ændrer din faste tidsplan, vinder du ' t nødt til at gå tilbage og genindstille alle dine parametre for at samme hastigheder. Fordelen i FixedUpdate er, at Time.deltaTime altid returnerer den stabile fixedDeltaTime, når der er adgang til den fra FixedUpdate, snarere end at få et variabelt resultat hver frame baseret på framerate og tidsskalering, som det gør i Update.
Svar
De kører faktisk alle på samme tid, dine scripts gør bare ting i disse funktioner. Opdatering kaldes en gang pr. frame og FixedUpdate kaldes en gang hver “fysikopdatering” (som er en gang hver faste tid, som du kan justere).
Der er også LateUpdate , hvis du vil have visse funktioner til at køre efter opdateringsfunktionen for denne referenceramme. For en komplet liste over meddelelser, se MonoBehaviour reference.
Her “er et link til Enhedsvejledning, der dækker dette .
Kommentarer
- Fysikopdatering kan kontrolleres? Jeg mener, at hvis jeg indstiller Fixed TimeStep til en værdi, kører den faste opdatering efter det tidspunkt? og spilfysikken fungerer også efter den tid?
- @ MuhammadFaizanKhan Det skal være sådan, det fungerer. Jeg ' er dog ikke sikker i den aktuelle version af Unity, det var sådan, det var, da jeg skrev svaret. Grundlæggende opdateres opdatering hver ramme, og fysik har sin egen billedhastighed og opdateringsfunktion adskilt fra den anden opdateringsfunktion.
Svar
Det er sikkert at bruge Update (), FixedUpdate () og LateUpdate () alt sammen i et script. I det mindste har jeg det og har aldrig haft nogen problemer.Jeg bruger generelt Update () til mine hovedsløjfer, FixedUpdate () til ting som fysik og LateUpdate () til sløjfer, som jeg vil udføre efter alt andet.