Fizik için FixedUpdate
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 4 / 63.
Unity, kare saniyede 0,02 saniyelik (Time.fixedDeltaTime) sabit fizik adımlarında, kare hızından bağımsız olarak, saniyede 50 kez cisimleri hareket ettirir. FixedUpdate() her adımdan hemen önce çalışır. Update() çizilen her karede bir kez çalışır ve bu saniyede 30, 60 veya 144 kez olabilir: 144 karede çoğu karede hiç fizik adımı olmaz; yavaş bir bilgisayarda ise tek bir karede iki adım olabilir.
Bundan iki kural çıkar. Update() içinde eklenen bir kuvvet kare başına bir kez eklenir, dolayısıyla daha hızlı bir bilgisayar daha güçlü iter: zaman içinde etki eden kuvvetler FixedUpdate() içinde uygulanmalıdır. Ayrıca GetKeyDown yalnızca tek bir kare boyunca true olur; bu karede fizik adımı yoksa FixedUpdate() bunu hiç görmez ve tuşa basış kaybolur. Bu yüzden tuşa basışları Update() içinde oku, bir bool içinde hatırla ve FixedUpdate() içinde uygula. Bu tekne sabit bir rüzgârla itilir ve tıklamayla yana doğru hamle yapar:
private bool dashQueued;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
dashQueued = true; // tıklamayı hatırla
}
}
void FixedUpdate()
{
rb.AddForce(Vector3.forward * wind); // her adımda sabit bir itme
if (dashQueued)
{
rb.AddForce(Vector3.right * 4f, ForceMode.Impulse);
dashQueued = false; // bir tıklama, bir atılma
}
}Bool değerini kullandıktan sonra temizlemek önemlidir: true olarak bırakılırsa her adımda hamle yapar. Kurbağanın zıplayışında olduğu gibi, tek bir darbe doğrudan Update() içinden de eklenebilir; bool, her itmeyi tek bir yerde, etki ettiği kuvvetlerin yanında tutar. Basılı tutulan tuşlar (GetKey, GetAxis) bir anı değil, bir durumu ifade eder; bu nedenle FixedUpdate() bunları doğrudan okuyabilir. FixedUpdate() içinde Time.deltaTime, adımın 0,02 değerini döndürür.
Görev
KolayDonmuş göldeki kızak için her iki görev de yanlış yöntemde. Ok tuşları kızağı Update() içinde itiyor, bu yüzden daha hızlı bilgisayarlarda daha sert itiliyor. Boşluk tuşu, FixedUpdate() içinde bir dürtüyle zıplatıyor, bu yüzden bazı basışlar hiçbir şey yapmıyor.
- Ok tuşlarıyla itmeyi
FixedUpdate()içine taşı. - Boşluk tuşunu
Update()içindehopPressedadlı birbooldeğişkenine oku;FixedUpdate()içinde bu değer ayarlanmışsa zıplat, sonra sıfırla.
Play'e bas ve ikisini de dene, ardından Check'e bas.
Kendin dene
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);
}
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Fizik ve Oynanış bölümündeki tüm dersler
1Rigidbody
Yerçekimi ve KütleAddForce ile İtmeDürtüyle ZıplamaFizik için FixedUpdateHızKinematik CisimlerTekrar: Fırlatma Rampası2Çarpışmalar
OnCollisionEnterNeye Çarptım?Çarpınca KırılYerde DurmakSekme ve SürtünmeCollider ŞekilleriTekrar: Kırılabilir Duvar