Menu
CoddyTech

FixedUpdate untuk Fisika

Termasuk bagian Fisika dan Gameplay dalam perjalanan Unity di Coddy. Pelajaran 4 dari 71.

Unity menggerakkan benda 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 itu bisa 30, 60, atau 144 kali per detik: pada 144, sebagian besar frame sama sekali tidak memiliki langkah fisika, sedangkan pada komputer lambat, satu frame bisa memuat dua langkah.

Ada dua aturan yang berlaku. Gaya yang ditambahkan dalam Update() ditambahkan sekali per frame, jadi komputer yang lebih cepat memberikan dorongan lebih kuat: gaya yang bekerja seiring waktu harus ditambahkan di FixedUpdate(). Dan GetKeyDown bernilai true hanya selama satu frame; jika frame itu tidak memiliki langkah fisika, FixedUpdate() tidak akan melihatnya dan penekanan tombol itu 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 tetap di setiap langkah
    if (dashQueued)
    {
        rb.AddForce(Vector3.right * 4f, ForceMode.Impulse);
        dashQueued = false;   // satu klik, satu gerakan cepat
    }
}

Mengosongkan bool setelah menggunakannya itu penting: jika dibiarkan true, perahu akan melesat pada setiap langkah. Satu impuls juga bisa langsung ditambahkan dari Update(), seperti lompatan katak; bool menjaga agar semua dorongan berada di satu tempat, berdampingan dengan gaya yang berinteraksi dengannya. Tombol yang ditahan (GetKey, GetAxis) menunjukkan keadaan, bukan satu momen, jadi FixedUpdate() bisa membacanya secara langsung. Di dalam FixedUpdate(), Time.deltaTime mengembalikan nilai 0.02 untuk langkah tersebut.

challenge icon

Tantangan

Mudah

Tempatkan dua tugas kereta luncur di method yang tepat.

  1. Pindahkan dua blok if panah dari Update() ke FixedUpdate().
  2. Tambahkan private bool hopPressed;. Di Update(), atur nilainya menjadi true saat Input.GetKeyDown(KeyCode.Space).
  3. Di FixedUpdate(), saat hopPressed diatur, tambahkan impuls, lalu atur nilainya menjadi false.

Tekan tombol “Main”: panah mendorong secara merata, dan setiap kali menekan tombol Space, kereta melompat. Lalu tekan tombol “Periksa”.

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);
        }
    }
}

Semua pelajaran di Fisika dan Gameplay

Latihan sendiri: Playground Unity