2D Sprite Animasyonunu Kodla Kontrol Etme: Frame Skip ve Hız
Sprite animasyonunda temel sorun, animasyon hızının cihazdan cihaza değişmesidir. Bir bilgisayarda 60 FPS'te çalışan kod, mobilde 30 FPS'te iki kat hızlı görünür. Bunu çözmek için delta time (her frame arasındaki süre) kullanarak hız kontrolü yaparız. Ayrıca frame skip tekniği ile istediğimiz kareleri atlayabiliriz.
Aşağıda Unity'de çalışan bir örnek var. Sprite animasyonunun hızını kontrol edip, belirli frameları atlayabilirsiniz.
1using UnityEngine;23public class SpriteAnimator: MonoBehaviour4{5public Sprite[] spriteFrames;6public float frameDuration = 0.1f; // Her frame kaç saniye sürecek7public int frameSkip = 0; // 0 = her frame göster, 1 = bir frame atla89private SpriteRenderer spriteRenderer;10private int currentFrame = 0;11private float elapsedTime = 0f;12private int frameCounter = 0;1314void Start()15{16spriteRenderer = GetComponent<SpriteRenderer>();17}1819void Update()20{21elapsedTime += Time.deltaTime;2223if (elapsedTime >= frameDuration)24{25frameCounter++;2627// Frame skip kontrol28if (frameCounter > frameSkip)29{30currentFrame = (currentFrame + 1) % spriteFrames.Length;31spriteRenderer.sprite = spriteFrames[currentFrame];32frameCounter = 0;33}3435elapsedTime = 0f;36}37}3839// Hızı çalışma zamanında değiştir40public void SetAnimationSpeed(float speed)41{42frameDuration = 0.1f / speed; // speed = 2 ise iki kat hızlı43}44}Bu kod şöyle çalışır: Time.deltaTime ile gerçek geçen zamanı takip ederiz. frameDuration kadar zaman geçince bir sonraki frame'e geçeriz. frameSkip değeri artıysa, belirli frameları atlarız ve animasyon yavaşlar.
Beklenen çıktı: Sprite'ınız frameDuration süresiyle değişir. SetAnimationSpeed(2) çağırırsanız animasyon iki kat hızlanır.
Sık yapılan hata: Time.deltaTime kullanmadan Update() içinde doğrudan frame sayısı artırmak. Bu cihazın FPS'ine bağlı olur ve farklı cihazlarda hız tutarsız kalır. Her zaman delta time ile çalış.
5 yorum
0 016 saniye ne kadar sıkı bir sınır ya bazı cihazlarda 60 FPSte zaten 0 016 0 017 arasında dalgalanıyor o sınırı biraz yumuşaklaştırsan daha iyi olmaz mı
o zaman clamping yapman lazım delta timea maksimum bir değer koy mesela 0 016 saniye üstü kabul etme böyle extreme spikelar filtreli olur
ama yine de bazı cihazlarda delta time değeri çok düşük çıkıyor animasyon titrek görülebiliyor
aynen işte o yüzden delta time önemli FPS fark etmiyor artık her karede geçen süreye bakıyorsun
delta time ile hız tutarlı hale geliyor mobilde de aynı hızda çalışıyor demek