Unity Dersleri 09 - Space Invaders III

Önceki dersimizde space invaders oyununu yapmaya devam etmiştik. Bu blogu okumadan önce ders 7 ve ders 8'i  okumanızı öneririm. Çünkü bu blog onların devamı niteliğinde olacak.

Geçtiğimiz hafta uzay gemimizin mermisini ve mermisinin 'power up' özelliklerini oluşturmuştuk. Bu dersimizde kaldığımız yerden devam edeceğiz. 

Öncelikle oluşturmuş olduğumuz mermi objemize ses efekti ekleyerek başlayalım haftamıza. Assets klasörümüzün altına ses efektleri için 'Sounds' adında bir dosya oluşturalım. Bu dosyanın içine mermimizin ses efektini içeren .wav uzantılı dosyamızı ekleyelim. (shotSound.wav dosyasına buradan ulaşabilirsiniz.)



Başarılı bir şekilde import ettiğimiz sound dosyasını bullet objemizin içine entegre etmek için aşağıdaki adımları tek tek yapalım. Sağ alt köşeden dilerseniz sesi dinleyebilirsiniz. İsterseniz kendi ses dosyalarınızı da oluşturabilirsiniz.



Yukarıda da göstermiş olduğum gibi PlayerCharacterimizin içine Audio Source componentını ekliyoruz. Ses dosyamızı da aşağıdaki gifte gösterildiği gibi sürükle bırak yöntemiyle AudioClip parametresine ekliyoruz. Play On Awake seçeneğini de devre dışı bırakıyoruz, çünkü ses dosyamızın uyanıkken değil de ateş edildiğinde çalmasını istiyoruz. 


Bunu bullet'ımızın içine implemente etmek için AudioSource ve AudioClip'i scriptimizde tanımlıyoruz. (PlayerCharecter.cs)


Daha sonra önceden oluşturmuş olduğumuz Shooting() metodumuzun içinde space'e basıldıktan sonra olacaklar kısmının başına oluşturmuş olduğumuz aSource'un bir metodu olan PlayOneShot metodunu çağırıyoruz ve parametresine de ses dosyamızı koyuyoruz.


Bu aşamadan sonra unity'ye geri dönüyoruz ve oluşturmuş olduğumuz shout sound parametresinin içine ses dosyamızı koyuyoruz. 


Oyunu şimdi çalıştırıp space tuşu ile mermi yolladığınızda ses klibinin sorunsuz bir şekilde çalışması gerekiyor. Sıra geldi mermiye bastıkça oluşan friendlyBullet(Clone)'larına.


Bu oluşan clone objeler teorik olarak oyunumuzun 3d düzlemi içerisinde sonsuza kadar gidiyor ve yok olmuyorlar. Bu da oyunumuz için istemediğimiz bir şey çünkü fazladan cpu kullanımına yol açarak gereksiz kaynak kullanımına sebep oluyor. Bunun önüne geçmek için unity projemizin içine geri dönelim ve 'DeathTimer' adında yeni bir script dosyası oluşturalım. Bu script dosyamızın içine nesnemizin kaybolmasını -bir nevi oyunumuzdan silinmesini- sağlamak amacıyla bir timer tanımlayacağız.


Yukarıda da gösterildiği gibi bir adet float timer tanımlayacağız ve update metodunun içerisine objemizi destroy etmesi için gereken kodları yazıyoruz. Bir nevi objemize bir son kullanma tarihi vermiş oluyoruz. Her space'e bastığımızda oluşan friendlyBullet objemizin içine DeathTimer component'ını ekliyoruz.



Daha sonrada aşağıdaki gifte görüldüğü gibi Timer parametremize 2sn vererek oyunu çalıştırıyoruz. Oluşan friendlyTimer (Clone) objelerinin 2sn sonra oyundan silindiğini görebilirsiniz.

Tam ekran görmek için tık.

Bu kısmı da hallettiğimize göre şimdide mermimizin yok olduğu yerde -veya düşmana vurduğumuz yerde- oluşacak bir efekt eklemeye çalışalım. Bunu particle efekti ile yapacağız. Projemize aşağıda gösterildiği gibi bir particle system'i ekleyelim.


Particle'ı düzgünce görebilmek için pozisyonlarını aşağıdaki gibi 0,0,0'a çekelim.


Particle'ımızın içinde aşağıdaki gifte göstermiş olduğum değişiklikleri yapıyoruz.


Gif biraz uzun o yüzden izlemek istemeyenler için yaptığım değişiklikler: 

Emission içerisindeki Rate vver Time'ı 0'a eşitleyelim ve  Bursts kısmında artıya basarak bir satır ekleyelim eklediğimiz satırda sanırım unity'nin sürümüne göre değişen count kısmında min olanı 40 max olan kısmı ise 100 yapalım. Benim sürümüm yüklü ise count'u random between two constans şeklinde ayarlayıp yapabilirsiniz. 

Shape kısmındaysa şeklimizi sphere'e yapalım ve  Randomize Direction'u true yapmak için 1'e eşitleyelim. Daha sonraysa yukarı çıkarak Particle Systems'in altında bulunan seçeneklerden Start Size'ı 0.3 yapalım ve Simulation Speed'i 4'e eşitleyelim. Son olarak particle'ımızın rengini değiştirelim. Ben koyu bir kırmızı yapmayı tercih ettim.

Particle'ımızın adını friendlyParticle yapalım ve prepabs dosyamızın içerisine ekleyelim.


Sürükle bırak ile eklemeden önce Looping parametresini disable yapmayı unutmayalım. Ben disable'ı sonradan yaptım unuttuğum için.


Dosyamızın içine ekledikten sonra scene içerisindeki friendlyParticle'ı projemizden silebiliriz. DeathTimer.cs class'ımızın içine girerek -sonuçta bizim bu efektimiz mermimiz yok olurken oluşacak o yüzden deathTimer içine tanımlıyoruz- particle tanımlıyoruz ve mermimizin oyundan silinirken çalışan kodunun içine aşağıdaki gibi kodumuzu yazıyoruz.


Unity'de projemize dönüp friendlyBullet'ımıza bakarsak eğer deathTimer component'inin içine bir particle parametresinin oluştuğunu görebiliriz. Bu parametrenin içine friendlyParticle objemizi ekleyelim.



Projeyi başlatıp bir kaç atış yaparsanız bu seferde friendlyParticle(Clone)'larının silinmeyip birikmeye başladığını göreceksiniz.


Bunu önlemek için prefabs dosyası içerisindeki friendlyParticle objemize deathTimer ekleyelim ve değerini 3 yapalım. Ama burdaki problem ise friendlyParticle objemizin içindeki particle metodu. Bunun önüne geçmek için deathTimer.cs classımızın içerisindeki kodumuza bir kontrol ekliyoruz.



Eklediğimiz bu tek satırlık kontrol, eğer parametremizin içinde particle objesi var ise Instantiate... kodunu çalıştırmayı, yoksa da o satırı atlayıp direkt olarak Destroy satırına geçmemizi sağlıyor.

Ve son olarak oyunumuzu friendlyBullet'ın deathTimer'ındaki timer'ı 0.2 yaparak projemizi çalıştırıp deneyebiliriz. Böylece mermilerimizin yok olduğunu ve sparkle'ların oluştuğunu gözlemleyebiliriz.


Yorumlar

Popüler Yayınlar