Unity ile Zamanlayıcı Yapımı

Unity ile Zamanlayıcı Yapımı

12 Ocak 2020 0 Yazar: Ahmet Güler

Merhaba, bir önceki dersimizde Unity ile bir nesne nasıl kopyalanır onu öğrenmiştik.Bu dersimizde ise projelerimizde kullanmak üzere bir zamanlayıcı yapacağız.Bir çok yol izleyerek kendi problemlerinize en uygun zamanlayıcıyı yapmak mümkündür.Bu ders için basit bir zamanlayıcı tasarlayacağız ve çalışma mantığına bakacağız.

Sahne hazırlıkları.

Öncelikle yeni bir proje oluşturuyoruz.Bu projede zamanı ekranımızda görmek için arayüz (UI) elemanlarından faydalanacağız.Bu konuya detaylı olarak daha önceki yazılarımda değinmiştik.Bu yüzden yüzeysel olarak üzerinden geçeceğim.İlk olarak Hierarchy penceresinde sağ tıklayarak sırasıyla, UI > Canvas seçimini yapıyoruz. Daha sonra Canvas nesnemizin üzerine sağ tıklıyoruz ve sırasıyla, UI > Text seçimini yapıyoruz.Scene penceresinden Text elemanının pozisyon ayarlamalarını yapıyoruz.

Daha sonra bir Cube nesnesine ihtiyacımız var.Yine Hierarchy penceresinde sağ tıklayarak sırasıyla, 3D Object > Cube seçimini yapıyoruz.Bu nesnemize renk yada kaplama (aslında gerek yok ama) verebilirsiniz.Ben tercihimi kaplamadan yana kullandım.İnternetten bulacağınız herhangi bir kaplamayı kullanabilirsiniz.Bu kaplamayı bulunduğu konumdan sürükle/bırak ile projemize dahil ediyoruz.Daha sonra Project penceresinden, nesnemizin üzerine bırakıyoruz.

Editöre geçelim.

Evet sahnemiz hazır.Şimdi yani bir C# script dosyası oluşturalım.Project penceresinde sağ tıklayarak sırasıyla, Create > C# Script seçimini yapalım.Dosyamıza yeni bir ad verdikten sonra fare ile tıklayarak (yada enter ile) açalım.Kodları yazmaya geçmeden önce, senaryoyu anlatayım.Bir süre olacak ve bu süre geriye doğru saymaya başlayacak.Bununla ters orantılı olarak, sahnedeki nesnemizin boyutu büyümeye başlayacak.Süre sona erdiğinde ise, bu nesne sahneden silinecek ve Console penceresinde bir mesaj verecek.Evet şimdi kodlamaya geçebiliriz.

using UnityEngine.UI;

Evet bu projemizde arayüz (UI) elemanlarını kullandığımız ve bu elemanlara kod yazarken erişmemiz gerektiği için, script dosyamıza bu kütüphaneyi de dahil etmemiz gerekiyor.Aksi takdirde arayüz elemanlarımıza erişemeyeceğiz.

private Text SureTabelasi;
public float zaman, buyumeHizi;
private float x, y, z;

Evet değişkenlerimizi tanımlamayla başlıyoruz.İlk satırda, sahnemizde oluşturmuş olduğumuz arayüz elemanımızı kontrol etmek için bir değişken tanımlıyoruz.Daha sonra float türünde iki değişken tanımlıyoruz.Aynı türde değişkenleri bu şekilde yazabileceğimize daha önceki yazılarda değinmiştik.Bunlardan biri zamanı belirlememiz için gerekirken diğeri sahnedeki nesnemizin büyüme hızını belirleyecek.Son olarak üçüncü satırda, sahnedeki nesnemizin boyutlarını kontrol etmek için üç değişken (üç eksende eşit oranda büyüyecek) tanımlıyoruz.

SureTabelasi = GameObject.Find ("Yazi").GetComponent<Text>();
x = transform.localScale.x;
y = transform.localScale.y;
z = transform.localScale.z;

Start() fonksiyonumuzun içine ilk olarak, sahnedeki Text arayüz elemanını kontrol etmek için değişkenimize eşitliyoruz.Bunu yapmak için, GameObject.Find ile arayüz elemanının ismini buluyoruz ve Text bileşenine erişiyoruz.Daha sonra x, y ve z değişkenlerini sahnede bulunan nesnenin boyutlarına eşitliyoruz.Böylece daha sonra bunları kolayca kullanabileceğiz.

SureTabelasi.text = "Kalan Süre: " + (int)zaman;

Update() fonksiyonunun içine geliyoruz ve bu kodu yazıyoruz.Text elemanını kullanabilmek için değişkenimizi tanımlamış ve start() fonksiyonu içinde eşitlemiştik.Artık kolayca kullanabiliriz.Değişkenimizin ismini yazıyoruz ve nokta koyarak Text bileşenimizin elemanına ulaşıyoruz.Bu kısa ve kolay haliydi.Uzun hali ise, “GameObject.Find (“Yazi”).GetComponent<Text>().text” şeklinde oluyor.Bunu kullanmak istemezsiniz, çünkü hem projenizin performansı düşecek hemde kod satırlarınız düzensiz bir şekilde ilerleyecektir.

Geri dönecek olursak, eşittir koyduktan sonra tırnak işareti içinde ekranda görünecek yazımızı yazıyoruz ve artık işareti koyarak zaman değişkenimizi yazıyoruz.Burada parantez içindeki “int” türevini neden koyduk derseniz, eğer koymasaydık süre haliyle float türünde şeklinde ilerleyecekti.Yani “9.016745” şeklinde olacaktı.Bu bence güzel bir görüntü değil.Bunu tek sayıya düşürmek için, değişkenimizin başına “(int)” yazıyoruz ve artık “9” şeklinde oluyor.

Kullanacağımız koşulu belirleyelim.

if (zaman > 0) {
   zaman -= Time.deltaTime;
   transform.localScale += new Vector3(x*zaman/buyumeHizi, y*zaman/buyumeHizi, z*zaman/buyumeHizi);
} else {
   Debug.Log ("süre bitti");
   Destroy (this.gameObject);
}

Evet gelelim koşulumuzu yazmaya.İlk olarak koşulumuzun ne olacağını belirliyoruz.Biz burada, zamanımız eğer sıfırdan büyükse bunları yap, değilsede bunları yap diyoruz.Eğer koşulumuz tutuyorsa, ikinci satırdaki zaman değişkenimizi Time.deltaTime ile azaltmaya başlıyoruz.Bu kod ile kare hızları herkeste eşit bir şekilde oluyordu.Burada da, süremiz normal bir biçimde azalıyor.Daha sonra üçüncü satırda, transform.localScale ile nesnemizin boyutlarını yeni değerler ile değiştiriyoruz.

Bunu sürekli yapmak için eşittirden önce artı kullanıyoruz.Parantez içindeki işleme bakacak olursak, “x*zaman/buyumeHizi” x boyutunu zaman değişkenimiz ile çarpıyoruz ve belirlediğimiz büyüme hızına bölüyoruz.Bu büyüme hızı tamamem sizin verdiğiniz değerlere göre değişebilir.Çok hızlıda yapabilirsiniz çok yavaşta yapabilirsiniz.Tamamen tercih sizin.Şimdi gelelim eğer koşulumuz sağlanmıyorsa yapılacak işlemlere.Süremiz sıfırlandığı zaman, Console penceresinde “süre bitti” olarak bir uyarı mesajı verecektir.Daha sonra ise, Destroy fonksiyonu ile bu nesnemiz sahneden silinecektir.Scriptimizin hazır duruma geldi.

Evet scriptimizi kaydedip, nesnemizin üzerine sürükleyelim ve Inspector penceresinde gerekli ayarlamaları yaptıktan sonra projemizi başlatalım.Burada tanımladığımız değişkenlerin ayarları ile oynayarak istediğimiz hızda sonuçlar almak mümkün olacaktır.Bir sonraki yazıda görüşmek üzere…