Unity’de Gece Gündüz Döngüsü Yapımı

Unity’de Gece Gündüz Döngüsü Yapımı

4 Şubat 2020 2 Yazar: Ahmet Güler

Merhaba, bir önceki yazımızda Unity‘de bir radar sistemi yapmıştık.Bu radar ile belirlediğimiz nesnelerin yerlerini dinamik bir şekilde tespit edebiliyorduk.Bugünkü yazımızda ise, Unity‘de gece gündüz döngüsü yapacağız.Vakit kaybetmeden yeni bir proje oluşturalım ve dersimize başlayalım.

Sahneyi oluşturma aşamaları.

Bu projemizde kullanacağımız senaryoya bir göz atalım.Unity‘de hali hazırda bulunan ışık nesnesi bizim güneşimizi oluşturacak.Ayriyeten sahnemize bir saat modeli ekleyeceğiz.Bu model ile de, günün hangi diliminde olduğumuzu kontrol edeceğiz.Evet şimdi, sahnemize Plane nesnesi ekleyerek başlayalım.Daha sonra saat modelimizin asılı duracağı yeri oluşturuyoruz.Bunun için, bir Cube nesnesi ekliyoruz.

Daha sonra bir tane daha Cube nesnesi ekliyoruz.Bu nesnelerin bir tanesi betonu oluşturacak diğeri ise, saatimizin asılı duracağı direği oluşturacak.Şimdi internetten bulduğumuz bir saat modelini indirelim ve projemize dahil edelim.Şimdi ışık nesnemize yeni bir etiket veriyoruz.Son olarak sahnemizde ki nesnelere istediğimiz kaplamaları veriyoruz.Bu aşama şart değil.Sizin tercihinize kalmış.Evet artık sahnemiz hazır duruma geldi.Son hali bu şekildedir.

unity-gece-gündüz-döngüsü-yapımı-day-night-cycle

Güneşin açılarının ayarlanması.

Evet bu proje için iki adet C# Script dosyası oluşturacağız.Bir tanesi güneşimizi oluşturacak ışık kaynağını kontrol ederken, diğer saatimizi kontrol edecek.Şimdi ilk script dosyamızı oluşturarak başlayalım.

public Light Gunes;
public float BirTamGun;
public float GeceGunduzDengesi;
public float GunesIsinlarininAcisi;
public float GunDonumuNoktasi;
public float IsiginParlaklıkSeviyesi;

Bu döngü için bize gerekli değişkenler bu şekildedir.İlk satırda, bir Light değişkeni oluşturuyoruz.İkinci satırda, güneşin doğuş ve batış süresini ayarlamak için float türünde bir değişken oluşturuyoruz.Üçüncü satırda, gece ve gündüz geçişlerini kontrol etmek için bir değişken tanımlıyoruz.Dördüncü satırda, ışık nesnesinin açısını kontrol edebilmek için bir değişken oluşturuyoruz.Beşinci satırda, ışık kaynağının y eksenindeki pozisyonunu ayarlamak için bir değişken oluşturuyoruz.Son satırda ise, bu ışığın parlaklığını kontrol etmek için bir değişken oluşturuyoruz.

Gunes =	GameObject.FindWithTag("isik").GetComponent<Light>();
BirTamGun = 20f;
GeceGunduzDengesi = 0;
GunesIsinlarininAcisi = 100f;
GunDonumuNoktasi = 200f;
IsiginParlaklıkSeviyesi = Gunes.intensity;

Şimdi start() fonksiyonunun içerisine bu kodları yazalım.İlk satırda, ışık nesnesini kontrol edebilmek için, etiketi “isik” olan nesnenin Light bileşenini değişkenimize eşitliyoruz.İkinci satırda, gündüz gece süresini ayarlamak için değişkenimize bir değer veriyoruz.Bu değer ne kadar yüksek olursa, zaman o kadar yavaş geçer.Üçüncü satırda, değişkenimizi sıfıra “0” eşitliyoruz.

Bu değişken sıfır ile bir arasında değer alacak ve günün belli zamanlarını oluşturmak için, bu değişkenden yararlanacağız.Dördüncü satırda, ışık kaynağımızın x eksenindeki açısına bir değer veriyoruz.Bu açı sabit kalmamakla birlikte sürekli değişecektir.Beşinci satırda, ışık kaynağımızın yada güneşimizin y eksenindeki doğuş noktasını belirliyoruz.Son satırda ise, değişkenimize ışık kaynağımızın parlaklık seviyesini eşitliyoruz.

GeceGunduzDengesi += (Time.deltaTime / BirTamGun) * 1;
Gunes.transform.localRotation = Quaternion.Euler((GeceGunduzDengesi * 360f) - GunesIsinlarininAcisi, GunDonumuNoktasi, 0);
float IsiginParlaklıkYogunlugu = 1;

Şimdi update() fonksiyonumuzun içerisine bu kodları yazıyoruz.İlk satırda, değişkenimizin değerini yavaşça arttırıyoruz.Bu işlem için, belirlediğimiz gece gündüz süresini Time.deltaTime fonksiyonuna bölüyoruz ve çıkan sonucu bir ile çarpıyoruz.Bu hesaplama ile daha yumuşak geçişler görüyoruz.İkinci satırda, ışık nesnemizin açısını değiştiriyoruz.

X eksenindeki açısını bulmak için, az önce hesapladığımız ve sürekli değişen değişkenimizi üçyüzaltmış ile çarpıyoruz.Daha sonra ise güneş ışınlarının açısını belirlediğimiz değişkenden çıkartıyoruz.Y ekseninde, güneşin doğuş noktası için oluşturduğumuz değişkeni yazıyoruz.Z ekseninde ise, bir işlem yapmıyoruz.Son satırda ise, Bu ışığımızın zaman içerisinde ki yoğunluğunu düzenlemek için bir değişken oluşturuyoruz.

if (GeceGunduzDengesi <= 0.23f || GeceGunduzDengesi >= 0.75f) {
   IsiginParlaklıkYogunlugu = 0;
} else if (GeceGunduzDengesi <= 0.25f) {
   IsiginParlaklıkYogunlugu = Mathf.Clamp01((GeceGunduzDengesi - 0.25f) * (1 / 0.02f));
} else if (GeceGunduzDengesi >= 0.73f) {
   IsiginParlaklıkYogunlugu = Mathf.Clamp01(1 - ((GeceGunduzDengesi - 0.73f) * (1 / 0.02f)));
}

Şimdi bir koşul oluşturuyoruz.Bu koşul ile, güneş kaynağımız olan Light nesnesinin parlaklık ayarını kontrol edeceğiz.Burada ki mantık kısaca, koşulumuzda yazdığımız değişkenin altığı değere göre ışık kaynağımızın parlaklık şiddetini düzenliyoruz.İlk satıra bakacak olursak, değişkenimizin değeri, “0.23 ile 0.75” arasındaysa koşulumuz doğru oluyor ve ikinci satırda bulunan değişkenin değerini sıfıra eşitliyor.

Eğer bu değerler arasında bulunmuyorsa o zaman, diğer seçenekleri kontrol ediyoruz.Bunu else if ile yapıyoruz.Yani veya anlamına geliyor.Bu olmazsa şuna bak, o da olmazsa diğerine bak gibi.Üçüncü satırda eğer değişkenimizin değeri, “0.25”in altındaysa veya bu değere eşit durumdaysa, ışık kaynağımızın parlaklık şiddetini Mathf.Clamp01 fonksiyonunu kullanarak hesaplıyoruz.Bu fonksiyon, hesaplama sonucunda çıkan değeri sıfır ile bir arasında tutuyor.

Yani eğer sonuç eksi bir değer ise, sıfıra eşitliyor birden büyükse de tekrar bire eşitliyor.Eğer değişkenimiz için bu koşulda şartları sağlamıyorsa o zaman diğer koşula geçiyoruz.Beşinci satırda, değişkenimizin değeri “0.73”e eşitse veya büyükse, yine ışığımızın parlaklık şiddeti hesaplanıyor.Yalnız bu sefer, birden çıkartıyoruz.Çünkü bu dilimde, ışığımızın parlaklık şiddetini minimum seviyede tutmamız gerekiyor.

if (GeceGunduzDengesi >= 1) {
   GeceGunduzDengesi = 0;
}
Gunes.intensity = IsiginParlaklıkSeviyesi * IsiginParlaklıkYogunlugu;

Update() fonksiyonuna kodlarımızı yazmaya devam ediyoruz.İlk satırda, yeni bir koşul oluşturuyoruz.Bu koşul bize istediğimiz gece gündüz döngüsünü sağlayacak.Koşulumuza bakacak olursak değişkenimizin değeri bire eşit veya birden büyükse, bu değişkeni tekrar sıfıra eşitleyerek baştan başlatıyoruz.Böylelikle bir döngü hali olmuş oluyor.Son satırda ise, ışık kaynağımızın yani güneşimizin intensity ayarını belirliyoruz.Buradaki ayar güneş için kullandığımız Light nesnemizin ışık yoğunluğunu belirliyor.Bu değeri bulmak için, iki değişkeni birbirleri ile çarpıyoruz.Evet bu script dosyamız hazır.

Akrep ve yelkovan kollarının ayarlanması.

Şimdi saatimizde kullanacağımız ikinci script dosyasını oluşturalım.Bu dosyada, saat modelimizin üzerinde bulunan akrep ve yelkovan kollarını kontrol edeceğiz.

public Transform AkrepKolu;
public Transform YelkovanKolu;
gecegunduz GeceGunduzScripti;

İlk olarak değişkenlerimiz oluşturalım.İlk ve ikinci satırda, Transform değişkenleri oluşturuyoruz.Bu değişkenler ile, akrep ve yelkovan nesnelerimizin pozisyon değerlerini alacağız.Son satırda ise, ilk script dosyamızı tanımlıyoruz.Bu script dosyasından veri çekmek için kullanacağız.

GeceGunduzScripti = GameObject.Find("Main Camera").GetComponent<gecegunduz>();

Şimdi start() fonksiyonunun içerisine bu kodu yazıyoruz.Değişkenimizi, ismi “Main Camera” olan nesnemizin script bileşenine eşitliyoruz.Bu projede ki script dosyalarını, ana kameramıza eklediğimiz için çağırırken onu kullanıyoruz.

float SaatinTuru = 360f / 12f;
float DakikaninTuru = 360f / 60f;
float Saat = 24 * GeceGunduzScripti.GeceGunduzDengesi;
float Dakika = 60 * (Saat - Mathf.Floor(Saat));
AkrepKolu.localRotation = Quaternion.Euler(0, 0, Saat * SaatinTuru);
YelkovanKolu.localRotation = Quaternion.Euler(0, 0, Dakika * DakikaninTuru);

Bu kodları update() fonksiyonunun içerisine yazıyoruz.İlk satırda, akrep kolunun bir saatteki dönüşünün hızını ayarlamak için değişkenimizi oluşturuyoruz.İkinci satırda aynı şekilde bu sefer, yelkovan kolunun hızını ayarlamak için değişkenimizi oluşturuyoruz.Üçüncü satırda, saatimizi ayarlamak için, 24 ile ilk script dosyasından çektiğimiz “GeceGunduzDengesi” değişkenini çarpıyoruz.Dördüncü satırda, dakikamızı ayarlamak için, 60 ile parantez içerisinde bulunan değeri çarpıyoruz.

Paranteze bakacak olursak, saat değişkenimizin değerinden Mathf.Floor fonksiyonu ile bulduğumuz değeri çıkartıyoruz.Bu fonksiyon ile değeri tam sayıya çeviriyoruz.Beşinci satırda, değişkenimizin rotasyonunu, Quaternion.Euler fonksiyonu ile değiştiriyoruz.Burada sadece z eksenindeki açısını değiştiriyoruz.Bu açıyı bulurken, saat değişkenimiz ile tur için oluşturmuş olduğumuz değişkeni çarpıyoruz.Son satırda ise yine aynı işlemi yapıyoruz.Ancak bu sefer yelkovan nesnesi için oluşturduğumuz değişkenleri kullanarak yapıyoruz.Bu script dosyamız artık hazır duruma geldi.

Oluşturduğumuz bu iki script dosyasını ana kamera (main.camera) nesnemizin üzerine sürükleyip bırakıyoruz.Daha sonra akrep ve yelkovan nesnelerini, script üzerindeki yerlerine ekliyoruz.Evet bu projemizin de sonuna geldik.Bir sonraki yazıda görüşmek üzere…

unity-gece-gündüz-döngüsü-yapımı-day-night-cycle