Türkiye'nin Oyun Alemi

Oyun Alemi'nin tam kalbinde yerinizi almak istemez misiniz? Güncel tartışmalara dahil olmak, rehber içeriklere hızlıca erişmek ve güzide topluluğumuzun tüm ayrıcalıklarından faydalanmak için hemen ücretsiz hesabınızı oluşturun.

Unity'de Rigidbody ve Kamera Titremesi (Jitter) Sorununu Nasıl Çözdüm?

Yennefer

Player [0]
Mesajlar
18
Tür
Aksiyon/Macera
Projemde top-down/3. şahıs bakış açısıyla hareket eden bir karakter mekaniği üzerinde çalışırken garip bir görsel sorunla karşılaştım. Karakter hareketi gayet akıcıydı ancak kamera karakteri takip ederken ekranda sürekli bir mikro titreme (jitter) oluşuyordu.

Aynı durumla karşılaşıp saatlerce araştırma yapmamanız adına sorunun teknik sebebini ve uyguladığım çözümü adım adım paylaşıyorum.




Sorunun Kaynağı Nedir?

Sorun tamamen Unity'nin fizik döngüsü (FixedUpdate) ile kare çizim döngüsünün (Update / LateUpdate) farklı zaman dilimlerinde çalışmasından kaynaklanıyor.

  • FixedUpdate: Varsayılan olarak saniyede 50 kez çalışır (50 Hz) ve fizik hesaplamalarını yapar.
  • LateUpdate / Update: Monitörünüzün tazeleme hızına göre (örneğin 144 Hz) değişken kare hızlarında çalışır.

Eğer karakterinizi Rigidbody.MovePosition() veya AddForce ile FixedUpdate içinde hareket ettirip, kamerayı LateUpdate içinde karakterin pozisyonuna eşitlerseniz; 144 FPS alan bir ekranda kamera 50 FPS'lik fizik adımını takip etmeye çalışır. Aradaki kare uyumsuzluğu ekranda titreme olarak görünür.



Çözüm Adımları

Bu problemi çözmek için projede iki temel değişiklik yapmam gerekti:

1. Rigidbody Interpolation Ayarını Açmak
Karakterin üzerindeki Rigidbody bileşenine girip Interpolate seçeneğini aktif edin.

Ayar (Interpolate)Ne İşe Yarar?Hangi Durumda Kullanılmalı?
InterpolateKarakterin pozisyonunu bir önceki karenin verisine göre yumuşatır.Oyuncu karakteri ve ana kamera takibindeki nesneler için idealdir.
ExtrapolateKarakterin pozisyonunu bir sonraki kare tahminine göre hesaplar.Yüksek hızlı mermiler veya ağ (multiplayer) nesneleri için kullanılır.

2. Kamera Takip Kodunu Güncellemek
Kamerayı doğrudan karakterin pozisyonuna eşitlemek yerine Vector3.SmoothDamp kullanarak ve döngüyü LateUpdate içinde tutarak şu scripti uyguladım:

C#:
using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    [SerializeField] private Transform target;
    [SerializeField] private Vector3 offset = new Vector3(0, 10, -5);
    [SerializeField] private float smoothTime = 0.12f;

    private Vector3 _currentVelocity = Vector3.zero;

    private void LateUpdate()
    {
        if (target == null) return;

        // Hedeflenen pozisyon
        Vector3 targetPosition = target.position + offset;

        // Yumuşatılmış kamera takibi
        transform.position = Vector3.SmoothDamp(
            transform.position, 
            targetPosition, 
            ref _currentVelocity, 
            smoothTime
        );
    }
}

Cinemachine Kullanıyorsanız:
Eğer projenizde Cinemachine / Unity Composing paketlerini kullanıyorsanız; CinemachineBrain bileşenindeki Update Method seçeneğini Smart Update veya Late Update olarak değiştirmeniz aynı sorunu çözecektir.



Test Sonucu

Rigidbody üzerindeki Interpolation değerini açıp kamera takibini SmoothDamp ile LateUpdate içerisine aldıktan sonra 60 Hz, 144 Hz ve 240 Hz monitörlerde yaptığım testlerde titreme sorunu tamamen ortadan kalktı.

Benzer durumla karşılaşan veya farklı bir yöntemle çözen varsa yorumlarda paylaşabilirsa harika olur.
 
shape1
shape2
shape3
shape4
shape5
shape6
Geri
Üst