Apa perbedaan antara Update dan FixedUpdate di Unity, dan apakah saya harus repot?


10

Saya diberitahu untuk menggunakan Update()grafik dan FixedUpdate()fisika, tetapi terkadang input saya tidak akan mendaftar ketika saya menggunakannya FixedUpdate(). Ini berfungsi dengan baik jika saya gunakan Update()untuk semuanya.

Haruskah saya repot-repot FixedUpdate(), atau saya melakukan sesuatu yang salah?

Jawaban:


10

FixedUpdatedapat berjalan lebih cepat atau lebih lambat daripada Updatetergantung pada pengaturan Anda. Itu akan tergantung pada beban (seberapa cepat Updateberjalan) dan kecepatan yang telah Anda tetapkan untuk FixedUpdate(ditemukan di Edit-> Pengaturan Proyek-> Waktu). Idealnya, karena Updatedijalankan sekali per frame, ini adalah tempat Anda ingin mengambil input. Jika Anda perlu bertindak berdasarkan input dalam FixedUpdatemetode (seperti mengendalikan benda-benda fisika), atur tanda bendera Updatelalu pegang di FixedUpdate:

bool leftMouseDown = false;

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

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

Itu masih merupakan ide yang baik untuk mengendalikan fisika dari FixedUpdatemetode ini, karena fisika tidak mungkin perlu sering diperbarui, dan fisika pada pembaruan tetap jauh lebih mudah untuk diprediksi ( determinisme ) daripada fisika pada pembaruan variabel.


bagaimana kalau bukan kondisi bool (es.GetMouseButtonDown) kita perlu membaca nilai dari sumbu (Input.GetAxis ("Horizontal"))? Jika pembaruan dieksekusi lebih sering daripada FixedUpdate, apa saran Anda dalam kasus itu? Haruskah kita mempertimbangkan untuk menghitung nilai rata-rata sumbu yang terjadi selama beberapa Pembaruan sebelum mengkonsumsinya ke dalam Pembaruan? (+1 btw)
Heisenbug

Bagaimana cara mengetahui seberapa cepat FixedUpdate saya?
Tokamocha

1
@ Tokamocha Tingkat pembaruan tetap diatur dalam Edit-> Pengaturan Proyek-> Waktu.
MichaelHouse

@ Heisenbug Secara pribadi saya hanya akan menggunakan nilai terakhir dan melihat seberapa baik kerjanya. Jika saya mendapatkan hasil yang tidak terduga, saya dapat menghitung rata-rata berjalan dari nilai sumbu sampai diproses oleh FixedUpdate. Itulah salah satu hal yang perlu diuji coba untuk benar-benar mengetahui apa yang "terasa" benar.
MichaelHouse

1
Saya telah menemukan dalam tes baru-baru ini bahwa, bertentangan dengan apa yang tersirat dalam dokumen, bendera input baru sudah tersedia di FixedUpdate (setidaknya pada PC). Jadi pengaturan bendera di Perbarui dan kemudian bertindak di atasnya di FixedUpdate berikutnya setelah itu (yaitu frame berikutnya) seperti yang ditunjukkan di sini benar-benar dapat menambahkan bingkai latensi ke permainan, relatif untuk menangani input dalam FixedUpdate secara langsung. Ini memang membutuhkan beberapa perhatian meskipun untuk menghindari input penanganan ganda pada frame dengan beberapa FixedUpdates, atau input yang hilang pada frame tanpa FixedUpdate.
DMGregory

7

Anda perlu memahami apa yang dilakukan masing-masing. Update()dipanggil sesering mungkin (tidak yakin, mungkin dapat ditutup), baik - setiap frame. FixedUpdate()dipanggil setiap jumlah waktu yang konstan (karenanya "tetap").

Input masuk Update(), sesederhana itu (karena seperti yang Anda perhatikan FixedUpdate()mungkin tidak menangkap peristiwa input). Namun logika game mungkin masuk ke salah satunya. Fisika harus bersifat deterministik dan itulah mengapa ia harus ada FixedUpdate(). Hal-hal lain tidak harus. Bergantung pada penggunaan Anda harus memutuskan fungsi mana yang sesuai.

Meskipun perlu untuk mengatakan bahwa beberapa aplikasi memiliki semua pembaruan logika game di FixedUpdate()(bahkan di luar Unity) - itu disebut "loop permainan langkah tetap". Memiliki semua kode pembaruan dalam fungsi langkah tetap memberi Anda determinisme dan membuat aplikasi Anda lebih cenderung berperilaku dengan cara yang sama setiap kali (dan pada setiap perangkat). Juga memungkinkan untuk beberapa fitur mewah, seperti replay.


Jadi, jika saya meletakkan semuanya di FixedUpdate () game saya masih akan mendaftarkan semua input, kan?
Tokamocha

1
Tidak, Anda dapat menempatkan di sana semua pembaruan logika game tetapi tidak mengecek input.
NPS

2
jawaban ini penuh dengan informasi yang salah. Pertama-tama FixedUpdate dipanggil 1 / kali fixedDeltaTime per detik , tidak setiap n: fixedDeltaTime. Kedua, logika game harus selalu masuk dalam FixedUpdate karena membuatnya lebih mudah atau alasan. Pembaruan hanya untuk keperluan rendering (saya tahu hampir tidak ada orang di komunitas Unity yang mengikuti ini, tapi itulah yang seharusnya dilakukan). Ketiga, FixedUpdate dan hubungannya dengan mesin fisika tidak ada hubungannya dengan determinisme.
thr
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.