
Unity Coroutine Kullanımı (IEnumerator metodu)
Merhaba, önceki yazımızda Unity ile bir zamanlayıcı yapmıştık ve sahnemizdeki nesnenin boyutunu bu zamana dinamik olarak ayarlamıştık.Bu yazımızda ise, Coroutine fonksiyonunun kullanımına bakacağız.Bu fonksiyonun en sık kullanım şekli, projenizdeki bir kodu belli bir zaman sonra başlatmaktır.Yada bir yazmış olduğunuz bir fonksiyonun bitmesini bekleyebilir ve daha sonra aktif olur.Bunun gibi kullanım senaryoları mevcuttur.Biz bugünkü yazımızda kullanacağımız senaryomuza geçelim.
Sahne hazırlıkları.
Sahneyi hazırlamadan önce, Coroutine fonksiyonu için bir trafik lambası senaryosu oluşturdum.Sırasıyla bu trafik lambasının ışıklarını yakıp söndüreceğiz.Bunu yapmak içinde IEnumerator metodundan yararlanacağız.Şimdi sahnemizi hazırlayabiliriz.Öncelikle beş adet Cube nesnesine ihtiyacımız var.Bunlardan biri, trafik lambamızın tepe kısmını oluşturacak.Diğer direk kısmını oluşturacak ve geriye kalan üç tanesi lamba görevi görecek.Şimdi, Hierarchy penceresinden sağ tıklayarak sırasıyla, 3D Object > Cube seçimini yapıyoruz.
Daha sonra bu nesnemizin üzerine tıklayarak dört kopya (kısayol olarak ctrl+d) daha yapıyoruz.Daha sonra bunları Scene penceresinden araçlar yardımıyla istediğimiz forma sokuyoruz ve hepsini seçerek (ctrl tuşuna basılı tutup seçebiliriz.) trafik lambamızın tepe kısmını oluşturan nesnenin üzerine sürükleyip bırakıyoruz.Böylelikle dört Cube nesnesi ilk nesnemizin, alt nesnesi oluyor.Daha sonra Project penceresinde nesnelerimize renk vermek için, material dosyası oluşturuyoruz.Bunun için sağ tıklayarak sırasıyla, Create > Material seçimini yapıyoruz.Renkleri belirledikten sonra, materyalleri nesnelerimizin üzerine sürükle/bırak yapıyoruz.
Işıkları yakalım.
Son olarak, trafik lambalarının ışıklarını sahnemize ekleyelim.Bunun için Hierarchy penceresinde ışık olarak kullanacağımız nesnelerin üzerine sağ tıklayarak sırasıyla, Light > Point Light seçimini yapıyoruz.Kullanabileceğimiz birçok ışık tipi var.Biz senaryomuz için en uygun seçim olan, Point Light tipini kullanacağız.Üç ışık nesnesinide ekledikten sonra, sırasıyla seçiyoruz ve sağ tarafta buluna Inspector penceresinde Light bileşeninin altında bulunan Range (menzil diyebiliriz.) alanını 10 yapıyoruz.
Yada deneme yanılma ile en uygun menzili belirleyebilirsiniz.Daha sonra hemen altındaki Color bölümünden ışıklarımızın rengini belirliyoruz.Mode bölümüne burada girmeyeceğim.Şimdilik Realtime olarak kalabilir.Intensity bölümüne gelelim.Burada ışığımızın şiddetini arttırabilir yada azaltabiliriz.Birazdan yazacağımız kodlarda, bu ayar ile oynayarak ışıkları kapatıp açacağız.Evet sahnemiz hazır.Şimdi kod yazmaya geçebiliriz.
Kodlarımızı yazalım.
Project penceresinde bir tane C# script dosyası oluşturuyoruz.Bunun için, pencerede sağ tıklayarak sırasıyla, Create > C# Script seçimini yapıyoruz.Daha sonra trafik lambamızı oluşturan nesnemizin üzerine sürükleyip bırakıyoruz.
public Light yesilIsik; public Light sariIsik; public Light kirmiziIsik; public bool isikAktif;
İlk olarak değişkenlerimizi tanımlıyoruz.Her bir ışığı kontrol etmek için farklı değişkenler tanımlıyoruz.Daha sonra bu ışıkları bir döngüye sokmak için bir adet bool türünde değişken tanımlıyoruz.
yesilIsik = GameObject.Find ("yesil").GetComponent<Light> (); sariIsik = GameObject.Find ("sari").GetComponent<Light> (); kirmiziIsik = GameObject.Find ("kirmizi").GetComponent<Light> (); yesilIsik.intensity = 0; sariIsik.intensity = 0; kirmiziIsik.intensity = 0;
Daha sonra start() fonksiyonu içerisine geliyoruz.Burada ilk önce ışıklarımızı kontrol edecek değişkenlere, Light bileşenini içinde barındıran nesnelerimizi buluyor ve eşitliyoruz.İlk üç satırda değişkenlerimizi eşitledikten sonra, dördüncü satırdan itibaren yazının ortalarında değindiğim Intensity bölümüne erişiyoruz ve ışığımızın başlangıçta gözükmemesi için sıfır yapıyoruz.
isikAktif = true; StartCoroutine (IsikKontrolu ());
Daha sonra devam ediyoruz ve bool değişkenimizi başlangıçta true olacak şekilde ayarlıyoruz.Hemen ikinci satırda ise birazdan yazacağımız kodların aktif hale gelmesini sağlayacak StartCoroutine fonksiyonunu görüyorsunuz.Coroutine fonksiyonlarını çağırırken StartCoroutine ile çağırmanız ve başlatmanız gerekiyor.Aksi takdirde kodlarınızı çalıştıramazsınız ve konsol penceresinde hata mesajı alırsınız.
IEnumerator IsikKontrolu () { while (isikAktif) { yesilIsik.intensity = 3; yield return new WaitForSeconds (5); yesilIsik.intensity = 0; sariIsik.intensity = 3; yield return new WaitForSeconds (3); sariIsik.intensity = 0; kirmiziIsik.intensity = 4; yield return new WaitForSeconds (5); kirmiziIsik.intensity = 0; } }
Evet son olarak StartCoroutine içersinde çağıracağımız ve çalıştıracağımız kodları görüyorsunuz.Başta IEnumerator metodundan yararlanacağımızı söylemiştim.İçeriğine bakacak olursak, ışıklarımızın proje aktif olduğu sürece yanıp sönmesi için, bir while döngüsü kullanıyorum.Bundan önceki yazılarımda döngü çeşitlerine detaylı olarak değinmiştim.
Kısaca bool değişkenim true olduğu sürece döngüm devam edecektir.Daha sonra sahnemde kullandığım ışıkları sırasıyla ve belirli bir sürede yakıp söndürmek için WaitForSeconds fonksiyonunu kullanıyorum.Son olarak trafik lambasının ışıklarının şiddetini ayarlamak içinse, intensity ayarını istediğim gibi yapıyorum.Evet scriptimiz bu kadardı.
Evet projemizi çalıştırdığımız zaman, trafik ışıklarının WaitForSeconds fonksiyonuna verdiğimiz süre dahilinde yanıp söndüğünü göreceksiniz.Bu süreyi istediğiniz şekilde ayarlayabilirsiniz.Son olarak bir not düşeyim.StartCoroutine fonksiyonunu Update() fonksiyonu içinde bir koşula bağlamadan kullanmayın.Aksi takdirde düzensiz bir görüntü elde edeceksiniz ve kodlarınızın istediğiniz şekilde çalışmadığını göreceksiniz.Evet, bir sonraki yazıda görüşmek üzere…