Yine ve yeniden 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 tıklayın: 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.
Bu dersin de burada sonuna geldik. Umarım faydalı olmuştur. Kendinize iyi bakın!
Selamun aleyküm hocam, Unity 3D ‘nin orjinal dökümanı siz tarafından Türkçeye çevrilmiş olduğunu öğrendim. Doğru bilgi mi ?
Aleykümselam. Eskiden bazı Unity derslerini Türkçe’ye çevirmiştim, büyük ihtimalle onları kastetmişlerdir. Online dokümantasyonu Türkçe’ye çevirmedim.
https://ustaderslik.com/konu/Unity_3D_T%C3%BCrk%C3%A7e_D%C3%B6k%C3%BCman
bu sayfada bulunan kitabından bahsettim hocam.
Evet yaptığım çevirilerden birisi bu.
tamamdır hocam teşekkür ederim
Hocam merhabalar, int.Parse tam olarak kısaca nedir?
String olan “123”ü int olan 123’e çevirmeye yarar. Yani string’i int’e dönüştürür. Eğer string “asd” ise int’e dönüştürülemez ve bu durumda bu fonksiyon exception (hata) verir. Hata almamak için, “bool donusumBasarili = int.TryParse(stringDeger, out int intDeger);” fonksiyonunu çağırabilir ve donusumBasarili’nın değerinin true olup olmadığına bakabilirsiniz.
Anladım hocam çok teşekkür ederim.
Selamun aleyküm hocam bir sorum olacaktı. Ben unity ‘nin 2020.3.12f1 sürümünü kullanıyorum ve do tween indirirken hata veriyor. Free olanı indirmeye çalışıyorum ve “an error occurred: unable to get purchase details because you may not have purchased this package. ” hatası ile karşılaşıyorum ne yapabilirim?
Aleykümselam. Bu bilinen bir Unity 2020 hatası gibi duruyor: https://issuetracker.unity3d.com/issues/packman-error-message-appears-when-clicking-open-in-unity-on-a-free-package-in-the-asset-store. Unity’i kapatıp Unity Hub hesabınızdan çıkış yapıp sonra hesabınıza tekrar login yapın ve projenizi tekrar açın. Belki sorun düzelir.
Teşekkür ederim ama ben sorunu DOTween ‘i tekrardan import edince düzeldi ama bu sefer de sürekli import ettikten sonra New Version of DOTween İmported paneli çıkıyor bunun çıkmaması için altında Open DOTween Utility Panel yazısına tıkladım ve Setup DOTween yazısına tıkladım. Bu sefer de ilk yorumda bahsettiğim hata çıktı. Bunun için yapılabilecek bir şey var mıdır?
Maalesef bunlar aşina olmadığım hatalar.
Tamam teşekkür ederim yardımınız için.
Hocam merhaba, bu tarz eklentiler oyunun boyutunu etkiler mi?
Etkileyebilir ama ne kadar etkileyeceğini oyunu build almadan tespit etmek mümkün değil.
Hocam merhabalar dotweeni import ederken sıkıntılar yaşıyorum. Bu konuda bilgi sahibi bir iki arkadaşla konuştum bir çözüme varamadık. İmport edince Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleUnityVersion.cs(242,34): error CS1983: The return type of an async method must be void, Task or Task buna benzer 12 tane hata veriyor. Sebebi nedir?
Örneğin hatalı satırlardan birisini atabilir misiniz? Hangi Unity sürümü?
Yazdım hatalı satırın birini hocam. Sürümüm de 2019.4.16f1.Assets\Plugins\Demigiant\DOTween\Modules\DOTweenModuleUnityVersion.cs(242,34): error CS1983: The return type of an async method must be void, Task or Task
Koddaki hata veren satırın kendisini atmanızı kastetmiştim. Bende Unity 2019.2.21’de yüklü DOTween hata vermiyor ama bayadır güncellemedim.
Kusura bakmayın tam anlayamamışım
public static async Task AsyncWaitForRewind(this Tween t)
{
if (!t.active) {
if (Debugger.logPriority > 0) Debugger.LogInvalidTween(t);
return;
}
while (t.active && (!t.playedOnce || t.position * (t.CompletedLoops() + 1) > 0)) await Task.Yield();
}
Mesela bu kodda Task AsyncWaitForRewind, return ve son satırdaki task hatalı. Tüm kodalra bakarsak da taskların hepsi hatalı
Dosyadaki NET_4_6 yazan yerleri (NET_4_6 || NET_STANDARD_2_0) olarak değiştirmek diye bir şey okudum. İşe yaramazsa, hatalı fonksiyonları elle silin bence.
Zaten dediğiniz gibi orası hocam. Fakat hatalı satırlar task olan tüm satırlar bu da kodun yarısından fazlasını silmek demek
Hiç Task tecrübem olmadığı için hatalar bana bir şey ifade etmedi. Yalnız benim sürümümde hiç Task kodu yok, ya ben onları import ettiğimde silmişim ya da başından beri yokmuş.
Mailimi görüyorsunuzdur büyük ihtimal rica etsem mailime atabilir misiniz o sürümü? Göremiyorsanız da mailimi paylaşmam sizin için bir sıkıntı yaratır mı?
Mailinizi görüyorum ama atamam çünkü DOTween Pro kullanıyorum. Eğer Task’lı fonksiyonları kendiniz kullanmayacaksanız silmenizde sakınca yok. Ben Unity 2019.4.0f1’e şimdi en son DOTween sürümünü import ettim. Bende Task’lı satırlar hata vermedi. Bence plugin’i yeni bir Unity projesine import etmeyi deneyin. Eğer işe yararsa, Player Settings’inizdeki farklı ayarlardan birisi bu soruna sebep oluyor olabilir. Eğer işe yaramazsa ama bu hatayı Unity değil de sadece Visual Studio veriyorsa, Visual Studio’yu güncellemeyi deneyin.
Tamamdır teşekkür ederim,deneyeceğim.
Merhaba, bu gibi eklentileri eklemek oyunda büyük boyut değişikliklerine sebep olur mu? Mobile oyunlar için mümkün olduğunca düşük boyutlar olmasını tercih ederiz. Bu veya herhangi bir eklenti 300mb olarak indirdik diyelim. Hiç kullanmasak bile boyuta etki eder mi? Ederse kullandığımız kadar mı etki eder
Burada birden çok değişken var: örneğin bir plugin’in Resources klasöründeki asset’ler, kullanmasanız bile oyuna dahil olur. Haliyle bu asset’lerin kullandığı asset’ler de oyuna dahil olur. Script’lerin de normalde tamamı dahil olur ama Managed Code Stripping bu kodun kullanılmadığını düşündüğü kısmı oyuna dahil etmez. Native plugin’lerin dosyaları oyuna dahil olur ama ProGuard gibi minification sistemleri bunların kullanılmadığına kanaat getirirse onları dahil etmez.
Anlayacağınız kesin bir cevap almak için, oyunu önce plugin olmadan sonra da plugin ile build alıp aradaki boyut farkına bakmalısınız. DOTween’in boyuta kayda değer bir etkisinin olacağını sanmıyorum.
Hocam merhabalar.Şöyle bir sorunum var çözemedim bir türlü,dönüş yapabilirseniz gerçekten çok mutlu olurum olmazsa da canınız sağ olsun.
Bir adet topum var topuma addforce komutu uyguluyorum.Bu top bir miktar ileriye gidiyor.Durduğu anda bazı fonksiyonlar yazacağım,örneğin işte topun gittiği mesafeyi bir panel de ekrana çıkartacağım ama gel gelelim ki topun durduğunu kodsal olarak yazamıyorum nasıl yapabilirim.Yani şu şekilde topa kuvvet uyguladım top 100 metre kadar gitti ve durdu,demek istiyorum ki ; top durdu şu fonksiyonu çalıştır ama bağlayacağım if komutunu bulamadım topun durduğunu kodsal olarak yazamadım her kuvvet uyguladığımda da farklı uzaklıklar gideceği için çarpışmada koyamıyorum nasıl yapabilirim? Teşekkür ederim.Kolay Gelsin.
Topun hızına topRigidbody.velocity ile erişebilirsiniz. Eğer bu değer Vector3.zero’ya eşitse, top durmuş demektir.
Hocam çok çok teşekkür ederim elinize sağlık.
Merhabalar,buralarda yeniyim ve dotween i deniyordum ki;indirip kurduğumda ve script dosyası oluşturup içinde using DG… diye yazmak istediğimde, görmüyor.Nasıl düzeltebilirim?
using DG.Tweening; satırını ekleyince Visual Studio hata verse bile Unity veriyor mu ona bakın. Veriyorsa script’inizi herhangi bir klasörün içinde oluşturmamayı deneyin, vermiyorsa Unity ile Visual Studio’yu kapatıp açmayı deneyin.
dotween ile bir cismi y ekseninde belli bir sure hizli bir sekilde dondurmek istiyorum. her tikladigimda yeniden donmesi gerekiyor ama bir turlui yapamadim. Itween de donuyor fakat donmesi bitmeden geri donduremiyorum. animasyonda yapamadim belki onunla asarim dedim ama olmadi.yardim edebeilirmisiniz Yasin hocam ?
Şu kod işinizi görebilir:
DOTween.Kill( transform );
transform.DORotate( new Vector3( 0f, 90f, 0f ), 1f ).SetRelative( true );
Yasir Bey tesekkurler !! kod isimi cozdu…uzun sure donmesini istedigim icin birkac ekleme yaparak istedigim rotate i olusturdum
kod çalışmadı hata da vermiyor?
Camera a;
a.DOShakePosition(15f, 100f);
DOTween’in son sürümü ile denediğimde kod düzgün çalıştı. Bir ihtimal kameranın transform.position değerini Update gibi bir fonksiyonda sürekli değiştiren bir kodunuz vardır (mesela karakter takip kodu). Cinemachine kullanıyorsanız, bu dediğim şeyi Cinemachine de yapıyor olabilir. Attığınız kodu boş bir sahnedeki kamera üzerinde test amaçlı denemenizi öneririm.
hocam kameradaki kodlar bunlar pozisyonu değiştiren transform.DOLocalMoveY sildikten sonra da çalışmadı başka bir scane de denedim yine çalışmadı ? başka DOTween kodları çalışıyor
Camera a;
void Start()
{
a.DOShakePosition(15f, 100f);
}
void FixedUpdate()
{
if (kontrol.score == 10)
{
transform.DOLocalMoveY((15.7f), 2f);
}
}
Camera.main.DOShakePosition(15f, 100f); çalışıyorsa, “a” değişkenine hiç bir yerde değerini vermediğiniz için kod çalışmıyordur.
Sen var ya çok büyük kralsın. Ne zamandır böyle bir kütüphane arıyordum sayende Türkçe kaynağına ulaştım. Çok teşekkürler.