Unity Dersleri 08 - Space Invaders II

Önceki dersimizde space invaders oyununu yapmaya başlamıştık. Bu dersimizde de oyunumuzu yapmaya ve yeni özellikler eklemeye devam edeceğiz.

Öncelikle savaş gemimizin oyun ekranından çıkmaması için limitler ekleyeceğiz. Bir adet C# script dosyası oluşturalım ve MonoBehaviour özelliğini kaldıralım. Çünkü component olarak dosyamızı direkt kullanmayacağız, sadece public bir class'a ihtiyacımız var. Oluşturduğumuz dosyanın içine x ve y koordinatları için maximum ve minimum noktalar belirleyelim.


Oluşturduğumuz bu noktaların serializiable olduğunu göstermek için class'ımızın başına [System.Serializable] yazalım. Classımızın son hali aşağıdaki gibi olmalı.


Sıra geldi limitlerin koordinatlarını belirlemeye. Öncelikle maplimits class'ını daha önceden oluşturduğumuz PlayerCharacter class'ında bir type olarak kullanarak variable tanımlayalım. (public MapLimits Limits;Şimdi de değerlerini vereceğiz. Değerler için oyunumuzu açalım. Artık PlayerCharacter objemizin içinde aşağıda görüldüğü gibi Limits kısmı var.


 Limitlerimiz player character objemizde bu şekilde gözükmeli. 


Şimdi de max/min limitlerimizi seçmek için oyunu başlatalım. Aşağıdaki gibi limitlerimizi belirleyebiliriz.


Tanımladığımız bu variable'ı class'ımızın update kısmında kullanalım. Geçen dersimizde de kullanmıştık ancak merak ediyorsanız vector3'le ilgili daha fazla bilgiye buradan ulaşabilirsiniz. 

transform.position = new Vector3(Mathf.Clamp(transform.position.x,Limits.minimumX, Limits.maximumX), 
                                                           Mathf.Clamp(transform.position.y,Limits.minimumY,Limits.maximumY),0.0f);

Böylece haritamızın limitlerinin kontrolünü yapmış olduk.


Tanımladığımız bu variable'ı class'ımızın update kısmında kullanalım. Geçen dersimizde de kullanmıştık ancak merak ediyorsanız vector3'le ilgili daha fazla bilgiye buradan ulaşabilirsiniz. 

Friendly Bullet
Bu adımımızda uzay gemimizin mermisini oluşturacağız. Assets klasörümüzün içerisine yeni bir dosya oluşturarak adını models koyalım ve models dosyamızın içine mermi objemizi ve rgba (rengi) içeren png'mizi import edelim. (Obje ve png dosyasına buradan ulaşabilirsiniz.) Import ettikten sonra sürükle bırak yoluyla objemizi projemize ekleyelim.


Bullet objemizi de scale kısmından küçültelim.


Objemize önceki dersimizde yaptığımız gibi box collider ekleyelim ve boyutlarını edit collider diyerek ayarlayalım.


Bullet'ımıza Rigidbody component'ını ekleyelim ve seçili olan use gravity özelliğini kaldıralım.


Objemizin untagget olan Tag kısmını değiştirelim ve friendlyBullet şeklinde tag'leyelim.





Son olarak hazırladığımız bullet'ımızı assets'in içine bir dosya oluşturarak (prefabs) sürükle bırak yoluyla aktaralım.


Artık elimizde hazırladığımız kalıplara uygun default bir friendly bullet objesi var. Scene'imizden friendlyBullet objemizi kaldırabiliriz(silebiliriz).

Kaldırdıktan sonra projemize küp objesi ekliyoruz.


Eklediğimiz küpü gemimizin ortasına -tepesinde olacak şekilde- konumlandırıyoruz.


Konumlandırdığımız küpümüzden 2 tane daha duplicate (kopyalayarak) ederek gemimizin her iki tarafına da küpümüzü ekliyoruz.


Küplerimizi player character objemizin içine sürükle bırak yaparak ekliyoruz. Adlarını shoot, shootRight ve shootLeft yapıyoruz. Küplerimizin içinde bize lazım olmayan Cube (Mesh Filter) ve Box Collider componentlarını aşağıdaki gibi siliyoruz. 



Projemizin ve küplerin son görünümü ;


PlayerCharacter.cs class'ımızın içine gidip pozisyonlarımızı ve bullet'ımızı (mermimizi) variable olarak tanımlıyoruz.


Şimdi de projemizin içine girerek sürükle bırak yöntemiyle objemizin içindeki variable'ları küpler ve önceden hazırlamış olduğumuz friendlyBullet ile eşleştirelim.


Oluşturduğumuz 3 ayrı ateş etme pozisyonunun oyun başladığında ilk başta kullanılmasını istemiyoruz sadece ortadaki pozisyonun kullanılabilmesini istiyoruz. Diğer 2 pozisyonun ise (sağ ve sol) oyuncumuz güçlendirici kazandıktan sonra aktif olmasını istiyoruz. Bunun için  PlayerCharacter class'ımızda power adlı integer bir variable oluşturuyoruz. Bu power'ımız ateşlediğimiz mermi sayısını temsil ediyor. İkinci bir variable da bu mermimizin hızı için tanımlayalım. Bunun adı da shotPower olsun.


İlk başta power variable'ımız yani ateş sayımız 1 olacağı için projemizin başlangıcında çalışan start() metodunda power'ımızı 1e eşitliyoruz. 


Şimdide power'ımızın metodunu oluşturalım. Metodumuzun içinde kaç ateşleyicimizin ne zaman ve nasıl çalışacağını tanımlayalım ve ateşlemek için space (boşluk) tuşunu kullanalım. Mermimizin x düzleminde yukarı doğru hareket etmesini istiyoruz, bu yüzden velocity özelliğini aktif edip (önceden bu özelliği kaldırmıştık) yukarı doğru hareket etmesini sağlamalıyız. Power=1 olduğunda sadece ortadaki, 2 olduğunda yanlardaki ve 3 olduğunda ise hepsinin çalışmasını istiyoruz. Bunun için gerekli kodları aşağıdaki gibi yazalım. 



Son olarak Shooting metodumuzun oyun sırasında çağrılabilmesi için Update metodumuzun içinden çağıralım ve playerCharacter objemizin içindeki Shoot Power variable'ına değer verelim.



Eğer her şeyi doğru yapmışsak oyunumuzu çalıştırıp space (boşluk) tuşuna bastığımızda aşağıdaki gibi olması gerekiyor. Dilerseniz c# script kısmından denemek amaçlı power değerini 2 veya 3 yaparak oyunu çalıştırıp nelerin değiştiğine bakabilirsiniz.

Gifin büyük hali için tıklayınız.

Gelecek hafta oyunumuzu geliştirmeye devam edeceğiz, görüşmek üzere. 😊

Yorumlar

Popüler Yayınlar