Unityben minek a fixedupdate ha updateban is tudok olyan kódot írni ami fix időnként fut le?
úgy hogy időzítem. pl:
float perTime = 0.2;
float nextTime = Time.time + perTime;
void Update() {
....if(Time.time >= nextTime)
....{
........// Valami pl rb.AddForce
........nextTime = Time.time + perTime;
....}
}
Valami mélyebb oka kell,hogy legyen ennek a dolognak mert még azokban az esetekben is a fixedUpdate-ot javasolják ahol nem folyamatosan akarok lefuttatni valami fizika kódot pl ebben az esetben:
if(Input.GetKeyDown(KeyCode.Space))
....rb.AddForce(Vevtor2.up * force);
Az Update() olyan gyorsan hívódik meg amilyen gyorsan csak tud, a FixedUpdate() pedig fix időközönként. Azért kell fizikánál FixedUpdate() et használni, mert a Physx fix rendszerességgel frissül függetlenül attól, hogy az Update() ben futtatott kód végzett-e. Ha 2 fps ed van akkor is lefut a FixedUpdate() az előre megadott időközönként, meg ha 90 akkor is - ezért Fixed, nem próbál minél többet minél gyorsabban.
A kód amit írtál nem fix idő után futna le, ha tovább tart az Update() végére érni mint a Time.time + nextTime, akkor már elcsúsztál.
Az Input minden leütést regisztrál, írhatod bármelyikben, nem fog elveszni az adat.
Ezen felül még annyi, hogy ha feltétlen vágyad Update() ben írni mindent, akkor megteheted, de ahhoz hogy pontos legyen Time.deltaTime helyett Time.fixedDeltaTime ot kell használnod - ha FixedUpdate() ben hívod meg, akkor használhatod a Time.deltaTime ot is, ugyanannyit fog visszaadni mint a Time.fixedDeltaTime.
Én nem tudom, hogy a billentyűleütéssel mi a helyzet, de gondolom erre való a fixedUpdate:
Mondjuk van egy gravitációs motorod, amiben Euler integrátort használsz (pföjj), és szeretnéd időnként updatelni. Ha sima updatet használsz, lehet, hogy a lassú géped miatt beletelik 2 másodpercbe, míg kap egy olyat (fél fps-ed van), és akkor neked kell megoldani, hogy megfelelő felbontással futtassa az updateket a fizikai motoron, pl. 2 másodpercet elosztod 10ms-al, és akkor kijön, hogy jó, kaptál egy updatet, most lefuttatod a motor valódi update-jét 200-szor.
Ehelyett beregisztrálhatsz egy FixedUpdatet, és megcsinálja helyetted.
(nem unityzok, tehát nem tudom, de csak ez kéne, hogy legyen)
Értem de mivel azzal a fizika kóddal amit nem fix rendszerességgel szeretnék futtatni hanem csak akkor ha lenyomom a space gombot? És mi a helyzet azzal a verzióval amit akkor akarok lefutni folyamatosan ha ezt nyomva tartom.
Melyiket a fixedbe és miért?
A lenyomásra az azt jelenti, hogy a következő update-nél. Az, hogy melyik, azt most már te döntöd el (de ha megértetted, amit írtunk, akkor nem lesz nehéz).
Az, hogy valamit lenyomva tartasz, az gondolom vizsgálható az updaten belül. Így meg ki van egyszerűsívte az egészből az input.
#5
Pontosan ugyanúgy működik az Update() és a FixedUpdate() is, ha azt mondod, hogy if(Input.GetKeyDown(Keycode.Space)) vagy if(Input.GetKey(Keycode.Space)), akkor azt csak akkor fogja meghívni ha lenyomtad/nyomva tartod a gombot, nem fogja folyamatosan hívni minden alkalommal amikor lefut a FixedUpdate(). Az egyetlen különbség, hogy míg az Update() olyan gyorsan pörög amilyen gyorsan csak tud, addig a FixedUpdate() az előre megadott intervallumonként.
"Azért kell fizikánál FixedUpdate() ot használni, mert a Physx fix rendszerességgel frissül függetlenül attól, hogy az Update() ben futtatott kód végzett-e"
Nem értem ebből miért fontos,hogy hasznàljam a fixed verziót. Csak mert a fizika fix rendszerességgel frissül de ez miért ok rà?
Mert FixedUpdate() et akkor érdemes használni ha fizikával dolgozol - ahogy a példádban említett AddForce() esetében. Ez az egyetlen oka annak hogy létezik.
Ahogy írtam korábban csak annyi a különbség, hogy szinkronban van a fizikával, emiatt nem kell feleslegesen bonyolítanod a kódodat azzal, hogy ellenőrizd, hogy a fizika számítás megvolt-e már. Ha nincs köze a fizikához annak amit csinálsz nem kell FixedUpdate() et használnod egyáltalán - illetve akkor sem kell ha fizikát használsz, csak érdemes, mert sokkal egyszerűbb lesz az életed(meg gyorsabb a kódod, nem kell elvégezned még egyszer azokat az ellenőrzéseket amiket a Unity már elvégzett helyetted).
Megjegyzem van még LateUpdate() is, a többiről nem is szólva. Itt találsz leírást mindegyikhez:
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!