Znám určité rozdíly mezi Update() a FixedUpdate() a nedávno jsem použil obě funkce v jednom skriptu. Kód funguje, ale mám otázku:

Způsobuje použití obou těchto funkcí nějaké problémy? Je bezpečné je používat oba?

Odpověď

Aktualizovat objednávku

Když sledujete logiku hry a interakce, animace, pozice kamery atd., můžete použít několik různých událostí. Běžným vzorem je provádění většiny úkolů uvnitř funkce Update, ale můžete použít i další funkce.

FixedUpdate:

FixedUpdate se často nazývá častěji než Update.

Lze jej volat vícekrát na snímek, pokud je snímková frekvence nízká, a nemusí být volána mezi snímky vůbec, pokud je snímková frekvence vysoká. Všechny fyzikální výpočty a aktualizace se vyskytnou bezprostředně po FixedUpdate. Při použití výpočtů pohybu uvnitř FixedUpdate nemusíte vynásobit své hodnoty pomocí Time.deltaTime.

FixedUpdate se volá na spolehlivém časovači, nezávisle na snímková frekvence

.

Aktualizace:

Aktualizace se volá jednou na snímek. Je to hlavní funkce pracovního nástroje pro aktualizace rámců.

LateUpdate:

LateUpdate se volá jednou na snímek po dokončení aktualizace.

Jakékoli výpočty prováděné v aktualizaci budou dokončeny, jakmile začne LateUpdate. Běžné použití pro LateUpdate by byla následující kamera třetí osoby. Pokud necháte svou postavu pohnout se a obrátit se uvnitř Update, můžete v LateUpdate provést všechny výpočty pohybu a rotace kamery. Tím zajistíte, že se postava úplně pohnula, než kamera sleduje její polohu.

Chcete-li používat Fixed Update, Update and Late Update současně je bezpečné.

 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); } } 

Komentáře

  • Excelentní odpověď! Možná by stálo za to zahrnout, že můžete vytvořit korutin, který čeká na FixedUpdate před provedením; spuštění tohoto procesu z metody startu effectivley vám dá LateFixedUpdate (který, i když není tak užitečný, má své využití).
  • Násobení časem. DeltaTime je stále dobrý nápad ve FixedUpdate. Umožňuje vám vyjádřit věci jako rychlosti v " jednotkách za sekundu " namísto " jednotek per tick " a pokud změníte svůj pevný časový krok, nebudete se muset ' vrátit zpět a znovu vyladit všechny své parametry, abyste získali stejné rychlosti. Výhodou v FixedUpdate je, že Time.deltaTime vždy vrací stabilní fixedDeltaTime při přístupu z FixedUpdate, místo toho, aby každý snímek vycházel z variabilního výsledku na základě framerate a časového měřítka, jak to dělá v Update.

Odpověď

Ve skutečnosti běží současně, vaše skripty v těchto funkcích prostě dělají věci. Aktualizace se volá jednou na snímek a FixedUpdate se volá jednou za každou „aktualizaci fyziky“ (což je jednou za každou pevně danou dobu, kterou můžete upravit).

K dispozici je také LateUpdate , pokud chcete, aby určité funkce běžely po funkce Update tohoto referenčního rámce. Úplný seznam zpráv najdete v odkazu MonoBehaviour .

Zde je odkaz na Výukový program Unity, který toto pokrývá .

Komentáře

  • Fyzikální aktualizaci lze ovládat? Mám na mysli, když nastavím Fixed TimeStep na nějakou hodnotu, bude po této době spuštěna opravená aktualizace? a fyzika hry bude fungovat i po tomto čase?
  • @MuhammadFaizanKhan Tak by to mělo fungovat. I ' si nejsem jistý v aktuální verzi Unity, bylo to tak, jak to bylo, když jsem napsal odpověď. Aktualizace se v zásadě aktualizuje každý snímek a fyzika má vlastní snímkovou frekvenci a aktualizační funkci odděleně od ostatních aktualizačních funkcí.

Odpovědět

Je bezpečné používat Update (), FixedUpdate () a LateUpdate () vše v jednom skriptu. Přinejmenším mám a nikdy jsem neměl žádné problémy.Obecně používám Update () pro mé hlavní smyčky, FixedUpdate () pro věci jako fyziku a LateUpdate () pro smyčky, které chci spustit po všem ostatním.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *