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;
2
3public class SpriteAnimator: MonoBehaviour
4{
5public Sprite[] spriteFrames;
6public float frameDuration = 0.1f; // Her frame kaç saniye sürecek
7public int frameSkip = 0; // 0 = her frame göster, 1 = bir frame atla
8
9private SpriteRenderer spriteRenderer;
10private int currentFrame = 0;
11private float elapsedTime = 0f;
12private int frameCounter = 0;
13
14void Start()
15{
16spriteRenderer = GetComponent<SpriteRenderer>();
17}
18
19void Update()
20{
21elapsedTime += Time.deltaTime;
22
23if (elapsedTime >= frameDuration)
24{
25frameCounter++;
26
27// Frame skip kontrol
28if (frameCounter > frameSkip)
29{
30currentFrame = (currentFrame + 1) % spriteFrames.Length;
31spriteRenderer.sprite = spriteFrames[currentFrame];
32frameCounter = 0;
33}
34
35elapsedTime = 0f;
36}
37}
38
39// Hızı çalışma zamanında değiştir
40public 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.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

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ış.

bknz: Oyun Döngüsü: Delta Time ile Hızdan Bağımsız Hareket

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz
  • adlı kullanıcıya yanıt verdi
    tesaduf

    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ı

  • adlı kullanıcıya yanıt verdi
    bygus
    @bygus

    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

  • adlı kullanıcıya yanıt verdi
    tesaduf

    ama yine de bazı cihazlarda delta time değeri çok düşük çıkıyor animasyon titrek görülebiliyor

  • adlı kullanıcıya yanıt verdi
    bygus
    @bygus

    aynen işte o yüzden delta time önemli FPS fark etmiyor artık her karede geçen süreye bakıyorsun

  • tesaduf
    @tesaduf

    delta time ile hız tutarlı hale geliyor mobilde de aynı hızda çalışıyor demek