FixedUpdate untuk Fisika
Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 4 dari 63.
Unity menggerakkan body dalam langkah fisika tetap selama 0.02 detik (Time.fixedDeltaTime), 50 kali per detik, berapa pun frame rate-nya. FixedUpdate() berjalan tepat sebelum setiap langkah. Update() berjalan sekali per frame yang digambar, dan bisa berjalan 30, 60, atau 144 kali per detik: pada 144, sebagian besar frame tidak memiliki langkah fisika sama sekali, dan pada komputer yang lambat, satu frame bisa memuat dua langkah.
Ada dua aturan yang berlaku. Gaya yang ditambahkan di Update() ditambahkan sekali per frame, jadi komputer yang lebih cepat mendorong lebih kuat: gaya yang bekerja seiring waktu harus ditambahkan di FixedUpdate(). Lalu, GetKeyDown hanya bernilai true selama satu frame; jika frame itu tidak memiliki langkah fisika, FixedUpdate() tidak akan melihatnya dan tekanannya hilang. Jadi, baca penekanan tombol di Update(), simpan dalam bool, lalu tindak lanjuti di FixedUpdate(). Perahu ini didorong angin yang stabil dan melesat ke samping saat diklik:
private bool dashQueued;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
dashQueued = true; // ingat kliknya
}
}
void FixedUpdate()
{
rb.AddForce(Vector3.forward * wind); // dorongan konstan di setiap langkah
if (dashQueued)
{
rb.AddForce(Vector3.right * 4f, ForceMode.Impulse);
dashQueued = false; // satu klik, satu lesatan
}
}Mengatur bool kembali ke false setelah digunakan itu penting: jika dibiarkan true, perahu akan melesat pada setiap langkah. Satu impuls juga bisa langsung ditambahkan dari Update(), seperti lompatan katak; bool membuat semua dorongan berada di satu tempat, berdekatan dengan gaya yang bekerja bersamanya. Tombol yang ditahan (GetKey, GetAxis) menggambarkan keadaan, bukan suatu momen, jadi FixedUpdate() bisa membacanya secara langsung. Di dalam FixedUpdate(), Time.deltaTime mengembalikan nilai 0.02 untuk langkah tersebut.
Tantangan
MudahSled di danau beku menjalankan kedua tugasnya di method yang salah. Tombol panah mendorongnya di Update(), sehingga dorongannya lebih kuat di komputer yang lebih cepat. Tombol Spasi membuatnya melompat dengan impuls di FixedUpdate(), sehingga beberapa kali penekanan tidak berpengaruh.
- Pindahkan dorongan dari tombol panah ke
FixedUpdate(). - Baca tombol Spasi di
Update()ke dalamboolbernamahopPressed; diFixedUpdate(), buat sled melompat saat nilainya aktif, lalu kosongkan kembali.
Tekan Play dan coba keduanya, lalu tekan Check.
Coba sendiri
using UnityEngine;
public class Sled : MonoBehaviour
{
public float push = 6f;
public float hop = 5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKey(KeyCode.RightArrow))
{
rb.AddForce(Vector3.right * push);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
rb.AddForce(Vector3.left * push);
}
}
void FixedUpdate()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * hop, ForceMode.Impulse);
}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Fisika dan Gameplay
1Rigidbody
Gravitasi dan MassaDorong dengan AddForceMelompat dengan ImpulsFixedUpdate untuk FisikaKecepatanBenda KinematikRingkasan: Landasan Peluncur2Tabrakan
OnCollisionEnterApa yang Kutabrak?Pecah Saat BenturanBerdiri di Atas TanahPantulan dan GesekanBentuk ColliderRangkuman: Dinding yang Bisa Hancur