Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Sled 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 dalam bool bernama hopPressed; di FixedUpdate(), 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);
        }
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Fisika dan Gameplay