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.