
Unity ile Basit Menü Yapımı – 2
Bir önceki derste, Unity ile basit bir menü yapmıştık.Bu menü, sadece temel öğeleri içinde barındırıyordu.Biraz daha açarsam, olmazsa olmaz bir Canvas‘ımız vardı.Bunun yanında bir Panel‘imiz vardı.Bir adet Text nesnemiz ve üç adette Button nesnelerimiz vardı.Bunların ne işe yardıklarını bir önceki yazımda belirtmiştim.O yüzden tekrar tekrar aynı şeylere girmiyorum.Şimdi isterseniz bu dersimizin konusuna geçelim.Bu derste, görmüş olduğunuz üç butona ayrı ayrı işlevler vereceğiz.Bunu yapmak içinde kod yazacağız ve bu yazmış olduğumuz kodları, ilgili butonlara görev olarak atayacağız.O zaman başlayalım.
İlk script dosyamızı oluşturalım.
İlk olarak, bir C# script dosyası oluşturalım.Bunu yapmanın bir yolu, Project penceremizde Assets klasörünün içindeyken (yada direk klasör ismine sağ tılayarak) boş bir yere sağ tıklayarak sırasıyla, Create > C# Script seçmektir.Diğer yolu ise, butonumuzu seçip, Inspector penceresinde en altta indiğimizde “Add Component” yazılı bir buton göreceksiniz.
Buna basarak çıkan arama kutusuna, oluşturmak istediğimiz scriptin ismini yazarsakta Unity bunu yeni bir script dosyası olarak yorumluyor ve arama sonuçlarında “New Script” olarak bir seçenek sunuyor.Bu butona bastığınızda ise yeni scriptin dili seçerek (güncel sürümlerde sadece C# bulunuyor), ilgili nesnenize otomatik eklemiş oluyorsunuz.Ben ilk yolu kullanarak anlatımıma devam ediyorum.
Şimdi, oluşturduğumuz C# scriptimiz bir kenarda dursun.Biz menümüzdeki butonların için yeni sahneler oluşturalım.Tabi bu üç buton içinde sahne oluşturmayacağız.Çünkü bir adet “Çıkış” butonumuz var ve bunun tek bir görevi olacağı için, bunu hariç tutuyoruz.Diğer butonlar için yeni sahneler oluşturmaya başlayalım.File menüsünde gelerek “New Scene” seçeneğini seçiyoruz.Yada kısayolu olan ctrl+n tuşlarını da kullanabiliriz.Daha sonra önümüze boş bir sahne çalışacaktır.
Aynı zamanda da, Hiyerarşi pencerimizde ki sonradan oluşturduğumuz nesnelerinde olmadığını görüyoruz.Bu normal çünkü oluşturduğumuz ve ayarladığımız tüm şeyler, diğer sahnemizde kaldı. Bu sahneye sadece bir Canvas (olmazsa olmaz), bir Panel, bir Button ve bir adet Text nesnesi ekleyeceğim.Bunu sahneler arasında geçiş yaptığımız zaman, hangi sahnede olduğumuzu görmek ve menüye geri dönebilmek için yapıyorum.Kısaca asgari koşulları sağlamakta diyebiliriz.
Yeni sahne oluşturmak.
Gerekli UI nesnelerimi, yeni açtığım sahneme yerleştirdim.Bunları nasıl yaptığımızı bir önceki derste anlattığım için, şimdi hızlı geçiyorum.Daha sonra File menüsünde gelerek “Save Scenes” (yada kısayol olarak ctrl+s) seçeneğini seçiyoruz.Ve sahnemize bir isim vererek kaydediyoruz.Daha sonra bir tane daha yeni sahne oluşturuyoruz ve aynı işlemleri o sahne içinde yapıyoruz.Ben hızlı olmak adına “prefab” kullandım.Bunun ne olduğuna ve ne işe yaradığına şimdi değinmeyeceğim.Project penceresinde, Canvas isimli bir nesne duruyor.Bu sizde olmayacaktır.O yüzden buna takılmayın.Daha sonra ayrı bir konu olarak işleyeceğiz.
Şimdi elimde üç tane sahne olmuş oldu.Bunlardan biri daha önce oluşturduğumuz, menü sahnesi, diğeri oyun sahnesi ve son olarak ayar sahnesi.Yine File menüsüne gelerek, “Build Settings” menüsüne giriyoruz.Karşımıza yeni bir pencere açılacaktır.Burada bulunduğumuz sahmeyi “Add Open Scenes” butonuna basarak eklememiz gerekiyor.Bu sahneleri eklerken bir sıraya koyarak eklemenizi tavsiye ederim.Bu ileride projenizdeki sahne sayıları arttığı zaman, yönetimini kolay sağlamanız için yararlı olacaktır.Örneğin, menü sahnesini en son eklersem bu ilerleyen aşamalarda hiyerarşik olarak bana sorun yaratacaktır.Bütün sahneleri tek tek açıp aynı yerden ekleyelim.
Kod yazamaya başlayalım.
Sahnelerimiz hazır ve artık kod yazma kısmına geçebiliriz.Bunun için Project penceremizde, oluşturduğumuz C# script dosyasını buluyoruz ve açıyoruz.Bu sizde Visual Studio ile açılabilir.Hiç sorun değil, bende MonoDevolop ile açılacaktır.Kodlar aynı işlevi göreceği için, kullandığınız derleyici seçimi tercihinize kalmış.Menüdeki butonlar aracılığı ile sahne değiştirmenin birden çok yolu mevcut.
Sizlere aslında iki farklı yol ile nasıl gerçekleştiğini göstermek istiyordum.Fakat sonra düşündüğümde, kafanızın karışmaması için minimum satır ile bu görevi nasıl gerçekleştirdiğimizi göstermeye karar verdim.Sanırım bu şekilde kafanızda daha kalıcı olur diye düşünüyorum.İlk olarak editöre baktığımız zaman, standart gelen kütüphaneler ve kodlarımızın ne zaman çalışması gerektiğini ayarlayan fonksiyon satırlarımızı görüyorsunuz.
Bunlara kısaca değinecek olursak, Start() Fonksiyonu, projemizi ilk başlattığımızda çalışıyor ve daha sonra bir işlevi yoktur.Update() fonksiyonu ise, her karede çalışacak şekilde programlanmıştır.Bunlara yeri geldikçe daha detaylı değineceğiz.Şimdi dersimize geri dönelim.Benim bu iki fonksiyonada ihtiyacım yok.Bu yüzden ikisinide siliyorum ve kodlarımı yazmaya başlıyorum.Yazdığım kodların çalışması için bir kütüphaneye ihtiyacım var.Bunu script dosyama ekstra olarak eklemem gerekiyor.
Zira şuan ki kütüphanelerin bu kodları çalıştırması için gerekli nitelikleri mevcut değil.Dosyamda, using ile başlayan satırlarımın hepsi birer kütüphaneyi temsil ediyor.Bende bunların en alt satırına gelerek, “using UnityEngine.SceneManagement;” kodumu yazıyorum.Bu dediğim gibi, birazdan yazacağımız kodların aktif olarak çalışmasını sağlayacaktır.Daha sonra ilk fonksiyonumu yazmaya başlıyorum.
public void ButonlarArasindaGecis(string SahneAdi) { SceneManager.LoadScene (SahneAdi); }
ilk satır bizim fonksiyon ismimizi oluşturuyor.Public fonksiyonumuzun diğer scriptler tarafından görülmesini sağlarken, hemen yanındaki void ibaresi C# ile fonksiyon yazarken kullandığımız bir ifadedir.Parentez içinde bulunan “string SahneAdi” ifadesini anlatmadan önce, size fonksiyonlar hakkında küçük bir bilgi vermem gerekiyor.
Fonksiyonları yazarken ister parametreli, istersekte parametresiz olarak yazabiliriz.Bunun getirdiği avantaj ve dezavantajlardan şuan için bahsetmeyeceğim.Buradaki fonksiyonumuzu parametreli olarak yazdım.Ve parantez içindeki “string SahneAdi” ifadeside bize, string yani text türünde bir değişkeni işaret ediyor.
Daha sonra, yazığımız fonksiyonun içine bakacak olursak, “SceneManager.LoadScene (SahneAdi);” yani basmış olduğumuz butondaki “SahneAdi” değişkenine git demek oluyor.Bu değişken adı bizim sahnemizin adı ile aynı olacağı için, direk ilgili sahneyi açmış oluyoruz.İlk fonksiyonumuzu yazdık.Şimdi ikincisini yazmaya başlıyalım.Bu fonksiyonuda diğer sahnelerdeki, geri gelme tuşuna atıyacağız.Böylelikle o sahneden çıkmak istersek geri menüye dönebileceğiz.
public void GeriDonButonu(string SahneAdi) { SceneManager.LoadScene (SahneAdi); }
Buradaki kodlarda deminki fonksiyonumuzun kodları ile aynı.Değişen tek şey fonksiyonumuzun ismi olmuş oluyor.Hemen diğer fonksiyonumuzu yazalım.
public void ProjeyiKapat() { Application.Quit (); }
Evet, son fonksiyonumuza bakacak olursak bu “Çıkış” butonuna eklenecek bir fonksiyonu oluşturuyor.Bu fonksiyon ile, butona bastığımız zaman uygulamayı kapatabileceğiz.Tabi bir parantez açmam gerekiyor.Bu fonksiyon Unity’de projemizi test ederken çalışmayacaktır.Eğer projemizi derleyip, açarsak işte o zaman bu fonksiyonun da çalıştığını göreceksiniz.
Butonlara görevlerinin verilmesi.
Şimdi Unity’e geri dönelim ve butonlara görevlerini vermeye başlayalım.İlk olarak, yazdığım bu C# scriptimi bir nesneye atamam gerekiyor.Bunun için Hiyerarşi pencerimize gidiyoruz ve sağ tıklayarak, “Create Empty”yi seçiyoruz.Bu bize boş bir nesne verecektir.Daha sonra bunun adını istediğimiz gibi değiştiriyoruz ve script dosyamızı sürükleyerek bu nesnemizin üstüne bırakıyoruz.Bu işlemi diğer sahnelerimizde de tekrarlıyoruz.Aslında bunun daha kısa bir yolu var.”DontDestroyOnLoad” adında bir kodumuz var.
Bu kod bize eklendiği nesnenin, sahne değiştiğinde bile silinmemesini ve yeni açtığınız sahnede de gözükmesini sağlıyor.Ancak biz uzun yolu tercih edeceğiz.Şimdi menü sahnemi açıyorum ve “yeni oyun” butonuma tıklıyorum.Inspector penceresinde Button bileşeninin altında, “On Click()” adında bir pencere görüyorsunuz.Bunu biz, butonlarımızın ne yapması gerektiğini ayarlarken kullanıyoruz.Şuan boş bulunuyor.Aşağıda bulunan “+” butonuna basarak yeni bir görev oluşturuyoruz.
Az önce oluşturduğumuz nesneyi tutup, bu penceredeki “none” yazan yere sürüklüyoruz.Daha sonra sağ tarafında bulunan “No Function” butonuna basıyoruz ve scriptimizin ismi ne ise onun üstüne geliyoruz.Yeni açılan menüden “ButonlarArasindaGecis(string)” fonksiyonumuzu seçiyoruz.Artık butonumuz için görevi tanımladık.Son olarak, aşağıda çıkan textbox yerine bu butona bastığımız zaman gidecek olduğu sahnenin ismini yazıyoruz.Burası önemli çünkü sahne ismini yanlış yazarsak hata verecektir.Ben sahnemin adını “oyun_sahnesi” olarak belirlediğim için bunu yazıyorum.
Şimdi ikinci butonumuzu geçelim.Yine aynı aşamalardan geçiyoruz.Ve bu butona basınca gitmesi gereken sahnenin ismini yazarak görevini tamanlıyoruz.Hazır menü sahnesi açıkken, “Çıkış” butonunda görevini verelim.Yine aynı aşamaları yapaağız.Tek farkı fonksiyon seçme aşamasında, bu sefer “ProjeyiKapat()” fonksiyonunu seçmek olacaktır.Şimdi menü sahnemizdeki butonlara gerekli görevlerini verdik.
Bu sahneyi kaydedelim ve diğer sahnelerimizdeki butonları ayarlayalım.Oyun ve ayar sahnelerim içinde aynı yolu kullanarak butonlarıma görevlerini veriyorum.Yine burada tek fark olarak, fonksiyon seçiminde “GeriDonButonu(string)” fonksiyonunu seçerek, textbox yerine menü sahnemizin ismini yazmak.Böylelikle, menüye dönmek istediğimizde bu buton görevini yapacaktır.
Evet bu dersimizi böylelikle tamamlamış olduk.Bir sonraki derste görüşmek üzere…