DOTween ile temiz ve güvenli tween’ler: 4 ipucu

Eğer Unity projelerinde DOTween kullanıyorsanız (ki büyük ihtimalle kullanıyorsunuz 😄), bu 4 küçük ipucunu alışkanlık haline getirmenizi çok isterim.
Hem “garip bug” risklerini azaltıyor hem de “temizlik” işini sizin yerinize hallediyor.
UI animasyonlarından patlama efektlerine kadar örneklerle anlattım.

1) SetLink: Nesne gidince animasyon da gitsin

Tween’i ait olduğu GameObject’e bağlayın ki o obje sahneden silinince tween de otomatik olarak sonlansın.
OnDestroy() içinde Kill() kovalamaya gerek kalmaz.

// Obje yok edilirse tween otomatik Kill edilir
transform.DOScale(1.5f, 0.5f)
    .SetLink(gameObject, LinkBehaviour.KillOnDestroy);

Küçük notlar:

  • Objeyi sadece “disable” ediyorsanız LinkBehaviour.PauseOnDisable veya KillOnDisable kullanabilirsiniz.

  • Toplu temizlik için tek satır yeterli:
    DOTween.Kill(gameObject);
    (O objeye link’li tüm tween’ler silinir.)

 

2) SetUpdate(true): Pause menüsünde animasyon dursun mu, devam mı etsin?

UI veya HUD animasyonlarının oyun pause iken akmaya devam etmesini genelde isteriz.
SetUpdate(true) çağrısı tween’i unscaled time’a geçirir — yani Time.timeScale = 0 olsa bile çalışır.

// Pause'da (Time.timeScale = 0) dahi çalışır (unscaled time)
transform.DOMove(targetPos, 1f)
    .SetUpdate(true);

İleri seviye kullanım:

// UpdateType + unscaled birlikte
using DG.Tweening;

transform.DOScale(1.2f, 0.35f)
    .SetUpdate(UpdateType.Normal, isIndependentUpdate: true);

Kural:

  • UI tween’leri → genelde unscaled

  • Gameplay tween’leri → scaled (pause ile dursunlar)

 

3) SetId: Tween’lere etiket tak, topluca yönet

Karmaşık efektler veya UI geçişlerinde aynı gruba ait tween’leri tek komutla durdurmak hayat kurtarır.

Tween explosionScaleTween = explosionFx.transform.DOScale(2f, 0.5f)
    .SetEase(Ease.OutBack)
    .SetId("patlamaFx");

// İstediğin zaman tüm "patlamaFx" tween'lerini durdur
DOTween.Kill("patlamaFx");

// Aynı şekilde topluca oynat/durdur
DOTween.Pause("patlamaFx");
DOTween.Play("patlamaFx");

🧠 İpucu:
ID çakışmasın. Büyük projelerde string yerine anlamlı sabitler veya enum-to-string kullanmak iyi pratiktir.

 

4) OnKill: Temizlik işini garantiye al

Tween normal biterse de erken Kill() edilirse de bu callback çalışır.
Object Pool’a iade, event tetikleme gibi temizlikler için birebir.

Tween t = explosionFx.transform.DOScale(0f, 0.35f)
    .SetEase(Ease.InBack);

t.OnKill(() =>
{
    // Örn: Efekti havuza geri koy, referansları temizle
    effectPool.Return(explosionFx);
});

OnComplete vs OnKill farkı:

  • OnComplete: Tween doğal olarak bittiğinde çalışır.

  • OnKill: Her koşulda (tamamlanmasa bile) çalışır. Garanti istiyorsanız OnKill kullanın.

🎯 Bonus:

// Kill(complete: true) -> önce OnComplete, sonra Kill olur
t.Kill(complete: true);

⚠️ Sık Düşülen 3 Hata

ween normal biterse de erken Kill() edilirse de bu callback çalışır.
Object Pool’a iade, event tetikleme gibi temizlikler için birebir.

Hata Çözüm
Linked olmayan tween’ler SetLink kullan
Pause’da donan UI SetUpdate(true) veya UpdateType + isIndependentUpdate
ID kaosu Anlamlı ID standardı belirle

✅ Mini Checklist

  • Yeni tween yazıyorsan → SetLink(gameObject, …)

  • UI animasyonlarında → SetUpdate(true)

  • Gruplu işler → SetId("...") + DOTween.Kill/Play/Pause("...")

  • Temizlik → OnKill(() => …)

  • Pooled objeler → Disable senaryosunu da düşün (PauseOnDisable / KillOnDisable)

🧱 Kısa Örnek: UI Panel Aç/Kapa

public class PanelAnimator : MonoBehaviour
{
    [SerializeField] private RectTransform panel;
    [SerializeField] private float duration = 0.25f;

    private const string PanelId = "ui.panel.main";

    public void Open()
    {
        DOTween.Kill(PanelId);

        panel.localScale = Vector3.zero;

        panel.DOScale(1f, duration)
            .SetEase(Ease.OutBack)
            .SetUpdate(true)                  // pause'da da çalışsın
            .SetId(PanelId)
            .SetLink(gameObject, LinkBehaviour.KillOnDestroy);
    }

    public void Close()
    {
        DOTween.Kill(PanelId);

        panel.DOScale(0f, duration * 0.8f)
            .SetEase(Ease.InBack)
            .SetUpdate(true)
            .SetId(PanelId)
            .SetLink(gameObject, LinkBehaviour.KillOnDestroy)
            .OnKill(() =>
            {
                // Örn: paneli disable et, state güncelle
                gameObject.SetActive(false);
            });
    }
}

Bu örnekle birlikte hem SetLink, SetUpdate, SetId hem de OnKill’in bir arada nasıl çalıştığını görebilirsiniz.
Basit bir UI panel animasyonu bile bu yöntemlerle çok daha güvenli ve temiz hale gelir.

🧭 Son Söz

Bu 4 küçük alışkanlık, DOTween kullanımınızı çok daha temiz, kontrollü ve performans dostu hale getirir.
Bir daha “tween neden kaldı?”, “neden durmadı?” gibi sorularla uğraşmak istemiyorsanız, bu pratikleri standart haline getirin.

 

Yalnızca birkaç satır ek kodla, projenizin hem görünmeyen derinliği hem de uzun vadeli sürdürülebilirliği artar.

Bir Yanıt Bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir