Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
C# Dersleri

Unity'de FixedUpdate: Fizik Hesaplamalarının Kalbi

Paylaşan: Unity Eğitim 09 December 2025 8 dakika okuma 137 görüntülenme

Unity oyun motorunda, akıcı ve gerçekçi fizik simülasyonları oluşturmak, oyununuzun kalitesi için kritik öneme sahiptir. Bu simülasyonların temelinde ise FixedUpdate() fonksiyonu yatar. Bu makalede, Unity FixedUpdate fonksiyonunun ne olduğunu, neden fizik hesaplamaları için vazgeçilmez olduğunu, Update() ile arasındaki farkları, yaygın hataları ve performans ipuçlarını detaylı bir şekilde inceleyeceğiz.

FixedUpdate() Nedir ve Neden Önemlidir?

Unity'de bir GameObject'in davranışını kontrol etmek için genellikle MonoBehaviour sınıfından türetilen script'ler kullanırız. Bu script'ler içerisinde birçok özel fonksiyon bulunur ve FixedUpdate() de bunlardan biridir. Adından da anlaşılacağı gibi, FixedUpdate(), belirli ve sabit zaman aralıklarında çağrılan bir fonksiyondur. Bu sabit zaman aralığı, Unity'nin fizik motorunun hesaplamalarını tutarlı bir şekilde yapmasını sağlar.

Update() ve FixedUpdate() Arasındaki Farklar

Unity'de en sık kullanılan iki güncelleme fonksiyonu Update() ve FixedUpdate()'tir. Aralarındaki temel farkı anlamak, doğru kodu doğru yere yazmak için çok önemlidir:

  • Update(): Her karede bir kez çağrılır. Kare hızı (frame rate) değişken olduğu için, Update()'in çağrılma sıklığı da değişir. Yani, oyununuz 60 FPS çalışırken Update() saniyede 60 kez çağrılırken, 30 FPS'e düştüğünde saniyede 30 kez çağrılır. Bu nedenle, görsel güncellemeler, kullanıcı girişi (input) veya kare hızına bağlı olmayan diğer mantıklar için idealdir.
  • FixedUpdate(): Sabit bir zaman aralığında çağrılır. Bu zaman aralığı, Unity'nin "Project Settings" -> "Time" bölümündeki "Fixed Timestep" ayarı ile belirlenir (varsayılan olarak 0.02 saniye, yani saniyede 50 çağrı). Kare hızı ne olursa olsun (yeterince yüksek olduğu sürece), FixedUpdate() aynı sıklıkta çağrılır. Bu tutarlılık, fizik motorunun doğru ve öngörülebilir sonuçlar üretmesi için hayati öneme sahiptir. Fizik hesaplamaları, Rigidbody hareketleri ve kuvvet uygulamaları gibi tüm fiziksel etkileşimler Unity FixedUpdate içerisinde yapılmalıdır.

Time.deltaTime ve Time.fixedDeltaTime

Bu iki fonksiyonla birlikte kullanılan önemli zaman değişkenleri de vardır:

  • Time.deltaTime: Bir önceki Update() çağrısından bu yana geçen süreyi temsil eder. Kare hızına bağlı olarak değişkendir.
  • Time.fixedDeltaTime: Bir önceki FixedUpdate() çağrısından bu yana geçen süreyi temsil eder. Bu değer sabittir ve "Fixed Timestep" ayarına eşittir. Fizik motoru hesaplamalarında her zaman Time.fixedDeltaTime kullanılır.

Fizik Hesaplamaları ve Rigidbody

Unity'de fiziksel etkileşimler, genellikle bir GameObject'e eklenen Rigidbody bileşeni aracılığıyla yönetilir. Rigidbody, yerçekimi, çarpışmalar, kuvvet uygulamaları gibi fiziksel nitelikleri objeye kazandırır. Bir Rigidbody'nin hareketini veya kuvvet uygulamasını kontrol ederken, bunu mutlaka Unity FixedUpdate içerisinde yapmalısınız.

Rigidbody ile Etkileşim

Rigidbody'ye kuvvet uygulamak veya hızını değiştirmek gibi işlemler FixedUpdate() içinde yapılmalıdır. Örneğin, bir objeyi belirli bir yöne doğru sürekli itmek istiyorsanız:

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(horizontalInput, 0f, verticalInput);
        rb.AddForce(movement * moveSpeed * Time.fixedDeltaTime, ForceMode.VelocityChange);
    }
}

Yukarıdaki örnekte, AddForce() metodu FixedUpdate() içinde çağrılarak, objeye uygulanan kuvvetin fizik motoru tarafından doğru ve tutarlı bir şekilde işlenmesi sağlanır.

Pratik İpuçları

1. Rigidbody'yi Güvenle Taşıma: MovePosition ve MoveRotation

Bir Rigidbody'nin konumunu veya rotasyonunu doğrudan transform.position veya transform.rotation kullanarak değiştirmekten kaçınmalısınız. Bu, fizik motorunun iç hesaplamalarıyla çakışmalara ve tutarsız davranışlara yol açabilir. Bunun yerine, Rigidbody'nin kendi metotları olan Rigidbody.MovePosition() ve Rigidbody.MoveRotation()'ı kullanmalısınız. Bu metotlar, fizik motorunun objeyi güvenli bir şekilde hareket ettirmesini sağlar ve çarpışma algılamasını doğru yapar.

void FixedUpdate()
{
    Vector3 targetPosition = transform.position + transform.forward * 5f * Time.fixedDeltaTime;
    rb.MovePosition(targetPosition);

    Quaternion targetRotation = Quaternion.Euler(0, 10f * Time.fixedDeltaTime, 0) * rb.rotation;
    rb.MoveRotation(targetRotation);
}

2. Kuvvet Uygulama Modlarını Anlayın

Rigidbody.AddForce() metodunu kullanırken, ikinci parametre olarak bir ForceMode belirtmeniz önemlidir. En sık kullanılanlar şunlardır:

  • ForceMode.Force: Sürekli bir kuvvet uygular ve objenin kütlesini dikkate alır. Hızlanma için kullanılır.
  • ForceMode.Impulse: Anlık bir kuvvet uygular ve objenin kütlesini dikkate alır. Zıplama veya patlama gibi anlık etkiler için idealdir.
  • ForceMode.Acceleration: Sürekli bir ivme uygular ve objenin kütlesini yok sayar.
  • ForceMode.VelocityChange: Anlık bir hız değişimi uygular ve objenin kütlesini yok sayar.

Doğru ForceMode'u seçmek, fiziksel davranışın gerçekçiliğini artırır.

3. Görsel Akıcılık için Interpolasyon

FixedUpdate() sabit zaman aralıklarında çalıştığı için, oyununuzun kare hızı (örneğin 60 FPS) fizik güncelleme hızından (örneğin 50 FPS) farklıysa, objelerin hareketleri görsel olarak takılma veya titreme yapabilir. Bu durumu gidermek için Rigidbody bileşeninde "Interpolate" ayarını kullanabilirsiniz:

  • None: Varsayılan değerdir, interpolasyon yapılmaz.
  • Interpolate: Geçmiş karelerin konumlarını kullanarak yumuşak bir hareket sağlar.
  • Extrapolate: Gelecek karelerin konumlarını tahmin ederek daha da yumuşak bir hareket sağlar, ancak bazen küçük sapmalara yol açabilir.

Genellikle "Interpolate" seçeneği, fiziksel hareketlerin görsel olarak daha akıcı görünmesini sağlar ve Unity FixedUpdate ile Update() arasındaki senkronizasyon farkını minimize eder.

Yaygın Hatalar ve Çözümleri

1. Transform.position ile Rigidbody Kontrolü

Hata: Bir Rigidbody'ye sahip GameObject'i Update() fonksiyonu içinde transform.position veya transform.Translate() kullanarak hareket ettirmek.

// YANLIŞ KULLANIM!
void Update()
{
    transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
}

Çözüm: Rigidbody'yi hareket ettirmek için her zaman FixedUpdate() içinde Rigidbody.MovePosition(), Rigidbody.AddForce() veya Rigidbody.velocity gibi fizik motoru dostu metotları kullanın.

// DOĞRU KULLANIM
void FixedUpdate()
{
    rb.MovePosition(rb.position + transform.forward * moveSpeed * Time.fixedDeltaTime);
}

Bu hata, objenin çarpışma algılamasını bozabilir, titremelere neden olabilir ve fizik motorunun beklediği tutarlılığı ortadan kaldırabilir.

2. Fizik Kodunu Yanlış Fonksiyonda Kullanma

Hata: Fizik hesaplamalarını (kuvvet uygulamaları, hız değişiklikleri) Update() fonksiyonunda yapmak.

Çözüm: Tüm fizik motoru etkileşimleri, kuvvet uygulamaları ve Rigidbody manipülasyonları Unity FixedUpdate içerisinde yapılmalıdır. Kullanıcı girdilerini (Input) Update()'te alıp, bu girdilere göre fiziksel hareketleri FixedUpdate()'te uygulamak en iyi yaklaşımdır.

// Örnek: Girdi alıp FixedUpdate'te fizik uygulama
public class InputAndPhysics : MonoBehaviour
{
    private Rigidbody rb;
    private Vector3 inputDirection;

    void Start() { rb = GetComponent<Rigidbody>(); }

    void Update() // Girdiyi Update'te al
    {
        inputDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
    }

    void FixedUpdate() // Fiziği FixedUpdate'te uygula
    {
        if (inputDirection.magnitude > 0.1f)
        {
            rb.AddForce(inputDirection.normalized * 10f, ForceMode.Acceleration);
        }
    }
}

Performans ve Optimizasyon Notları

Fixed Timestep Ayarı

Unity'nin "Project Settings" -> "Time" bölümündeki "Fixed Timestep" değeri, FixedUpdate()'in çağrılma sıklığını belirler. Varsayılan değer 0.02 saniyedir (saniyede 50 kez). Bu değeri değiştirerek fizik motorunun çalışma hızını ayarlayabilirsiniz:

  • Daha küçük değer (örneğin 0.01 saniye): Fizik hesaplamaları daha sık yapılır, bu da daha doğru ve kararlı fizik simülasyonları anlamına gelir. Ancak CPU yükünü artırır ve performans düşüşüne neden olabilir.
  • Daha büyük değer (örneğin 0.03 saniye): Fizik hesaplamaları daha az sık yapılır, bu da performansı artırabilir. Ancak fizik simülasyonları daha az doğru olabilir ve hızlı hareket eden objelerin çarpışmaları kaçırmasına neden olabilir.

Oyununuzun ihtiyaçlarına göre bu değeri dikkatlice ayarlamalısınız. Çoğu oyun için varsayılan 0.02 saniye yeterlidir.

Uyuyan Rigidbody'ler (Sleeping Rigidbodies)

Unity fizik motoru akıllıdır. Eğer bir Rigidbody belirli bir eşik değerinin altında hareket ediyorsa veya dönüyorsa, fizik motoru onu "uyku" durumuna sokar. Uyuyan Rigidbody'ler üzerinde fizik hesaplamaları yapılmaz, bu da performansı önemli ölçüde artırır. Bir objeye kuvvet uygulandığında veya bir objeyle çarpıştığında uyanır. Bu mekanizma, sahnede çok sayıda hareketsiz fiziksel obje varken performansı korumak için önemlidir.

Sonuç

Unity FixedUpdate fonksiyonu, Unity'de gerçekçi ve tutarlı fizik simülasyonları oluşturmanın temelidir. Update() ile arasındaki farkları anlamak, Rigidbody ile doğru etkileşim kurmak ve yaygın hatalardan kaçınmak, oyununuzun fiziksel davranışını optimize etmenize yardımcı olacaktır. Unutmayın, tüm fizikle ilgili kodlarınızı FixedUpdate() içinde yazarak, daha kararlı, güvenilir ve performanslı bir oyun deneyimi sağlayabilirsiniz.

🧠 Ders Sonu Değerlendirme Testi

Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.

🔥 +50 XP Ödül
🔒

Sınava Katılmak İçin Giriş Yapın

Bu ders sonu testini çözebilmek, bilginizi test edip **+50 XP** kazanmak ve **Sınav Şampiyonu** rozetinin kilidini açmak için üye girişi yapmalısınız.

Yorumlar (0)

Yorum yazabilmek ve derslere katkıda bulunabilmek için giriş yapmalısınız.

İlk yorumu siz yapın!