Tudok néhány különbséget Update()
és FixedUpdate()
és a közelmúltban mindkét függvényt egy szkriptben használtam. A kód működik, de van egy kérdésem:
Mindkét funkció használata okoz-e problémát? Biztonságos mindkettőt használni?
Válasz
Rendelés frissítése
Ha nyomon követi a játék logikáját és az interakciókat, az animációkat, a kamera helyzetét stb., akkor néhány különböző eseményt használhat. A közös minta az, hogy a legtöbb feladatot az Update függvényben hajtják végre, de vannak más funkciók is, amelyeket használhat.
FixedUpdate:
A FixedUpdate-et gyakran gyakrabban hívják, mint az Update-et.
Képkockánként többször is meghívható, ha a képsebesség alacsony, és előfordulhat, hogy egyáltalán nem hívható meg a képkockák között, ha a képsebesség magas. Minden fizikai számítás és frissítés közvetlenül a FixedUpdate után történik. Amikor a FixedUpdate alkalmazásán belül mozgásszámításokat alkalmaz, nem kell szoroznia az értékeket a Time.deltaTime értékkel.
A FixedUpdate megbízható időzítőn van meghívva, függetlenül a képkockasebesség
.
Frissítés:
A frissítést kockánként egyszer kell meghívni. Ez a keretfrissítések fő munkalovas funkciója.
LateUpdate:
A LateUpdate kockánként egyszer meghívásra kerül, miután a frissítés befejeződött.
Az Update alkalmazásban végrehajtott számítások a LateUpdate kezdetekor befejeződnek. A LateUpdate általánosan használt eszköze egy harmadik személy fényképezőgépének használata. Ha mozgatja és megfordítja a karaktert az Update-en belül, akkor a LateUpdate alkalmazásban elvégezheti a kamera összes mozgásának és forgatásának számítását. Ez biztosítja, hogy a karakter teljesen elmozdult, mielőtt a kamera követi a helyzetét.
A Fix frissítés, a Frissítés és a Késői frissítés egyidejű használata biztonságos.
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); } }
Megjegyzések
- Kiváló válasz! Érdemes lehet, hogy létrehozhat egy olyan korutint, amely a végrehajtás előtt megvárja a FixedUpdate-t; Ha a koroutint egy start módszerből indítja, az effektivley egy LateFixedUpdate-t kap (amely ugyan nem annyira hasznos, de felhasználható).
- A FixedUpdate alkalmazásban még mindig jó ötlet a Time.deltaTime-szel való szorzás. Ez lehetővé teszi a sebességek " másodpercenként " kifejezését " egységek helyett pipánként " és ha megváltoztatja a rögzített időintervallumot, akkor ' nem kell visszamennie, és újra kell hangolnia az összes paramétert, hogy megkapja a azonos sebességgel. A FixedUpdate előnye, hogy a Time.deltaTime mindig visszaadja a stabil fixDeltaTime-et, amikor a FixedUpdate-ről érhető el, ahelyett, hogy minden képkockánként változó eredményt kapna a framerate és az időskálázás alapján, ahogy az Update-ben.
Válasz
Valójában mind egyszerre futnak, a szkriptjei csak ezeket a funkciókat látják el. A Frissítést képkockánként egyszer, a FixedUpdate programot minden “fizikai frissítésben” egyszer meghívják (ami egyszer minden rögzített időtartam, amelyet beállíthat).
Van még LateUpdate , ha azt szeretné, hogy bizonyos funkciók fussanak az adott referenciakeret frissítési funkciója. Az üzenetek teljes listáját lásd a MonoBehaviour referenciában.
Itt található a Unity bemutató, amely ezt lefedi .
Megjegyzések
- A fizika frissítése vezérelhető? Úgy értem, ha a Fixed TimeStep értéket valamilyen értékre állítom, akkor a Fix Update ezen idő után fut? és a játékfizika is működni fog ennyi idő után?
- @MuhammadFaizanKhan Így kell működnie. ' azonban nem vagyok biztos a Unity jelenlegi verziójában, de a válasz megírásakor ez volt a helyzet. Alapvetően a frissítés minden képkockán frissül, és a fizikának megvan a saját képkockasebessége és frissítési funkciója, külön a másik frissítési funkciótól.
Válasz
Biztonságos az Update (), a FixedUpdate () és a LateUpdate () egy parancsfájlban történő használata. Legalábbis nekem van, és soha nem voltak problémáim.A legfrissebb ciklusokhoz általában az Update () -t használom, a fizikai dolgokhoz a FixedUpdate () -t, a hurokhoz pedig a LateUpdate () -t, amelyet minden más után végre akarok hajtani.