Unity DOTween Kullanımı

Tekrardan merhabalar,

Bu dersimizde, Unity uygulamalarınızda kullanabileceğiniz popüler bir plugin olan DOTween‘i basitçe tanıtacağım. Bu plugin vasıtasıyla, bir değişkenin mevcut değerini başka bir değere yumuşak bir şekilde (belirli bir süre içerisinde) değiştirebilirsiniz. Basit bir örnek vermek gerekirse, bir objeyi 1.5 saniyede mevcut konumundan başka bir konuma hareket ettirebilirsiniz.

Asset Store: https://assetstore.unity.com/packages/tools/animation/dotween-hotween-v2-27676

O halde başlayalım!!!

Plugin’i projenize import ettikten sonra yapmanız gereken ilk şey, Tools-Demigiant-DOTween Utility Panel yolunu izleyip gelen penceredeki “Setup DOTween…” butonuna tıklamak. Ardından plugin’i kullanmayı düşündüğünüz C# script'(ler)inizin başına şu satırı eklediniz mi tamamdır: “using DG.Tweening;

DOTween, halihazırda pek çok fonksiyon ile beraber gelmekte ve bunların hepsini burada işlemem mümkün değil; o yüzden sadece önemli bulduğum fonksiyonlardan bahsedeceğim. Orijinal dokümantasyon için: http://dotween.demigiant.com/documentation.php

Popüler Fonksiyonlar

transform.DOLocalMove( Vector3 hedefLocalPosition, float sure ): Transform objesinin localPosition değerini (Inspector’daki Position değeri) sure saniye içerisinde hedefLocalPosition yapar. Örneğin 1.5 saniyede localPosition’ı 0,0,0 yapmak için: transform.DOLocalMove( new Vector3( 0f, 0f, 0f ), 1.5f );

transform.DOLocalMoveX( float hedefXLocalPosition, float sure ): Transform objesinin localPosition’ının X değerini değiştirir. Y ve Z eksenleri için de ayrı fonksiyonlar bulunmaktadır.

transform.DOMove( Vector3 hedefPosition, float sure ): Transform objesinin position değerini değiştirir. DOLocalMove’a benzer şekilde, bu fonksiyonun da DOMoveX, DOMoveY ve DOMoveZ versiyonları vardır.

transform.DOLocalRotate( Vector3 hedefLocalEulerAngles, float sure ): Transform objesinin localEulerAngles değerini (Inspector’daki Rotation değeri) değiştirir. Direkt eulerAngles için ise DORotate fonksiyonu vardır.

transform.DOScale( Vector3 hedefLocalScale, float sure ): Transform objesinin localScale değerini (Inspector’daki Scale değeri) değiştirir. Sadece X, Y ve Z eksenleri için de ayrı versiyonları vardır.

kamera.DOShakePosition( float sure, float guc ): Kameranın pozisyonunu sure saniye boyunca guc şiddetinde titreştirir (örneğin oyunda bomba patlayınca kullanılabilir). Kameranın rotasyonunu titreştirmek için ise kamera.DOShakeRotation fonksiyonu vardır. Pozisyonu titreştirirken guc olarak 0.2 gibi ufak bir miktar girerken, rotasyonu titreştirirken ise 30.0 gibi daha büyük bir miktar girmenizi tavsiye ederim.

materyal.DOColor( Color hedefRenk, float sure ): Materyalin rengini değiştirir. Teknik olarak konuşmak gerekirse, materyalin shader’ındaki “_Color” isimli değişkenin değerini değiştirir. Eğer başka bir shader değişkeninin değerini değiştirmek istiyorsanız, DOColor( Color hedefRenk, string degiskenAdi, float sure ) fonksiyonunu kullanabilirsiniz.

materyal.DOFade( float hedefAlpha, float sure ): Materyalin renginin sadece alpha değerini (saydamlığını) değiştirir. DOColor’da olduğu gibi, bu fonksiyonun da degiskenAdi alan bir versiyonu vardır.

uiElemani.DOColor( Color hedefRenk, float sure ): Bir UI elemanının rengini değiştirir. Sadece rengin alpha değerini değiştirmek için DOFade fonksiyonu kullanılabilir.

DOTween.Kill( object hedefObje, bool tweeniTamamla = false ): hedefObje‘nin üzerinde çalışan tüm tween’leri elle sonlandırmaya yarar. Eğer tweeniTamamla‘nın değeri true ise, tween’ler sonlandırılmadan önce hedef değerleri hedefObje’ye uygulanır.

DOTween.KillAll( bool tweeniTamamla ): Çalışmakta olan tüm tween’leri sonlandırır.

El Yapımı Tween

Bazen istediğiniz değeri yumuşakça değiştirmeye yarayan hazır bir DOTween fonksiyonu olmayabilir. Bu durumda özel bir fonksiyondan faydalanabilirsiniz: DOTween.To( getFonksiyonu, setFonksiyonu, hedefDeger, sure )

getFonksiyonu: buraya, hedefDeger‘e ulaşmasını istediğiniz değişkenin mevcut değerini döndüren bir fonksiyon girmelisiniz

setFonksiyonu: getFonksiyonu ile mevcut değeri alınan değişkenin değeri, DOTween tarafından hedefDeger‘e yumuşak bir şekilde yaklaştıkça, bu yeni değeri değişkeninize geri atamaya yarayan bir fonksiyon

hedefDeger: değişkenin almasını istediğiniz son değer

sure: yumuşak geçiş süresi

Örneğin diyelim ki script’inizde degisken adında bir float değişkeniniz var ve bunun değerini 2 saniye içerisinde 5.0 yapmak istiyorsunuz:

DOTween.To( () => degisken, ( yeniDeger ) => degisken = yeniDeger, 5.0f, 2f );

Buradaki “() => blabla” kalıbını daha önce görmediyseniz kafanız karışabilir. Bu kalıp, hızlıca isimsiz fonksiyonlar oluşturmak için kullanılır (daha fazla bilgi için “c# lambda” şeklinde arama yapabilirsiniz). Aynı kodu yazmanın uzunca bir yolu ise şu:

float degisken;
  
void Start()
{
    DOTween.To( DegiskeninDegeriniAl, DegiskeninDegeriniDegistir, 5.0f, 2f );
}
  
float DegiskeninDegeriniAl()
{
    return degisken;
}
  
void DegiskeninDegeriniDegistir( float yeniDeger )
{
    degisken = yeniDeger;
}

Bu fonksiyon vasıtasıyla yapabileceğiniz bir başka ilginç şey de, bir string’in yumuşak bir şekilde yoktan belirmesini sağlamaktır (zaman zaman oyunlarda gördüğümüz bir efekt). Örneğin OnGUI ile ekrana çizdirmek istediğiniz “Merhaba Dünya!” yazısının 5 saniyede, sanki birisi o string’i o an elle yazıyormuş gibi yavaşça belirmesini sağlamak için şu kodu kullanabilirsiniz:

string gozukenYazi = "";
  
void Start()
{
    DOTween.To( () => gozukenYazi, ( yazi ) => gozukenYazi = yazi, "Merhaba Dünya!", 5f ).SetOptions( true, ScrambleMode.None );
}
  
void OnGUI()
{
    GUILayout.Box( gozukenYazi );
}

Buradaki SetOptions fonksiyonu, sadece DOTween.To ile bir string’in değerini değiştirirken geçerlidir. Eğer ScrambleMode.None‘ın değerini ScrambleMode.All yaparsanız, string yoktan belirmek yerine, harfleri rastgele karışmakta olan bir yazının yavaşça hedef yazıya doğru kaymasıyla oluşur.

NOT: DOTween.To fonksiyonunun desteklediği türler şunlardır: float, double, int, uint, long, ulong, Vector2, Vector3, Vector4, Quaternion, Rect, RectOffset, Color ve string.

Ekstra Fonksiyonlar

Bu fonksiyonlar, yukarıda bahsedilen fonksiyonların sonuna ilave edildiklerinde, o fonksiyonlara ekstra işlevsellik kazandırırlar.

SetDelay( float sure ): Fonksiyonun çalışmasını sure saniye kadar bekletir. Örneğin objenin localScale’ini 5 saniye içinde 2 katına çıkarmak istiyor, ama önce 1 saniye beklemek istiyorsanız: transform.DOScale( transform.localScale * 2, 5f ).SetDelay( 1f );

SetRelative( true ): Değişkenin değerini yumuşak bir şekilde hedef değere ulaştırmaktan ziyade, değişkenin değerine yumuşak bir şekilde hedef değeri ekler. Yani örneğin objenizi 1.5 saniyede 5 birim ileri hareket ettirmek istiyorsanız, ve hatta bu işlemden önce 1 saniye beklemek istiyorsanız, şu kodu kullanabilirsiniz: transform.DOLocalMove( new Vector3( 0f, 0f, 5f ), 1.5f ).SetRelative( true ).SetDelay( 1f );

From( bool relative ): Değişkenin değerini mevcut değerden hedef değere ulaştırmaktan ziyade, hedef değerden mevcut değere ulaştırır. Yani bu fonksiyon çağrıldığı vakit, değişkenin değeri anında hedef değere eşitlenir ve o değerden orijinal değerine doğru yumuşak bir şekilde hareket eder. Eğer bu işlemin SetRelative‘deki gibi “değerin üzerine eklemeli” olmasını isterseniz, SetRelative fonksiyonunu kullanmak yerine bu fonksiyonun relative parametresinin değerini true yapın. Yoksa false yapın.

SetEase( Ease yumusakHareketTuru ): Değişkenin değerinin hedef değere ne tarz bir yumuşaklıkta hareket edeceğini belirler. Varsayılan olarak Ease.OutQuad kullanılır, yani değişkenin değeri başta normal hızda değişirken, hedef değere yaklaştıkça daha yavaş değişmeye başlar. Eğer Ease.Linear kullanırsanız, değişkenin değeri daima sabit hızla değişir. Tüm Ease değerlerini ve nasıl çalıştıklarını görmek için şu sayfayı ziyaret edebilirsiniz: https://easings.net/

SetUpdate( UpdateType updateTuru, bool timeScaleBagimsiz ): Fonksiyonun Update‘te mi (UpdateType.Normal), LateUpdate‘te mi (UpdateType.Late) yoksa FixedUpdate‘te mi (UpdateType.Fixed) çalışacağını belirler. Eğer timeScaleBagimsiz‘in değerini true yaparsanız, fonksiyon Time.timeScale‘den etkilenmez (oyun pause edildiğinde çalışan UI animasyonları için idealdir).

SetLoops( int loopMiktari, LoopType loopTuru ): Fonksiyonun kendini tekrar etmesini sağlar (örneğin 2 kere çalışmasını). loopMiktari, fonksiyonun kaç kere tekrarlanacağını belirlerken, loopTuru ise tekrarın nasıl gerçekleşeceğini belirler. Eğer LoopType.Restart girilirse fonksiyon yeni baştan çalıştırılırken, LoopType.Yoyo girilirse fonksiyon sondan başa doğru ve ardından tekrar baştan sona doğru vs. şeklinde tekrarlanır. LoopType.Incremental ise, değişkenin değeri ne kadar değiştiyse, sonraki tekrarlarda da değişkenin son değerinin üzerine o kadar ekleme yapar. Eğer loopMiktari’nı -1 yaparsanız fonksiyon sonsuza kadar kendini tekrar eder. Örneğin bir objenin sürekli ilk konumu ile 0,0,0 noktası arasında sabit hızla hareket etmesini isterseniz (her bir hareket 2 saniye sürecek şekilde): transform.DOMove( new Vector3( 0f, 0f, 0f ), 2f ).SetLoops( -1, LoopType.Yoyo ).SetEase( Ease.Linear );

SetTarget( Object hedefObje ): Bu tween’in sahibi olarak hedefObje‘yi belirler. DOTween.Kill( hedefObje ) yapıldığında, bu fonksiyon çalışmayı sonlandırır. DOTween.To harici tüm fonksiyonlar hedefObje atamasını otomatik olarak yapar, o yüzden o fonksiyonlarda SetTarget’ı çağırmanıza gerek yok.

OnComplete( calisacakFonksiyon ): Fonksiyonun çalışması bitince, belli bir fonksiyonun (calisacakFonksiyon) çalışmasını sağlar. Eğer fonksiyon kendini tekrar ediyorsa (loop), calisacakFonksiyon sadece tüm loop’lar tamamlanınca çağrılır. Örneğin bir objeyi 5 saniyede Y ekseni etrafında 90 derece döndürüp ardından yok etmek isterseniz, şöyle bir kod yazabilirsiniz: transform.DOLocalRotate( new Vector3( 0f, 90f, 0f ), 5f ).SetRelative( true ).OnComplete( () => Destroy( transform.gameObject ) );

OnStepComplete( calisacakFonksiyon ): OnComplete‘in aksine, eğer fonksiyon loop yapıyorsa, her loop bitiminde calisacakFonksiyon çağrılır (tüm loop’lar tamamlanınca da çağrılır).

OnUpdate( calisacakFonksiyon ): Fonksiyon çalıştığı sürece her frame calisacakFonksiyon çağrılır.

Bie dersin daha sonuna geldik. Umarım faydalı olmuştur. Kendinize iyi bakın!

Bir Cevap Yazın