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ü (
Eğer karakterinizi
Çö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
2. Kamera Takip Kodunu Güncellemek
Kamerayı doğrudan karakterin pozisyonuna eşitlemek yerine
Test Sonucu
Rigidbody üzerindeki
Benzer durumla karşılaşan veya farklı bir yöntemle çözen varsa yorumlarda paylaşabilirsa harika olur.
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ı? |
|---|---|---|
| Interpolate | Karakterin pozisyonunu bir önceki karenin verisine göre yumuşatır. | Oyuncu karakteri ve ana kamera takibindeki nesneler için idealdir. |
| Extrapolate | Karakterin 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;CinemachineBrainbileşenindeki Update Method seçeneğiniSmart UpdateveyaLate Updateolarak 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.





