Unity Dersleri 10 - Space Invaders IV

Bu hafta da geçen haftalarda yapmaya başlayıp devam ettiğimiz Space Invaders oyununa devam edeceğiz. Öncelikle 8.dersimizde yapmış olduğumuz power up'ları aktif ederek başlayalım. Bunun için projemize power up ve power down objelerimizi ve rgba dosyalarını projenin models kısmına import ederek başlayalım. (Bu dosyalara buradan ulaşabilirsiniz.)



PowerUp objemizi sürükle bırak tekniğiyle projemize ekliyoruz ve X rotation'unu 90 yapıyoruz. Objemiz fazla büyük olduğu için scale kısmından x,y ve z'yi 0.4'e çekiyoruz.


Ve powerUp objemize rgba rengini ekliyoruz. RigitBody ve BoxCollider componentlerinide ekleyip RigitBody'den UseGravity özelliğini disable ediyoruz. BoxCollider'dan ise Edit Collider diyerek objemize uygun bir dış katman oluşturuyoruz. ve Is Trigger parametresini enable ederek aktifleştiriyoruz, çünkü uzay gemimizin bu objeye dokunduğunda bir trigger görevi görmesini istiyoruz. Önceden bu componentdan bahsetmiştik. Hatırlamayanlar 3.derse bakabilirler.  


Son olarak objemize 'powerUp' tagını ekliyoruz. Bunu da add tag kısmından ekleyip yapıyoruz.


Oluşturduğumuz objemizi sürükle bırak yaparak prefab klasörümüze aktarıp projemizin scene hiyerarşisinden siliyoruz.

Bu yaptığımız adımların aynısını powerDown objemiz içinde yapıyoruz. Tek fark yaptığımız rengin ona özel rgba rengi olması ve eklediğimiz tag'ın powerDown tagı olması. Linkteki giften yapılışını adım adım izleyebilirsiniz. (Is Trigger özelliğini enable etmeyi unutmayallım.)



Şimdide playercharacter.cs dosyasında oluşturduğumuz bu objelerin işlevleriyle ilgili kodları yazacağız. void OnTriggerEnter adında collider parametresi alan bir metod oluşturuyoruz. Uzay gemimiz powerUp taglı bir collider'a denk geldiğinde eğer power değişkenimiz 3den küçükse power'ı 1 arttırıyoruz, powerDown taglı bir collider'a denk geldiğinde ise power değişkeni 1den büyükse power'ı bir azaltıyoruz.






Giftede görüldüğü gibi gemimiz bu objelere denk geldiğinde yapmaya çalıştığımız gibi power özelliğimiz değişiyor artık. Gemimizin bun objelere değince objelerin ekranda kalmasını istemiyoruz. Bunun içinde PlayerCharacter class'ımızda yazmış olduğumuz if'lerin sonuna Destroy(col.gameObject); kodunu ekliyoruz. Böylece geminin değmiş olduğu objeler oyunumuzdan silinmiş oluyor.





PowerUp ve powerDown objeleri biraz büyük gözüktüğü için scale'lerini 0,4'ten 0,3'e çektikten sonra projemize düşman mermilerini ve istilacıları (düşmanları) eklemeyelim. 

Projemize gerekli olan objeleri ve rgba renklerini models class'ımıza import ediyoruz. (Objelere ulaşmak için tık.) Import ettikten sonra istilacılarımızı projemize sürükle bırak yaparak ekliyoruz. Renklerini de ekledikten sonra rotationlarını X'lerini -90, scale'lerini 0,1'e eşitliyoruz. (Ekranda rahatça görmek istiyorsak position Z'lerini 0'a eşitliyoruz.)



Ve RigitBody ile BoxCollider componentlerini objelerimize ekliyoruz. RigitBody'nin Gravity parametresini disable ediyoruz ve Constraints kısmından Froze Rotationların hepsini enable ediyoruz ki bir şeye çarptığında objemizin Rotation'u değişip proje ekranımızda dönmesin.



BoxCollider'ı da inviders'larımızın çevresini saracak şekilde editliyoruz. Linkteki gifte hepsini projemize ekledim ve birisi için component'ların nasıl yapılması gerektiğini gösterdim. Bütün inviders objelerimize aynısını yapıyoruz. 


Bunları yaptıktan sonra Script dosyamızın altına EnemyController class'ını oluşturuyoruz. İçerisine iki adet public değişken atıyoruz. Bir tanesi düşman gemilerinin hızları için diğeriyse ne kadar sürede bir yön değiştireceklerini belirlemek için.




Oluşturduğumuz bu yeni component'ı prefabs içindeki inviders objelerimize ekliyoruz. 



Düşman gemilerimizin hareketleri için oluşturduğumuz script dosyasına movement metodu ekliyoruz. Ondan önce Rigitbody değişkeni tanımlayıp, Start() metodu içinde çekiyoruz. Çektiğimiz rig değişkenini oluşturduğumuz movement içerisinde yön veriyoruz. Düşman gemisi karşıdan (yukarıdan aşağıya) geleceği için, Vector3.up ile -speed'i çarpıyoruz.



Oyunumuzu çalıştırıp deneyelim. Speed parametresine bir değer atamayı unutmayalım.



Biz geminin düz olarak inmesini değilde, sağa/sola doğru hareket ederek inmesini istiyoruz. Bu yüzden movement kodumuzda değişiklik yapıyoruz ve Vector3() şeklinde tanımlayarak koordinat düzleminde hangi yöne hareket etmesini istiyorsak o kısımlara speed veriyoruz.



Aynı zamanda tek yöne değilde düşman gemisinin random olarak her iki yöne de gitmesini istiyorduk. Bunun içinde boolean bir directionSwitch değişkeni tanımlıyoruz ve Movement() metodumuzda directionSwitch true ise sağ, false ise sol şeklinde aşağıdaki gibi bir if-else yazıyoruz.



DirectionSwitch değişkenimizin zamanla değişmesi için SwitchTimer() adında bir metod tanımlıyoruz. Önceden tanımlamış olduğumuz changeTimer değişkenimizi bu metoda her girdiğinde changeTimer -= Time.deltaTime; koduyla azaltıyoruz. ChangeTimer değişkenimiz 0 ve daha düşük bir sayıya düşerse directionSwitch değişkenimizi true ise false, false ise true'ya eşitliyoruz.

Bu eşitlemeden sonra changeTimer'ımız 0lanmış oluyor. Bunun önüne geçip eski değerine atayabilmek için bir tane daha değişken olupturup bunu program başladığında changeTimer'a eşitliyoruz ki değerimiz korunmuş olsun. SwitchTimer metodunda bu içine attığımız değişkeni changeTimer'ımıza eşitliyoruz. Böylece projemiz başladığında changeTimer'ın değeri ne ise ona eşitlemiş oluyoruz. Ben bu değişkene maxTimer adını verdim.  Unutmadan directionSwith değişkenimizi program başladığında false ya da true herhangi bir değere eşitleyebilirsiniz, null olarak kalmasın yeter ve switchTimer() metodunu Update'de çağırmayıda unutmayalım. Kodumuzun hepsi aşağıdaki gibi.




Projemizi çalıştırıp kodumuzu deneyelim. Öncelikle changeTimer parametresine istediğiniz bir değeri verin, ben 2'ye eşitledim. Speed'i de 150'ye çıkardım.



Gördüğünüz gibi istilacı gemimiz artık istediğimiz gibi hareket ediyor. Takıldığınız bir yer varsa sorabilirsiniz.

Yorumlar

Popüler Yayınlar