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.
Tantangan
MudahTempatkan dua tugas kereta luncur di method yang tepat.
- Pindahkan dua blok
ifpanah dariUpdate()keFixedUpdate(). - Tambahkan
private bool hopPressed;. DiUpdate(), atur nilainya menjaditruesaatInput.GetKeyDown(KeyCode.Space). - Di
FixedUpdate(), saathopPresseddiatur, tambahkan impuls, lalu atur nilainya menjadifalse.
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
1Rigidbody
Gravitasi dan MassaDorong dengan AddForceMelompat dengan ImpulsFixedUpdate untuk FisikaKecepatanBenda KinematikRingkasan: Landasan Peluncur4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine PertamamuPerulangan dalam CoroutineMenghentikan CoroutineRangkuman: Hitung Mundur10Proyek: Kabur dari Arena
ArenaPara Pemburu2Tabrakan
OnCollisionEnterApa yang Kutabrak?Pecah Saat BenturanBerdiri di Atas TanahPantulan dan GesekanBentuk ColliderRangkuman: Dinding yang Bisa HancurLatihan sendiri: Playground Unity