Unity’de Zemine Göre Farklı Ayak Sesleri Çalmak

Unity’de Zemine Göre Farklı Ayak Sesleri Çalmak

31 Mart 2021 0 Yazar: Ahmet Güler

Merhaba, bir önceki dersimizde Unity ile 2D projeler için ekran çözünürlüğü ayarlamayı öğrenmiştik.Böylelikle farklı çözünürlük oranlarında, sahnemizde kullandığımız kamera açısı hep aynı kalmış oluyordu.Bugünkü dersimizde ise Unity ile farklı zemin türlerine göre ayak seslerini nasıl oynatacağımızı öğreneceğiz.Evet şimdi Unity‘de yeni bir proje oluşturalım ve dersimize başlayalım.

Sahnemizi oluşturmaya başlayalım.

Evet bu projemizde kullanacağımız senaryoyu ilk önce inceleyelim.Sahnemizde farklı zemin türlerini temsil eden nesnelerimiz olacak ve bu nesnelerin üstünden geçerken, zemine uygun ayak sesini oynatacağız.Projede kullanmak istediğiniz zemin sayısına göre ses dosyalarını arttırabilir yada azaltabilirsiniz.Ben bu projede sekiz “8” farklı zemin kullanacağım.Haliyle bu zeminlere uygun aynı sayıda ses dosyamda olacak.

Şimdi Hierarchy penceresinden yeni bir Plane nesnesi oluşturuyoruz.Bu nesne bizim üzerinde yürüyeceğimiz zeminimizi oluşturacak.Daha sonra bu Plane nesnemizin ismine, projede kullanacağımız zemin isimlerinden birini veriyoruz.Ayrıca yine Plane nesnemize aynı isimde bir etiket veriyoruz.Burası önemli, çünkü üzerinde bulunduğumuz zemini etiket isminden kontrol edeceğiz.

Daha sonra Hierarchy penceresinde bulunan Plane nesnemizi, sahnemizde kullanmak istediğimiz zemin sayısı kadar kopyalıyoruz.Yalnız buradaki kopyalama işlemini birden değilde, tek tek yaparsanız karışıklığın önüne geçmiş olursunuz.Yani yeni bir kopya oluşturduktan sonra ismini ve etiketini verip, diğer kopya ile devam etmek daha iyi olacaktır.Tüm zeminlerimizi oluşturduktan sonra bu zeminlerin pozisyonlarını Scene penceresinde bulunan araçları kullanarak ayarlıyoruz.

Unity-Zemine-Gore-Farkli-Ayak-Sesleri-Calmak-Unity-Changing-Footstep-Sound-When-On-Different-Surface-

Şimdi projemize, internetten kolayla bulabileceğimiz farklı zemin kaplamalarını ekliyoruz.Sonra seçtiğimiz tüm kaplamaları Unity’de Project penceresine sürükleyerek bırakıyoruz.Artık sahnemizdeki tüm Plane nesnelerine bu kaplamaları ekleyebiliriz.Bunun için Project penceresinde bulunan herhangi bir kaplama görselini tutup sürükleyerek, Hierarchy veya Scene penceresinde Plane nesnesinin üzerine bırakmamız yeterli oluyor.

Zeminlerimiz artık hazır.Şimdi üstlerinde hareket etmemiz için bir başka nesneye ihtiyacımız var.Burada isterseniz kendi hareket mekaniğinizi oluşturabilir yada Asset Store penceresinden hazır bir asset tercih edebilirsiniz.Ben ikinci yolu tercih ettim ve Asset Store penceresinden Standart Assets paketini projeme dahil ettim.Bu paketin içerisinde bulunan “FPS Controller” prefab dosyasını kullanarak, zeminlerin üstünde hareket edeceğiz.

Unity-Zemine-Gore-Farkli-Ayak-Sesleri-Calmak-Unity-Changing-Footstep-Sound-When-On-Different-Surface-

Sahnemizi oluşturmada son aşamamız ise, ayak seslerini projemize dahil etmek olacaktır.Yine internette basit bir arama ile zemine göre farklı ayak seslerini bulabilirsiniz.Ancak burada dikkat etmeniz gerek şey, seslerin birbirleri ile uyumu olacaktır.Yani ses seviyeleri farklı olursa, örneğin bir zemin üzerinde yürürken ses çok alçak diğerinde ise çok yüksek geliyorsa bu kötü bir izlenim bırakacaktır.Ben projede kullanacağım için seslerin birbirleri ile uyumlu olmamasına çok takılmadım.Ancak bir ses düzenleme programı ile tüm sesleri aynı düzeye getirebilmeniz de mümkündür.Bunu da not düşmüş olayım.

Kodları yazmaya başlayalım.

Evet sahnemizi hazırladık.Şimdi kodlarımızı yazmaya başlayabiliriz.Zeminler arası geçiş yaparken ayak sesini değiştirmek için, farklı yollar bulunuyor.Örneğin zemine doğru atacağımız bir Raycast ışını ile o anda üzerinde bulunduğumuz zeminin türünü kontrol edebiliriz.Yada Çarpıştırıcıları kullanarak (Collision, Collider) yine zeminin türünü kontrol edebilirsiniz.Hangi yol size ve projenize daha uygun geliyorsa onu kullanabilirsiniz.Şimdi yeni bir C# script dosyası oluşturuyoruz ve editör ile açıyoruz.

public List<AudioClip> AyakSesleri = new List<AudioClip>();
public AudioSource Ses;

İlk olarak script dosyamızda kullanacağımız değişkenleri oluşturmakla başlıyoruz.Birinci satırda yeni bir AudioClip listesi oluşturuyoruz.Bu listeye projemizde kullanacağımız tüm ses dosyalarını ekleyeceğiz.Böylece çağırmak istediğimiz zaman kolaylıkla erişim sağlayabileceğiz.İkinci satırda ise, yeni bir AudioSource oluşturuyoruz.Burada script dosyamızın bulunduğu nesnenin AudioSource bileşenini kontrol edeceğiz.

Ses = GetComponent<AudioSource>();

Sonra bu kodu start() fonksiyonumuzun içerisine yazıyoruz.Burada “Ses” değişkenimize script dosyamızın bulunduğu nesnenin AudioSource bileşenini ekliyoruz.

void HareketAlgila() {
    if (transform.hasChanged) {
        if (!Ses.isPlaying) {
            Ses.Play();
        }
        transform.hasChanged = false;
    } else {
        if (Ses.isPlaying) {
            Ses.Pause();
        }
    }
}

Şimdi yeni bir fonksiyon oluşturuyoruz.Bu fonksiyonu oyuncunun hareket edip/etmediğini tespit etmek için kullanacağız.Eğer böyle bir denetim gerçekleştirmezsek, zemin üzerinde hareket etmesek bile ilgili ses dosyası çalmaya devam edecektir.İkinci satırda yeni bir koşul oluşturuyoruz.Eğer transform bilgileri değişirse ses dosyası çalacak, değişmezse ses dosyası duracak.Bunu yapmak içinde transform.hasChanged kodundan yararlanıyoruz.Bu kod ile nesnenin transform bilgilerinin değişip/değişmediğini kontrol edebiliyoruz.Üçüncü satırda yeni bir koşul daha oluşturuyoruz.

Eğer herhangi bir ses dosyası çalmıyor ise, ses dosyasını çalıyoruz.Bunun kontrolünü ise, isPlaying kodu ile sağlıyoruz.Eğer bu kontrolü yapmazsak, tüm sesler çalacak ve üst üste binecektir.Dördüncü satırda AudioSource bileşeninde bulunan ses dosyasını çalışyoruz.Altıncı satırda, transform.hasChanged kodunun değerini false olarak belirliyoruz.Böylece tekrar hareket ettiğimiz zaman true olarak döndürmüş oluyoruz.Else yani koşulumuzun sağlanmayan bölümünde ise, yine bir koşul oluşturuyoruz ve bu sefer bir sesin çaldığını kontrol ediyoruz.Eğer koşul karşılıyor ise, dokuzuncu satırda çalan sesi durduruyoruz.

Ayak seslerini kontrol edelim.

Evet şimdi ayak sesleri için yeni bir fonksiyon oluşturacağız.Ancak daha önce benim hangi yolu kullanarak projeyi oluşturduğumu söyleyeyim.Yazının önceki bölümlerinde bu işi farklı yolları kullanarak yapabileceğimizi söylemiştim.Ben Raycast ile zemin denetimini gerçekleştirdim.Ancak isteyen olursak, çarpıştırıcı kullanarak nasıl yapıldığını da anlatabilirim.Zaten mantık olarak aynı aşamaları oluşturuyorlar.

void SesDegistir() {
    RaycastHit hit;
    if (Physics.Raycast(transform.position, Vector3.down, out hit)) {
        Debug.DrawRay(transform.position, Vector3.down * 1, Color.green);
        string zeminEtiketi = hit.collider.gameObject.tag;
        switch (zeminEtiketi)
        {
            case "beton":
                Ses.clip = AyakSesleri[0];
                HareketAlgila();
                break;
            ...
        }
    }
}

Evet fonksiyonumuzu oluşturduktan sonra, ikinci satırda bir RaycastHit oluşturuyoruz.Böylece ışın atıp çarpışmaları tespit edebileceğiz.Üçüncü satırda yeni bir koşul oluşturuyoruz.Bu koşulda Physics.Raycast kullanarak, çarpışma olması durumda koşulumuzun içerisine girebileceğiz.Parametrelere bakacak olursak parantez içerisinde sırasıyla, nesnemizin pozisyon bilgileri, ışınımızın yönü ve ışınımız bulunuyor.Dördüncü satırda DrawRay fonksiyonu ile Raycast ışınımızı Scene penceresinde görebiliyoruz.

Beşinci satırda yeni bir string değişkeni oluşturuyoruz.Bu değişkenimize ışın atarak tespit ettiğimiz zeminlerin etiketlerini eşitliyoruz.Bunu “hit.collider.gameObject.tag” kodu ile sağlıyoruz.Altıncı satırda yeni bir switchcase yapısı oluşturuyoruz.İsterseniz ifelse yapısı ile de yapabiliriz.Burada tercih sizin, benim projemde fazla zemin türü olduğu için bana ilk yol daha uygun geldi.Parantez içerisine az önce oluşturduğunuz “zeminEtiketi” değişkenini yazıyoruz.Böylece zemine göre farklı ayak seslerini oynatabileceğiz.

Örnek olarak sekizinci satıra bir bakalım.Burada “beton” etiketine sahip bir zemin üzerinde hareket edecek olursak, bu bloğun içerisine gireceğiz.Dokuzuncu satırda AudioSource bileşeninin “clip” bölümüne “AyakSesleri” listesinde yer alan ilk sesi eşitliyoruz.”AyakSesleri[0]” burada köşeli parantezin içerisindeki sıfır “0”, beton sesini temsil ediyor.Daha sonra onuncu satırda, “HareketAlgila()” fonksiyonumuzu çağırıyoruz.Böylece bir önceki satırda belirlediğimiz ayak sesini çalabiliyoruz.

SesDegistir();

Evet son olarak update() fonksiyonumuzun içerisine bu kodu yazıyoruz.Şimdi script dosyamızı tamamladık.Unity‘de Project penceresinde bulunan C# script dosyamızı tutup sürükleyerek, oyuncu nesnemizin üzerine bırakıyoruz.Daha sonra yine Project penceresinde bulunan tüm ses dosyalarını aynı şekilde tutup sürükleyerek, Inspector penceresinde script bileşenimizin “AyakSesleri” bölümüne bırakıyoruz.Artık projemizi test edebiliriz.Evet bu projenin de sonuna geldik.Bir sonraki yazıda görüşmek üzere…

Unity-Zemine-Gore-Farkli-Ayak-Sesleri-Calmak-Unity-Changing-Footstep-Sound-When-On-Different-Surface-