Saya akan menulis ini sebagai komentar, tetapi akhirnya menjadi agak panjang lebar jadi saya mengubahnya menjadi jawaban.
Jawaban saat ini sebagian besar benar, tetapi beberapa hal yang disebutkan menyesatkan / salah.
Secara umum, sebagian besar tugas terkait permainan akan masuk Update
.
Misalnya, Anda tidak ingin polling untuk input FixedUpdate
(bukan karena kinerja, tetapi karena panggilan tidak akan berfungsi dengan benar). AI jatuh di kapal yang sama.
Fisika yang terus diperbarui adalah satu - satunya tugas terkait gameplay yang FixedUpdate
harus digunakan. Panggilan tidak kontinu / sesekali untuk hal-hal seperti Physics.Raycast
, atau bahkan Rigidbody.AddForce
termasuk Update
. Penyebutan saya Rigidbody.AddForce
tampaknya bertentangan dengan apa yang mungkin tersirat oleh dokumentasi, tetapi kuncinya adalah Kontinu vs Non-kontinu.
Salah satu alasan besar mengapa hanya fisika kontinu yang termasuk dalam FixedUpdate
adalah sifat sebenarnya FixedUpdate
. Jawaban lain telah menyebutkan bagaimana FixedUpdate disebut pada fixed interval, but that's slightly misleading. In reality, a script is passed a time in Time.deltaTime
/ Time.fixedDeltaTime
* yang tidak berhubungan langsung dengan waktu aktual antar panggilan, melainkan waktu simulasi antar panggilan.
(* Time.deltaTime
dan Time.fixedDeltaTime
memiliki nilai yang sama ketika dipanggil FixedUpdate
[Unity dapat mengetahui apakah panggilan saat ini Time.deltaTime
berasal selama FixedUpdate
dan kembali Time.fixedDeltaTime
])
Secara alami cara yang sama Update
tidak dapat dipanggil secara konstan karena kinerja yang bervariasi, juga tidak bisa FixedUpdate
. Perbedaan utama adalah, setiap frame, jika FixedUpdate
belum dipanggil cukup sering untuk rata-rata ke interval yang benar antara panggilan, itu dipanggil beberapa kali (atau tidak disebut rata-rata terlalu tinggi). Inilah yang dirujuk oleh dokumen tentang Perintah Eksekusi dengan mengatakan bahwa FixedUpdate dapat disebut beberapa kali dalam satu frame:
... FixedUpdate: FixedUpdate sering disebut lebih sering daripada Pembaruan. Ini dapat disebut beberapa kali per frame, jika frame rate rendah dan mungkin tidak dipanggil antara frames sama sekali jika frame rate tinggi ...
Ini tidak mempengaruhi Fisika karena sifat dari sisa urutan eksekusi dan mesin, tetapi apa pun yang Anda masukkan FixedUpdate
akan terpengaruh, dan itu akan menyebabkan masalah.
Misalnya, jika Anda memasukkan pemrosesan AI ke dalam, FixedUpdate
tidak ada alasan untuk menganggap bahwa AI tidak akan melewatkan pembaruan untuk beberapa frame secara berturut-turut. Selain itu, setiap kali `FixedUpdate tertinggal, AI Anda akan diperbarui beberapa kali dalam satu frame sebelum hal-hal seperti input dan pergerakan pemain diproses, yang merupakan pemborosan pemrosesan paling tidak, tetapi juga sangat mungkin menyebabkan hard untuk melacak bug dan perilaku tidak menentu.
Jika Anda perlu melakukan sesuatu pada interval tetap gunakan metode lain Unity menyediakan seperti Coroutines
dan InvokeRepeating
.
Dan catatan kecil di Time.deltaTime
dan kapan menggunakannya:
Cara termudah untuk menggambarkan efek Time.deltaTime adalah mengubah angka dari unit per frame, ke unit per detik . Misalnya, jika Anda memiliki skrip dengan sesuatu seperti transform.Translate(Vector3.up * 5)
di Pembaruan, Anda pada dasarnya memindahkan transformasi dengan kecepatan 5 meter per frame . Itu berarti jika framerate rendah gerakannya lebih lambat, dan jika framerate tinggi, gerakannya lebih cepat.
Jika Anda mengambil kode yang sama dan mengubahnya transform.Translate(Vector3.up * 5 * Time.deltaTime)
, objek dipindahkan dengan kecepatan 5 meter per detik . Itu berarti tidak peduli framerate, objek akan bergerak 5 meter setiap detik (tetapi semakin lambat framerate, semakin lompat pergerakan objek akan muncul karena masih bergerak dalam jumlah yang sama setiap X detik)
Secara umum, Anda ingin gerakan Anda menjadi per detik. Dengan cara itu, tidak peduli berapa kecepatan komputer berjalan, fisika / gerakan Anda akan berperilaku dengan cara yang sama, dan Anda tidak akan menemukan bug aneh muncul di perangkat yang lebih lambat.
Dan tidak ada gunanya menggunakannya FixedUpdate
. Karena apa yang saya sebutkan di atas, Anda akan mendapatkan nilai yang sama setiap panggilan (nilai Pembaruan Tanda Waktu Tetap), dan tidak akan melakukan apa pun terhadap nilai Anda. Gerakan / Fisika yang didefinisikan dalam FixedUpdate
akan menjadi dalam satuan per detik sehingga Anda tidak membutuhkannya.
Update
dipanggil lebih jarang, dan simulasi Anda akan sangat menderita karenanya. Anda mungkin tidak memperhatikan sementara simulasi itu sederhana, tetapi itu akan dengan mudah pecah ketika tidak.Dari: http://unity3d.com/learn/tutorials/modules/beginner/scripting/update-and-fixedupdate
Langkah waktu yang digunakan dalam FixedUpdate bukan variabel.
Jika gim Anda mulai ketinggalan, saat mengejar ketinggalan, Anda tidak ingin> 10 detik fisika dalam satu pembaruan, sehingga biasanya dilakukan di FixedUpdate yang disebut dengan interval tetap.
Sebagai contoh:
Dimana:
sumber
FixedUpdate
tidak benar-benar dipanggil pada interval tetap. Sifat sebenarnyaFixedUpdate
adalah memeras beberapa siklus fisika ke dalam satu bingkai jika permainan Anda mulai melambat dan melompati siklus jika itu berjalan terlalu cepat sehingga rata-rata bekerja dengan Timestep Pembaruan Tetap. Unity tidak multi-threaded, jadi tidak ada cara untuk menjamin panggilan FixedUpdate pada interval tetap (Apa yang terjadi ketika satu FixedUpdate memakan waktu terlalu lama). Bahkan jika itu mungkin masih hampir mustahil.Update
disebut secepat mungkin. Variabel 'Time.deltaTime' diatur ke jumlah waktu aktual yang berlalu sejak panggilan terakhir. Jika lag atau sesuatu yang serupa memperlambat permainan,Update
masih akan dipanggil hanya sekali lag berakhir, dengan nilai tinggideltaTime
.FixedUpdate
disebut secara berkala. Itu tidak akan pernah dipanggil lebih sering daripada rasio yang ditentukan dalam 'Time.fixedDeltaTime'. Jika lag atau sesuatu yang serupa memperlambat permainan,FixedUpdate
akan dipanggil beberapa kali berturut-turut dengan cepat untuk memungkinkan game mengejar ketinggalan.Time.deltaTime
diatur sama denganTime.fixedDeltaTime
sebelumFixedUpdate
dijalankan, tetapi ini hanya fudge untuk membuatnya mudah untuk melakukan migrasi kode di antara keduanya.Secara umum,
Update
harus digunakan untuk perilaku interpolable danFixedUpdate
untuk perilaku yang harus dihitung selangkah demi selangkah, atau yang tergantung pada yang melakukannya, seperti gerakan berbasis fisika. Jika Anda menulis segala jenis loop diUpdate
sepanjang baris untukfor(time=0;time<=deltaTime;time+=someStep)...
maka Anda mungkin harus melakukannya di FixedUpdate.sumber