Unity’de Birden Fazla Ses Nasıl Eklenir?
Merhaba, bir önceki dersimizde Unity‘de Hinge Joint kullanımını öğrenmiştik.Bu Hinge Joint bileşeninden yararlanarak bir köprü yapmıştık.Bu şekilde, köprü fiziğine yakın bir mekanik geliştirmiştik.Bugünkü dersimizde ise, Unity‘de yapmış olduğumuz projelerde birden fazla sesi nasıl kontrol edebileceğimizi öğreneceğiz.Şimdi vakit kaybetmeden yeni bir proje oluşturalım ve dersimize başlayalım.
Sahnemizi oluşturmaya başlayalım.
Evet bu proje için kullanacağımız senaryoyu önce açıklayayım.Konumuz ses üzerine olduğu için, buna uygun bir senaryo oluşturmaya çalıştım.Böylece akılda daha iyi yer edineceğini düşünüyorum.Evet bu dersi notalar üzerinden anlatacağım.Sahnemizde bir piyano modelimiz olacak ve birden fazla sesi (yani notalarımızı) çalmaya çalışacağız.
Tabi sahnemizde bulunan bu piyano modeli sadece görsel amaçlı bulunacak.Yani biz projemizde bulunan notaları çalmak için, klavyemizde önceden belirlediğimiz tuşlara basarak sesleri çıkartacağız.Bunun dışında, piyanonun tuşları ile de ufak bir etkileşim yaptım.Yaptım diyorum çünkü bu konumuz ile alakalı bir bölüm olmamakla birlikte sadece görsel amaçlı kullanıldı.
Şimdi internetten bulduğumuz bir piyano modelini projemize dahil ediyoruz.Daha sonra sahnemizde bu piyanoyu istediğimiz kalıplara sokuyoruz.Bu kısım işimizin kolay kısmıydı.Şimdi asıl konumuza gelebiliriz.Şöyle ki, ben senaryoya uygun olarak projede notaları kullanacağım.Siz eğer bu yazıdaki senaryoyu baz alıyorsanız (ki bunu yapan yoktur diye tahmin ediyorum.), internetten nota seslerini indirip projeye dahil etmeniz gerekiyor.
Eğer kendi projenizde oluşturduğunuz senaryoya bağlı kalıyorsanız (ki bunu yapanlar pastanın büyük bir kısmını oluşturuyor.) kullanacağınız sesleri zaten hazırlamışsınızdır.Evet projemize ses dosyalarımıza da ekledik.Şimdi Hierarchy penceresinde yeni bir boş nesne oluşturuyoruz.Bu boş nesnenin üzerine tıklıyoruz.Inspector penceresinde bu nesnemize, Audio Source bileşenini ekliyoruz.Bu bileşen ile sesleri kontrol edeceğiz.
Unity‘de Audio Source bileşeninin özellikleri ve nasıl kullanıldığını daha önceki yazılarımda detaylı olarak anlatmıştım.Bu yüzden tekrar tekrar aynı şeyleri yazmayacağım.Dileyen arşive bakabilir.Şimdi projemizdeki sesleri kontrol etmek için kodlarımızı yazmaya başlayalım.Ama daha öncesinde Project penceresinde iki script dosyası görüyorsunuz.Bu script dosyasını konumuz ile alakalı olmadığı için yazmayacağım.
Birden fazla sesi nasıl kontrol edeceğiz?
Öncelikle Project penceresinde yeni bir C# Script dosyası oluşturuyoruz.Bu dosyamıza yeni bir isim verdikten sonra, editör yardımı ile açıyoruz.
public AudioSource Ses; public AudioClip[] NotaSesleri;
İlk olarak değişkenlerimizi oluşturmakla başlıyoruz.Birinci satırda, AudioSource değişkeni oluşturuyoruz.Bu değişken ile, nesne üzerindeki AudioSource bileşenini kontrol edebileceğiz.İkinci satırda ise, AudioClip dizisi oluşturuyoruz.Bu dizi içerisinde, projemizde kullanacağımız tüm sesler olacaktır.Bu şekilde sesleri istediğimiz gibi kontrol edebileceğiz.
Ses = GetComponent<AudioSource>();
Şimdi start() fonksiyonumuzun içerisine bu kodu yazıyoruz.Ses değişkenine, nesne üzerinde yer alan AudioSource bileşenini tanımlıyoruz.Böylece projemizi başlattığımız zaman, yazmış olduğumuz script üzerinde bulunan ilgili bölüme otomatik olarak eklemiş olacaktır.
void KosulluOynat() { string TusAlgila = Input.inputString; }
Evet bu projede iki farklı kullanım senaryosunu size göstereceğim.İlk olarak koşul üzerinden bir sesi nasıl oynatacağımızı öğreneceğiz.Daha sonra ise, sıralı ve otomatik bir biçimde sesleri nasıl oynatacağımızı öğreneceğiz.Şimdi koşullu oynatmadan başlayalım.Bunun için ilk olarak yeni bir fonksiyon oluşturuyoruz.İkinci satırda, string türünde bir değişken oluşturuyoruz.
Daha sonra bu değişkene, inputString fonksiyonunu tanımlıyoruz.Bu fonksiyonun görevi aslında, klavyedeki girişleri ekrana bastırmak.Yani oluşturduğumuz arayüzde (UI) tuşları göstermek için kullanılıyor.Fakat biz bu projede, bastığımız tuşları algılamak için kullanacağız.Böylece seçtiğimiz tuşa basarsak eğer, koşulu aktif etmiş olacağız.
switch (TusAlgila){ case "z" : Ses.clip = NotaSesleri[0]; Ses.Play (); break; case "x" : Ses.clip = NotaSesleri[1]; Ses.Play (); break; case "c" : Ses.clip = NotaSesleri[2]; Ses.Play (); break; }
Şimdi bu kodları az önce oluşturduğumuz fonksiyonumuzun içerisine yazalım.Bastığımız tuşları algılamak için değişkenimiz hazır.Şimdi ise bu tuşlara basılınca ne olacağını belirlememiz gerekiyor.Bunun içinde Switch Case yapısını kullanacağız.Burada bir İf Else yapısı da kullanabilirdik.Ancak tercihim bundan yana oldu.İlk satırda, parantez içerisine değişkenimizi yazıyoruz.Bu değişkenden gelen veri doğrultusunda ilgili kısım aktif olacak.İkinci satırda yani case bölümünde, istediğimiz bir tuşu seçiyoruz ve yazıyoruz.
Böylece seçtiğimiz tuşa bastığımız zaman, bu bölümde yer alan kodları aktif etmiş olacağız.Üçüncü satıra bakacak olursak “Ses” değişkenimize tanımlı olan AudioSource bileşeninin clip özelliğine, “NotaSesleri” dizisinin ilk elemanını tanımlıyoruz.Dördüncü satırda ise, Play fonksiyonu ile eklediğimiz sesi çalıyoruz.Beşinci satırda, break fonksiyonu ile diğer koşullara bakmasını engelliyoruz.Yani istediğimiz tuşu bulduk, diğer tuşları kontrol etme diyoruz.
Sesleri sıralı olarak oynatmak.
public IEnumerator SiraliOynat() { int i = 0; while (i<NotaSesleri.Length) { Ses.clip = NotaSesleri[i]; Ses.Play(); yield return new WaitForSeconds(Ses.clip.length); i++; } }
Evet, koşullu olarak nasıl sesleri çalacağımızı öğrendik.Şimdi ise, tüm sesleri sıralı ve otomatik biçimde nasıl oynatacağımızı öğrenelim.Bunu yapmak için yine bir fonksiyon oluşturuyoruz.Yalnız bu fonksiyonu oluştururken, IEnumerator metodunu kullanacağız.IEnumerator ile ilgili ayrı bir yazı yazmıştım daha önce.Detaylı olarak o yazıdan nasıl kullanılacağını öğrenebilirsiniz.
Bu fonksiyonu kullanmamızın amacı, seslerin uzunluklarının birbirlerinden farklı oluşu ve biri bittiği zaman öteki sese kolaylıkla geçmemiz içindir.Tabi bir koşul kullanmadan bu dediğimizi yapamayız.İkinci satırda, int (integer) türünde bir değişken oluşturuyoruz.Bu değişkenin değerini sıfır “0” olarak belirliyoruz.Üçüncü satırda ise, yeni bir while döngüsü oluşturuyoruz.Bu döngü ile dizideki tüm sesleri sırayla çalabileceğiz.
Döngüdeki koşulumuza bakacak olursak oluşturduğumuz “i” değişkeni, “NotaSesleri” dizimizin eleman sayısından büyük olana kadar while döngümüz çalışmaya devam edecektir.Dizimizin eleman sayısını, Length fonksiyonu ile bulabiliyoruz.Dördüncü satıra bakacak olursak, “Ses” değişkenimize tanımlı olan AudioSource bileşeninin clip özelliğine, “NotaSesleri” dizisinin “i” elemanını tanımlıyoruz.Köşeli parantez içerisine yazdığımız “i” değişkeni ile, dizideki tüm elemanlara ulaşabileceğiz.
Beşinci satırda, Play fonksiyonu ile bir önceki satırda eklediğimiz sesi çalıyoruz.Altıncı satırda ise WaitForSeconds fonksiyonu yardımı ile, o an çalan sesin uzunluğu kadar bir zaman bekliyoruz.Sesin uzunluğunu ise, parantez içerisine yazdığımız “Ses.clip.length” kodu ile buluyoruz.Böylece her döngüde bu bekleme süresi değişkenlik göstererek, çalan sesin bitene kadar değişmemesini sağlıyoruz.Yedinci satırda, “i” değişkenimizin değerini bir “1” arttırıyoruz.Böylece dizide yer alan sıradaki sese geçiyoruz.
StartCoroutine(SiraliOynat()); KosulluOynat();
Son olarak, her iki fonksiyonumuzu aktif etmemiz gerekiyor.İlk satırda bulunan kodlarımızı start() fonksiyonu içerisine yazıyoruz.Burada IEnumerator metodu ile fonksiyonumuzu oluşturduk.Bu yüzden fonksiyonumuzu çalıştırmak için, StartCoroutine fonksiyonu içerisinde yazmamız gerekiyor.İkinci satırdaki fonksiyonumuzu ise, update() fonksiyonu içerisinde kullanabiliriz.
Evet bu projemizin de sonuna geldik.Yazmış olduğumuz C# Script dosyamızı, oluşturduğumuz boş nesnemizin üzerine sürükleyerek bırakıyoruz.Daha sonra script üzerinde yer alan dizi bölümüne, Project penceremizde ki tüm ses dosyalarını sürükleyerek bırakıyoruz.Artık test edebiliriz.Bu arada, aşağıda bulunan .gif dosyasından sesi duyamayacağınız için, sosyal medya hesaplarımdan sonucu görebilirsiniz. Evet bir sonraki yazıda görüşmek üzere…