Menu
CoddyTech

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.

challenge icon

Görev

Kolay

Donmuş 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çinde hopPressed adlı bir bool değ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);
        }
    }
}
quiz iconKendini test et

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