Bunu bir yorum olarak yazacaktım, ama oldukça uzun soluklaştı ve bu yüzden bir cevaba dönüştürdüm.
Mevcut cevaplar çoğunlukla doğrudur, ancak bahsedilen birkaç şey yanıltıcı / yanlıştır.
Genel olarak, oyunla ilgili görevlerin çoğu devreye girer Update
.
Örneğin, giriş için sorgulama yapmak istemezsiniz FixedUpdate
(performans nedeniyle değil, aramalar düzgün çalışmadığı için). AI aynı tekneye düşer.
Sürekli güncellenen fizik, oynanması gereken tek görevdir FixedUpdate
. Sürekli olmayan / arada bir gibi Physics.Raycast
, hatta Rigidbody.AddForce
ait olan şeylere çağrılar Update
. Bahsettiğim şey Rigidbody.AddForce
, belgelerin ima ettiği şeylere aykırı görünüyor, ancak anahtar Sürekli ve Sürekli Olmayan.
Sadece sürekli fiziğin dahil olmasının çok büyük bir nedeni FixedUpdate
, gerçek doğasıdır FixedUpdate
. Diğer cevaplar, sabit bir güncellemede interval, but that's slightly misleading. In reality, a script is passed a time in Time.deltaTime
( Time.fixedDeltaTime
*) doğrudan çağrılar arasındaki gerçek zamana değil, çağrılar arasındaki simüle edilmiş zamana karşılık gelen sabit bir / * olarak çağrıldığından bahsetmiştir .
(* Time.deltaTime
Ve Time.fixedDeltaTime
çağrılan aynı değeri vardır FixedUpdate
[Birlik söylemek mümkün olup olmadığını, geçerli çağrı Time.deltaTime
sırasında kökenli FixedUpdate
ve iadeler Time.fixedDeltaTime
])
Doğal olarak, aynı şekilde Update
değişen performans nedeniyle sabit bir şekilde çağrılamaz, ikisi de olamaz FixedUpdate
. Temel fark, her bir çerçeve, FixedUpdate
çağrılar arasındaki doğru aralığı ortalamaya yetecek kadar sık çağrılmamışsa, birden çok kez çağrılır (veya ortalamanın çok yüksek olduğu söylenmez). Bu nedir Yürütme Sipariş docs FixedUpdate birden kez bir çerçeve çağrılabilir olduğunu söyleyerek atıfta:
... FixedUpdate: FixedUpdate genellikle Güncelleme'den daha sık çağrılır. Kare hızı düşükse çerçeve başına birden çok kez çağrılabilir ve kare hızı yüksekse çerçeveler arasında hiç çağrılamayabilir ...
Bu, infaz emri ve motorun geri kalanının doğası nedeniyle Fiziği etkilemez, ancak koyduğunuz hemen hemen her şey FixedUpdate
etkilenir ve sorunlara neden olur.
Örneğin, AI işlemeyi içine koyarsanız FixedUpdate
, AI'nın arka arkaya birden fazla kare için güncellemeleri atlamayacağını varsaymak için hiçbir neden yoktur. Buna ek olarak, `FixedUpdate her geride kaldığında, fizik ve oyuncu girişi / hareketi gibi şeyler işlenmeden önce AI'nız tek bir karede birden çok kez güncellenir, bu da en azından işleme kaybıdır, ancak aynı zamanda zor neden olma olasılığı da yüksektir. hataları ve düzensiz davranışları izlemek için.
Eğer Birlik gibi sağlayan sabit bir aralık kullanımı, diğer yöntemlerle de bir şeyler yapmak gerekiyorsa Coroutines
ve InvokeRepeating
.
Ve Time.deltaTime
ne zaman ve ne zaman kullanılacağına dair küçük bir not :
Time.deltaTime'ın etkisini tanımlamanın en kolay yolu, bir sayıyı kare başına birimden saniyede birim olarak değiştirmesidir . Örneğin, transform.Translate(Vector3.up * 5)
Güncelleme'de olduğu gibi bir komut dosyanız varsa , dönüşümü kare başına 5 metre hızında hareket ettirirsiniz . Bu, kare hızı düşükse hareket daha yavaş ve kare hızı yüksekse, hareket daha hızlı demektir.
Aynı kodu alıp olarak değiştirirseniz transform.Translate(Vector3.up * 5 * Time.deltaTime)
, nesne saniyede 5 metre hızla taşınır . Bu, kare hızı ne olursa olsun, nesne saniyede 5 metre hareket edecektir (ancak kare hızı ne kadar yavaşsa, nesnenin hareketi o kadar hızlıdır çünkü her X saniyede bir aynı miktarda hareket eder)
Genel olarak, hareketinizin saniyede olmasını istiyorsunuz. Bu şekilde, bilgisayarın hızı ne olursa olsun, fizik / hareketiniz aynı şekilde davranır ve daha yavaş cihazlarda garip hatalar olmaz.
Ve onu kullanmanın bir anlamı yok FixedUpdate
. Yukarıda bahsettiğim için, her çağrıda aynı değeri (Sabit Güncelleme Zaman Aşımı değeri) alırsınız ve değerleriniz için hiçbir şey yapmaz. Tanımlanan Hareket / Fizik FixedUpdate
zaten saniyede birimler halinde olacak, buna ihtiyacınız yok.