Unity'deki Update ve FixedUpdate arasındaki fark nedir ve rahatsız etmeliyim?


10

Update()Grafikler ve FixedUpdate()fizik için kullanmam söylendi , ancak bazen girdilerim kullandığımda kayıt olmuyor FixedUpdate(). Yine Update()de her şey için kullanırsanız iyi çalışır .

Rahatsız mı etmeliyim FixedUpdate()yoksa yanlış bir şey mi yapıyorum?

Yanıtlar:


10

FixedUpdateUpdateayarlarınıza bağlı olarak daha hızlı veya daha yavaş çalışabilir . Bu, yüke (ne kadar hızlı Updateçalıştığına) ve ayarladığınız hıza FixedUpdate(Düzenle-> Proje Ayarları-> Zaman bölümünde bulunur) bağlıdır. İdeal olarak, Updateçerçeve başına bir kez çalıştırıldığından, girişi yakalamak istediğiniz yer burasıdır. Eğer FixedUpdateyöntemdeki girdiye göre hareket etmeniz gerekiyorsa (fizik gövdelerini kontrol etmek gibi), bayrakları yerleştirin ve Updateardından bunları ele alın FixedUpdate:

bool leftMouseDown = false;

void Update()
{
    if(Input.GetMouseButtonDown(0))
        leftMouseDown = true;
}

void FixedUpdate()
{
    if(leftMouseDown )
    {
        //update physics bodies with input
        leftMouseDown = false;
    }
}

Fiziği FixedUpdateyöntemden kontrol etmek hala iyi bir fikirdir , çünkü fiziğin sık sık güncellenmesi gerekmemektedir ve sabit bir güncellemedeki fiziğin (güncelleme ) değişken bir güncellemedeki fiziğe göre tahmin edilmesi ( determinizm ) çok daha kolaydır .


Bool koşulu yerine (es.GetMouseButtonDown) bir eksenden (Input.GetAxis ("Horizontal")) değer okumamız gerekiyorsa ne olur? Güncelleme FixedUpdate'den daha fazla yürütülürse, bu durumda tavsiyeniz nedir? Sonunda, birkaç Güncelleme sırasında Güncelleme'ye geçmeden önce meydana gelen eksenin ortalama değerini hesaplamayı düşünmeli miyiz? (+1 btw)
Heisenbug

FixedUpdate'imin ne kadar hızlı olduğunu nasıl öğrenebilirim?
Tokamocha

1
@Tokamocha Sabit güncelleme hızı Düzenle-> Proje Ayarları-> Saat'te ayarlanır.
MichaelHouse

@Heisenbug Şahsen ben sadece son değeri kullanmak ve ne kadar iyi çalıştığını görmek istiyorum. Beklenmedik sonuçlar alırsam, işlenene kadar eksen değerinin çalışan bir ortalamasını hesaplayabilirim FixedUpdate. Bu "neyin doğru" olduğunu gerçekten anlamak için oyun testine ihtiyaç duyan şeylerden biri.
MichaelHouse

1
Son testlerde, dokümanlarda ima edilenin aksine, yeni giriş bayraklarının FixedUpdate'de (en azından PC'de) zaten mevcut olduğunu buldum. Bu nedenle, Güncelleme'de bir bayrak ayarlamak ve daha sonra burada gösterildiği gibi bir sonraki FixedUpdate üzerinde hareket etmek (yani bir sonraki kare) oyuna, FixedUpdate'deki girişi doğrudan işleme göre aslında bir gecikme çerçevesi ekleyebilir. Bu, birden fazla FixedUpdate içeren karelerde çift işlem girdisi veya FixedUpdate içermeyen karelerde eksik girdileri önlemek için biraz dikkat gerektirir .
DMGregory

7

Her birinin ne yaptığını anlamalısınız. Update()her iki durumda da mümkün olduğunca sık çağrılır (emin değil, belki de kapatılabilir). FixedUpdate()her sabit zamanda çağrılır (dolayısıyla "sabit").

Giriş Update()bu kadar basit olur (çünkü fark ettiğiniz gibi FixedUpdate()input olayını yakalayamayabilir). Ancak oyun mantığı bunlardan birine girebilir. Fiziğin deterministik olması gerekir ve bu yüzden içinde olması gerekir FixedUpdate(). Başka şeyler yapmak zorunda değilsiniz. Kullanıma bağlı olarak hangi işlevin uygun olduğuna karar vermelisiniz.

Bununla birlikte, bazı uygulamaların tüm oyun mantık güncellemelerine FixedUpdate()(hatta dışında Unity) sahip olduğunu söylemeye değer - buna "sabit adım oyun döngüsü" denir. Tüm güncelleme kodunun sabit bir adım işlevine sahip olması, determinizm sağlar ve uygulamanızın her seferinde (ve her cihazda) aynı şekilde davranma olasılığını artırır. Ayrıca tekrarlar gibi bazı süslü özelliklere de izin verir.


Yani, her şeyi FixedUpdate () 'e koyarsam, oyunum hala tüm girdileri kaydeder, değil mi?
Tokamocha

1
Hayır, tüm oyun mantık güncellemelerini oraya koyabilirsiniz, ancak giriş kontrolünü yapamazsınız.
NPS

2
bu cevap eksik bilgilerle doludur. Öncelikle FixedUpdate 1 / fixedDeltaTime kez başına çağrılan ikinci değil her n: inci fixedDeltaTime. İkincisi, oyun mantığı her zaman FixedUpdate'e gitmeli, çünkü bu sebep daha kolay. Güncelleme yalnızca oluşturma amaçlıdır (Unity topluluğunda neredeyse hiç kimsenin bunu takip etmediğini biliyorum, ancak gerçekten böyle yapılması gerekiyordu). Üçüncüsü, FixedUpdate ve fizik motoru ile olan ilişkisinin determinizmle hiçbir ilgisi yoktur.
thr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.