Unity Destroy Fonksiyonunun Kullanımı
Merhaba, bir önceki yazımızda Unity‘de kameranın bir nesneyi nasıl takip edeceğini öğrenmiştik. Bu dersimizde ise, destroy fonksiyonunun ön planda olacağı bir proje yapacağız.Evet Unity‘de hemen yeni bir proje oluşturalım ve dersimize başlayalım.
Sahneye gerekli nesnelerin eklenmesi.
Öncelikle bu projemiz için kullanacağımız senaryoyu açıklayayım.Bir topumuz olacak ve bu topu yüksekten aşağı doğru bırakacağız.Daha sonra aşağıda bir trambolin olacak ve bu tramboline temas ettiği zaman ileriye doğru belli bir kuvvette ve yükseklikte zıplayacak.Karşısında ise birçok küpten oluşan bir duvar olacak.Her çarptığı küpü yok ederek belirli bir büyüklüğe ulaşacak.Ta ki, durana kadar.Evet bu senaryoda birçok fonksiyondan yararlanacağımızı anlamışsınızdır.Şimdi zemini oluşturmak için bir Plane nesnesi oluşturalım.
Daha sonra topumuzun ve küplerimizin aşağıya düşmesini engellemek için, sahnemize Cube nesnesini ekleyelim.Bu nesne ile Plane nesnemizin etrafına duvar yapacağız.Scene penceresinin üzerinde bulunan araçları kullanarak, duvarımızın bir köşesini oluşturuyoruz.Daha sonra bu nesnemizi seçip ctrl+d kısayolu ile iki kopya daha oluşturuyoruz ve duvarımızın diğer köşelerini de yapıyoruz.Şimdi trambolini yapma zamanı.Bunun için bir Cube nesnesi daha oluşturuyoruz.
Bu nesnemize x ekseninde yaklaşık 40 yada 50 derecelik bir açı veriyoruz.Bunu yapmamızın sebebi, topumuz çarptığı zaman küplere doğru yönlendirmek.Şimdi topumuz için bir Sphere nesnesi oluşturuyoruz.Bu nesnemize yeni bir etiket oluşturuyoruz.Daha sonra Rigidbody bileşenini ekliyoruz.Çünkü bu nesnede fizik öğelerinin olması gerekiyor.Son olarak, topumuzun temas ettiği zaman yok edeceği küplerimizi oluşturalım.Yalnız bu küpleri tek tek oluşturmayacağız.
Bunun yerine bir Cube nesnesi oluşturacağız ve bu nesneyi Prefab haline getireceğiz.Sahnemize yeni bir Cube nesnesini ekledikten sonra, bu nesneye yeni bir etiket oluşturuyoruz.Daha sonra bu nesneye de, Rigidbody bileşenini ekliyoruz ve “isKinematic” seçeneğini işaretliyoruz.Bu özelliği daha sonra kapatacağız.Şimdi Project penceresine bu nesnemizi sürüklüyoruz ve sahnedeki nesneyi siliyoruz.Artık sahnemiz hazır hale geldi.
Yeni bir duvar oluşturmak.
Bu projede üç tane script dosyası kullanacağız.İlk C# Script dosyasını oluşturalım ve ana kameramızın üzerine sürükleyip bırakalım.
public GameObject Kutu; public int x, y, z;
Bu script dosyamızda çarpınca yok edeceğimiz duvarı oluşturacağız.Bunu yapmak için iki tane değişken oluşturuyoruz.İlk satırda, Prefab nesnemizi tanımlayacağımız GameObject değişkeni bulunuyor.İkinci satırda ise, int (integer) türünde üç adet değişkenimizi oluşturuyoruz.Bu değişkenler ile x, y ve z eksenlerimizi kontrol edeceğiz.
for (int a = 0; a < x; a++) { for (int b = 0; b < y; b++) { for (int c = 0; c < z; c++) { GameObject yeniKutu = Instantiate(Kutu, new Vector3(a,b,c), Quaternion.identity) as GameObject; yeniKutu.tag = "hedefler"; yeniKutu.transform.GetComponent<MeshRenderer> ().material.color = new Color (Random.Range(0, 1f), Random.Range(0, 1f), Random.Range(0, 1f), 1f); yeniKutu.gameObject.GetComponent<Rigidbody> ().isKinematic = false; } } }
Şimdi start() fonksiyonunun içerisine bu kodları yazıyoruz.Burada iç içe kullandığımız for döngüleri ile duvarımızı oluşturuyoruz.Her bir döngü, bir ekseni kontrol ediyor.Bunu yaparken, Instantiate fonksiyonundan yararlanıyoruz.Beşinci satıra bakarsak, yeni oluşturduğumuz bu nesnelere az önce oluşturmuş olduğumuz etiketi veriyoruz.Altıncı satırda, rastgele bir renk veriyoruz.Bunu Random fonksiyonu ile yapıyoruz.Yedinci satırda ise, bu nesnelerin “isKinematic” özelliğini false konumuna getiriyoruz.Böylelikle topumuz temas ettiği zaman, fizik unsurlarından etkilenebilecekler.
Trambolin için kodlarımızı yazalım.
Evet şimdi ikinci script dosyamızı oluşturalım ve nesnemizin üzerine sürükleyip bırakalım.
public float Kuvvet; public float yukseklik;
Bu script dosyasında iki değişken kullanıyoruz.Bunların ikisi de, float türünde değişkenler olacak.Biri ile top nesnemize uygulayacağımız kuvveti ayarlarken, diğeri ile topa vereceğimiz yüksekliği ayarlayacağız.
Kuvvet = 9600f; yukseklik = 55f;
Şimdi, start() fonksiyonunun içerisine bu kodları yazıyoruz.Ben kendi sahneme göre belli bir değer verdim.Siz kendinize göre bu değerleri verebilirsiniz.
void OnCollisionEnter(Collision Ittir) { if (Ittir.gameObject.tag == "top") { Ittir.gameObject.GetComponent<Rigidbody> ().AddForce (Vector3.right * Kuvvet); Ittir.gameObject.GetComponent<Rigidbody> ().velocity = new Vector3 (0, yukseklik, 0); } }
Yeni bir fonksiyon oluşturuyoruz.Burada bir tetikleyici fonksiyonu kullanacağız.Çünkü çarpışmayı algılamamız gerekiyor.Bunun için, OnCollisionEnter fonksiyonunu kullanıyoruz.İkinci satırda bir koşul ile, etiketi “top” olan nesneyi algılayacağız.Üçüncü satırda, bu nesneye bir kuvvet uyguluyoruz.Bunu AddForce fonksiyonu ile yapıyoruz.Benim sahnemde Cube nesnem farklı bir eksende olduğu için, “Vector3.right” yani sağa doğru bir kuvvet uyguladım.Siz bunu kendinize göre ayarlayabilirsiniz.Dördüncü satırda ise, velocity fonksiyonu ile nesnemize y ekseninde bir yüksekli veriyoruz.Böylece tramboline çarptığı anda sanki zıplamış gibi olacak.
Topumuza gerekli mekanikleri verelim.
Şimdi son script dosyamızı oluşturuyoruz.Bu dosyayı topumuzu oluşturacak nesnenin üzerine sürükleyip bırakıyoruz.Şimdi editör ile açalım ve gerekli kodları yazalım.
public bool TopKontrolu;
Topumuzun büyümesini kontrol etmek için bool türünde bir değişken oluşturuyoruz.
TopKontrolu = false;
Daha sonra start() fonksiyonunun içerisinde, bu değişkenimizin değerini false yapıyoruz.
void OnCollisionEnter(Collision Temas) { if (Temas.gameObject.tag == "hedefler") { Destroy (Temas.gameObject); TopKontrolu = true; } }
Şimdi yeni bir fonksiyon oluşturuyoruz.Burada az önce olduğu gibi yine, OnCollisionEnter fonksiyonundan yararlanacağız.İkinci satırda topumuz, etiketi “hedefler” olan nesneye yada nesneler ile çarptığı zaman koşul doğru oluyor ve içerisindeki kodları çalıştırıyor.Üçüncü satırda, Destroy fonksiyonu ile temas kurulan nesneyi sahneden siliyoruz.Dördüncü satırda ise, bool değişkenimizin değerini true haline getiriyoruz.
if (TopKontrolu) { gameObject.transform.localScale += new Vector3 (0.3f,0.3f,0.3f); TopKontrolu = false; }
Update() fonksiyonumuzun içerisine bu kodları yazıyoruz.İlk satırda yeni bir koşul oluşturuyoruz.Az önce çarpışma olduğunda değerini değiştirdiğimiz, bool değişkeni eğer true ise koşulumuz doğru oluyor ve çalışıyor.İkinci satırda, nesnemizin boyutlarını localScale fonksiyonu ile arttırıyoruz.Arttırıyoruz diyorum çünkü, bool değişkenimiz her true değerini aldığı zaman, artı eşittir ile karşısındaki değerleri alıyor.Eksi olsaydı, tam tersi olarak boyutları küçülmüş olacaktı.Üçüncü satırda ise, bu bool değişkenini false değerine eşitliyoruz.
Evet şimdi, ana kameramızın (main.camera) üzerine eklemiş olduğumuz script dosyasına gelelim.Inspector penceresinde bulunan x, y ve z değişkenlerine bir değer veriyoruz.Bu değerleri ne boyutlarda bir duvar yapmak istediğinize göre belirleyebilirsiniz.Daha sonra projemizi başlatıyoruz ve sonuçlarını görüyoruz.Bu projemizde bu kadardı.Bir sonraki yazıda görüşmek üzere…