Știu câteva diferențe între Update()
și FixedUpdate()
și recent am folosit ambele funcții într-un singur script. Codul funcționează, dar am o întrebare:
Utilizarea ambelor funcții cauzează probleme? Este sigur să le utilizați pe amândouă?
Răspundeți
Actualizați comanda
Când urmăriți logica jocului și interacțiunile, animațiile, pozițiile camerei etc., puteți utiliza câteva evenimente diferite. Modelul obișnuit este acela de a efectua majoritatea activităților din cadrul funcției Actualizare, dar există și alte funcții pe care le puteți utiliza.
FixedUpdate:
FixedUpdate este deseori apelat mai frecvent decât Actualizare.
Poate fi numit de mai multe ori pe cadru dacă rata cadrelor este scăzută și nu poate fi apelată deloc între cadre dacă rata cadrelor este mare. Toate calculele fizice și actualizările au loc imediat după FixedUpdate. Când aplicați calcule de mișcare în FixedUpdate, nu este necesar să vă multiplicați valorile cu Time.deltaTime.
FixedUpdate este apelat pe un temporizator de încredere, independent de frame rate
.
Actualizare:
Actualizarea este apelată o dată pe cadru. Este funcția principală de lucru pentru actualizările de cadre.
LateUpdate:
LateUpdate este apelat o dată pe cadru după finalizarea actualizării.
Orice calcule efectuate în Update se vor finaliza la începutul LateUpdate. O utilizare obișnuită pentru LateUpdate ar fi următoarea cameră de persoană terță. Dacă vă faceți personajul să se miște și să vă întoarceți în Update, puteți efectua toate calculele mișcării și rotației camerei în LateUpdate. Acest lucru vă va asigura că personajul s-a deplasat complet înainte ca camera să-și urmărească poziția.
Pentru a utiliza actualizarea fixă, actualizarea și actualizarea târzie simultan sunt sigure.
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); } }
Comentarii
- Răspuns excelent! S-ar putea să merite să includeți faptul că puteți crea o coroutină care așteaptă FixedUpdate înainte de a executa; pornirea acestei coroutine de la o metodă de pornire efectivă vă oferă un LateFixedUpdate (care, deși nu este la fel de util, își are utilizările).
- Înmulțirea cu Time.deltaTime este încă o idee bună în FixedUpdate. Vă permite să exprimați lucruri precum viteze în " unități pe secundă " în loc de " pe bifă " și dacă vă schimbați intervalul de timp fix, ați câștigat ' nu trebuie să vă întoarceți și să vă reglați toți parametrii pentru a obține aceleași viteze. Avantajul în FixedUpdate este că Time.deltaTime returnează întotdeauna fixedDeltaTime stabil atunci când este accesat din FixedUpdate, mai degrabă decât să obțină un rezultat variabil la fiecare cadru bazat pe framerate și pe scala de timp, așa cum se întâmplă în Update.
Răspuns
De fapt, toate rulează în același timp, scripturile dvs. fac doar lucruri în acele funcții. Actualizarea se numește o dată pe cadru, iar FixedUpdate se numește o dată la fiecare „actualizare fizică” (care este o dată la fiecare perioadă fixă de timp pe care o puteți ajusta).
Există și LateUpdate , dacă doriți ca anumite funcții să ruleze după funcția de actualizare a acelui cadru de referință. Pentru o listă completă de mesaje, consultați referința MonoBehaviour .
Aici este un link către Tutorial Unity care acoperă acest lucru .
Comentarii
- Actualizarea fizică este controlabilă? Adică dacă setez Fixed TimeStep la o anumită valoare, atunci Fixed Update va rula după acel moment? și fizica jocului va funcționa și după acea perioadă de timp?
- @MuhammadFaizanKhan Așa ar trebui să funcționeze. ' nu sunt sigur în versiunea curentă a Unity, totuși, așa a fost când am scris răspunsul. Practic, actualizarea este actualizată la fiecare cadru, iar fizica are propria sa rată de cadre și funcția de actualizare separată de cealaltă funcție de actualizare.
Răspuns
Este sigur să folosiți Update (), FixedUpdate () și LateUpdate () toate într-un singur script. Cel puțin așa am făcut și nu am avut niciodată probleme.În general, voi folosi Update () pentru buclele mele principale, FixedUpdate () pentru lucruri precum fizica și LateUpdate () pentru bucle pe care vreau să le execut după toate celelalte.