
Unity’de Bomba Yapımı (AddExplosionForce Kullanımı)
Merhaba, bir önceki dersimizde Unity ile havalı süspansiyon yapımını öğrenmiştik.Böylece yapmış olduğumuz ilgili projelerde, araçlarımıza yeni mekanikler kazandırabiliyorduk.Bu dersimizde ise, Unity‘de AddExplosionForce fonksiyonunu ve nasıl kullanıldığını öğreneceğiz.Şimdi vakit kaybetmeden Unity‘de yeni bir proje oluşturalım ve dersimize başlayalım.
Sahnemizi oluşturmaya başlayalım.
Evet sahnemizi oluşturmaya başlamadan önce bu projede kullanacağımız senaryoya bir bakalım.Unity‘de AddExplosionForce fonksiyonu, projelerinizde patlama efektlerini simüle etmek için kullanılır.Bunu yaparken de nesneye yada nesnelere bir kuvvet uygular.Şimdi bu kısa bilgilendirmeden sonra senaryomuza gelelim.Sahnemizde bir adet bomba atar yani Bomb Turret bulanacak.
Bu Bomb Turret üzerinde yer alan bombalarımız ile yine sahnemizde yer alan hedef nesneleri vuracağız.Evet senaryomuz gayet basit bulunuyor.Bu noktada belirtmem gereken şey var.Yazının başlığından da anlaşılacağı üzere biz, bomba efektini simüle etmeye yoğunlaşacağız.Yani turret mekaniği, patlama efekti, ses kontrolü gibi ekstra konulara girmeyeceğim.Çünkü bu bizi asıl konumuzdan uzaklaştıracaktır.Artık başlayabiliriz.
Şimdi sahnemize bir Plane nesnesi ekliyoruz.Bu nesne bizim zeminimizi oluşturacaktır.Daha sonra bu Plane nesnemize Inspector penceresinden yeni bir etiket tanımlıyoruz.Burası önemli çünkü, bomba olarak kullanacağımız nesneyi tetiklemek için bu etiketlerden yararlanacağız.Daha sonra sahnemize yeni bir Sphere nesnesi ekliyoruz.Bu küre nesnesi, bizim bomba için kullanacağımız nesnemizi oluşturacaktır.
Evet yukarıdaki resim kafanızı karıştırmasın.Bu sadece ortaya çıkan sonucu daha iyi anlamanız için yaptığım bir sahnedir.Biz asıl konumuza odaklanalım.Şimdi Sphere nesnemizi seçiyoruz ve Inspector penceresine gelerek en aşağıda yer alan Add Component butonuna basıyoruz.Açılan arama kutusuna Rigidbody yazıyoruz ve nesnemize bu bileşeni ekliyoruz.Bu nesnemize Rigidbody bileşenini eklememizin nedeni, fizik kuvvetinden etkilenecek olmasından dolayıdır.
Şimdi bombamızı bir kenara bırakalım ve üzerlerinde patlamayı simüle edeceğimiz hedefleri oluşturmaya başlayalım.Evet sahnemize yeni bir Cube nesnesi ekliyoruz.Bu Cube nesnemizi seçiyoruz ve Inspector penceresine gelerek az önce yaptığımız gibi, Rigidbody bileşenini ekliyoruz.Böylece Cube nesnemiz artık kendisine uygulanacak fizik kuvvetinden etkilenebilecektir.Daha sonra bu Cube nesnemizi seçiyoruz ve bu nesneden birkaç tane daha kopyalıyoruz.Böylece patlama kuvvetini daha iyi anlayabileceğiz.
AddExplosionForce Fonksiyonunun parametleri.
Evet sahnemizde kullanacağımız nesnelerimiz hazır duruma geldi.Şimdi AddExplosionForce fonksiyonunda yer alan ve birazdan kullanacağımız parametrelerin ne işe yaradıklarına bir bakalım.
- explosionForce : İlk parametremiz, patlamanın gücünü ayarlamak için kullanılıyor.
- explosionPosition : İkinci parametremiz, patlamanın olacağı pozisyon bilgilerini içinde saklıyor.
- explosionRadius : Üçüncü parametremiz, patlamadan etkilenecek yarıçapı kontrol etmek için kullanılıyor.
- upwardsModifier : Dördüncü parametremiz, yarıçap içerisinde ki nesnelere vereceğimiz kuvveti ayarlamak için kullanılıyor.
- mode : Beşinci ve son parametremiz ise, nesnelere gücü nasıl aktarabileceğimizi ayarlamak için kullanılıyor.
Gördüğünüz gibi projelerimizde bu fonksiyonu kullanmak oldukça kolay.Ancak eğer patlamadan etkilenecek birden fazla nesne bulunuyorsa, bazı fonksiyonlardan yardım almak durumda kalıyoruz.Birazdan kodlama kısmına geçtiğimiz zaman daha iyi anlayacağınızı umuyorum.
Kodlarımızı yazmaya başlayalım.
Evet şimdi Project penceresinde yeni bir C# Script dosyası oluşturuyoruz.Daha sonra bu dosyaya yeni bir isim veriyoruz ve editörümüzün yardımı ile bu script dosyamızı açıyoruz.
public GameObject Bomba; public float BombaGucu; public float EtkiYaricapi; public float BombaHizi; public Rigidbody Fizik;
İlk olarak bize lazım olacak değişkenlerimizi tanımlamakla başlıyoruz.İlk satırda yeni bir GameObject değişkeni oluşturuyoruz.Bu değişkende bomba için kullanacağımız nesne tanımlı olacak.İkinci satırda float türünde bir değişken tanımlıyoruz.Bu değişkenle ise, bombamızın patlama gücünü kontrol edeceğiz.
Üçüncü satırda yine float türünde bir değişken oluşturuyoruz.Burada ise, bombamızın patladığı zaman ki hasar mesafesini kontrol edeceğiz.Dördüncü satırda yine float türünde bir değişken oluşturuyoruz.Bu değişkenle ise, patlamada nesneleri havaya kaldıracak kuvveti yada kaldırma hızını kontrol edeceğiz.Son satırda ise, bir Rigidbody değişkeni tanımlıyoruz.Bu değişken ile, nesnemizin rigidbody bileşenini kontrol edebileceğiz.
Bomba = this.gameObject; BombaGucu = 5; EtkiYaricapi = 10; BombaHizi = 1000; Fizik = GetComponent<Rigidbody>(); Fizik.isKinematic = true;
Şimdi bu kodları start() fonksiyonumuzun içerisine yazıyoruz.İlk satırda “Bomba” değişkenimize, script dosyamızın ekli olduğu nesnemizi tanımlıyoruz.İkinci satırda “BombaGucu” değişkenimize bir değer veriyoruz.Üçüncü satırda, “EtkiYaricapi” değişkenimize bir değer veriyoruz.Dördüncü satırda, “BombaHizi” değişkenimize bir değer veriyoruz.Vereceğinizin değerleri deneme/yanılma yöntemi ile bulabilirsiniz.
Beşinci satırda “Fizik” değişkenimize, script dosyamızın ekli olduğu nesnemizin Rigidbody bileşenini tanımlıyoruz.Böylece bu bileşeni kontrol edebileceğiz.Son satırda ise, “Fizik” değişkenimizde yer alan Rigidbody bileşeninin isKinematic özelliğini aktif yani true yapıyoruz.Bunu yapmamızın nedeni ise bomba olarak kullanacağımız nesnenin, projeyi ilk başlattığımızda fizik unsurlarından etkilenmemesi içindir.
if (Input.GetKeyDown(KeyCode.Space)) { Fizik.isKinematic = false; }
Şimdi update() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda yeni bir koşul oluşturuyoruz.Eğer klavyeden space tuşuna basılırsa, koşulumuz aktif oluyor.Bu tuşu istediğiniz gibi ayarlayabilirsiniz.İkinci satırda, rigidbody bileşenimizin isKinematic özelliğini pasif yani false olarak ayarlıyoruz.Böylece yukarıda yer alan bomba nesnemiz yerçekiminden etkilenerek aşağıya doğru düşüyor.
AddExplosionForce kullanımı.
Evet bu aşamaya kadar script dosyamızda değişkenleri ve gerekli bileşenleri tanımladık.Şimdi ise yazımızın asıl konusu olan AddExplosionForce fonksiyonunun nasıl kullanıldığına gelelim.
void Bomba() { Vector3 BombaPozisyonu = Bomba.transform.position; Collider[] Carpistiricilar = Physics.OverlapSphere(BombaPozisyonu, EtkiYaricapi); foreach (Collider hit in Carpistiricilar) { Fizik = hit.GetComponent<Rigidbody>(); if (Fizik != null) { Fizik.AddExplosionForce(BombaGucu, BombaPozisyonu, EtkiYaricapi, BombaHizi, ForceMode.Impulse); Destroy(this.gameObject); } } }
Şimdi yeni bir fonksiyon oluşturuyoruz.Bu fonksiyon ile bombamızın patlama efektini simüle edebileceğiz.İkinci satırda yeni bir Vector3 değişkeni oluşturuyoruz.Bu değişken ile, bomba nesnemizin pozisyonunu kontrol edebileceğiz.Üçüncü satırda yeni bir Collider dizisi oluşturuyoruz.Burada dikkatinizi çekmek istediğim nokta, bu değişkenin bir dizi olmasıdır.Bunun nedeni ise, bombamızın etki edeceği nesnelerin birden fazla olabilme olasılığıdır.
Bu dizi değişkenimize, OverlapSphere fonksiyonunu tanımlıyoruz.Bu fonksiyon dört parametre barındırabiliyor.Ancak bize bu projede iki tanesi yeteri gelecektir.Bunlardan biri, Vector3 diğeri de float değişkenleridir.Başka bir yazıda bu fonksiyona daha detaylı yer vereceğim için şimdilik yüzeysel olarak geçiyorum.Kısaca, görünmez bir küre içerisinde yer alan tüm nesneleri tespit edip kontrol edebiliyoruz.
Üçüncü satırda bir foreach döngüsü oluşturuyoruz.Bu döngüyü seçmemizin nedeni ise, dizi içerisindeki tüm elemanları döndürebildiğimiz içindir.Parantez içerisinde bu döngünün Collider bileşeni için olduğunu belirtiyoruz ve aramamızın “Carpistiricilar” dizisi içerisinde olacağını ekliyoruz.Dördüncü satırda, “Fizik” değişkenimize dizi içerisindeki nesnelerin sırasıyla Rigidbody bileşenlerini tanımlıyoruz.
Beşinci satırda ise yeni bir koşul oluşturuyoruz.Eğer “Fizik” değişkenimizde bir rigidbody bileşeni tanımlı ise koşulumuz aktif oluyor.Aksi halde o nesnede tanımlı olan bir Rigidbody bileşeni olmadığı için koşulumuzun içerisine girmeyecektir.Aksi halde Console penceresinde hata mesajı görünecektir.Altıncı satırda ise yazımızın asıl konusu olan AddExplosionForce fonksiyonu yer alıyor.
Parametrelerini biraz önce anlattığım için tekrar o konuya girmeyeceğim fakat asıl bomba efektini simüle edecek bölüm burası oluyor.Yedinci satırda ise, Destroy fonksiyonu yer alıyor.Parantez içerisine baktığımız zaman, this.gameObject kodunu görüyoruz.Bu da demek oluyor ki, kendini yok et.Daha önceki yazılarımda Destroy fonksiyonu ile ilgili detaylı bilgi yer alıyor.
Bombamızı tetikleyelim.
Evet son olarak bombamızın hangi koşullar altında tetiklenmesi gerektiğini belirlemek kaldı.Bunun için, OnCollisionEnter fonksiyonundan yararlanacağız.Tetikleyiciler hakkında önceden bir yazı yazmıştım.Daha detaylı bilgi isterseniz, o yazıma bakabilirsiniz.Şimdi konumuza dönelim.
void OnCollisionEnter (Collision Kontrol) { if (Kontrol.gameObject.tag == "Zemin" || Kontrol.gameObject.tag == "Hedef") { Bomba(); } }
Şimdi bu fonksiyonu script dosyamıza yazıyoruz.Diğer tetikleyici türleri içerisinden OnCollisionEnter fonksiyonunu seçmemin nedenine gelecek olursak, nesnenin teması halinde direk etkileşime geçmesi içindir.Yani bu proje için en doğru seçim olacaktır.İkinci satırda yeni bir koşul oluşturuyoruz.Eğer temas ettiğimiz nesnenin etiketi “Zemin” yada “Hedef” olursa, koşulumuz doğru oluyor.Aksi halde bir etkileşim olmayacaktır.Üçüncü satırda ise, Bomba() fonksiyonumuzu aktif hale getiriyoruz.
Evet artık projemizi tamamlamış bulunuyoruz.Yapmamız gereken birkaç işlem daha kaldı.İlk olarak, C# Script dosyamızı sürükleyerek, bomba için oluşturduğumuz nesnemizin üzerine bırakıyoruz.Daha sonra bu nesneyi, yani bombamızı Scene penceresindeki araçları kullanarak zeminden biraz yukarıya kaldırıyoruz.Burası önemli çünkü space tuşuna bastığımız zaman aşağıya doğru düşmesi gerekiyor.Son olarak da, patlamayı simüle edeceğimiz nesneleri bombamızın etki alanına konumlandırıyoruz.Artık denemek için hazırız.Evet bir sonraki yazıda görüşmek üzere…