Unity’de Gizemli Kutu Yapımı

Unity’de Gizemli Kutu Yapımı

27 Ocak 2020 0 Yazar: Ahmet Güler

Merhaba, bir önceki yazımızda Unity ile paintball silahı yapmıştık.Daha sonra bu silah ile belirlediğimiz hedef tahtasına ateş ederek mermi izlerinin oluşmasını sağlamıştık.Bu dersimizde ise, gizemli bir kutu yapacağız.Aslında böyle söyleyince garip oldu.Şöyle düzeltebilirim, oyunlarda karşımıza çıkan ve rastgele item veren kutulardan yapacağız.Evet yeni bir proje oluşturalım ve dersimize başlayalım.

Sahne kurgusu.

Projemiz için kullanacağımız senaryoyu az çok anlamışsınızdır ama tekrar edeyim.Havada bir kutumuz olacak ve biz gelip bu kutuya vurduğumuz zaman içerisinden daha önceden bizim belirlediğimiz, rastgele bir nesne (item) çıkacak.Her vurduğumuzda ise, bu nesne değişecek.Evet sahnemizde kullanacağımız nesneleri eklemeye başlayalım.İlk olarak zeminimizi oluşturmakla başlıyoruz.Bunun için sahnemize bir Plane nesnesi ekliyoruz.Daha sonra bir Cube nesnesi ekliyoruz.Bu nesne bizi rastgele nesne (item) veren sandığımız olacak.Bu nesneyi Scene penceresinde biraz büyütüyoruz ve pozisyonunu yukarıda olacak şekilde ayarlıyoruz.

Sonuçta zıplayıp vurabileceğimiz bir mesafede olması gerekiyor.Daha sonra bu Cube nesnesine bir Rigidbody bileşeni ekliyoruz.Bu nesneye fizik öğelerini neden eklediğimizi daha sonra anlatacağım.Sonra Rigidbody bileşeninin “Is Kinematic” özelliğini true yapıyoruz.Yani bu nesnenin fizik öğelerinden etkilenmemesini sağlıyoruz.Şimdi bir Cube nesnesi daha oluşturalım.Bu nesneyi biz kontrol edeceğiz.Basit bir hareket ve zıplama mekanizması olacak.Zıplamasını sağlamak içinde, Rigidbody bileşenini bu nesneye eklememiz gerekiyor.Sonra yeni bir etiket oluşturuyoruz ve bu etiketi hareket ettireceğimiz Cube nesnemize ekliyoruz.

Son olarak kutumuzdan çıkacak rastgele nesneleri oluşturmak için sahnemize bir Cube nesnesi daha ekliyoruz.Bu nesnenin pozisyonunu, kutumuzu oluşturan nesnenin içinden çıkacak şekilde ayarlıyoruz.Daha sonra rastgele bir kaplama ekliyoruz ve sürükleyip Project penceresine bırakıyoruz.İlk Prefab dosyamızı oluşturduk.İkinci kaplamayı da yine aynı şekilde Cube nesnemizin üzerine bırakıyoruz ve bunu da sürükleyip Project penceresine bırakıyoruz.Böyle yaparak istediğimiz kadar Prefab nesnesi oluşturabiliriz.Son olarak sahneden bu nesneyi siliyoruz.Çünkü klonunu oluşturacağımız için sahnede gözükmemesi gerekiyor.Sahnemizin son hali bu şekildedir.

unity-gizemli-kutu-yapımı-mystery-box-random-item

Küp nesnemizin kontrol edilmesi.

Bize iki tane C# Script dosyası lazım.Bunlardan biri hareket ettireceğimizi nesne için gerekli olacak.Diğeride rastgele nesne (item) oluşturacak, sandığımız için gerekli olacak.İlk script dosyamızı oluşturalım ve editör ile açarak kod yazmaya başlayalım.

public float Hiz;
public float Ziplama;
public Rigidbody fizik;

Değişkenlerimizi oluşturmakla başlıyoruz.İlk satırda, nesnemizin hızını kontrol etmek için bir değişken oluşturuyoruz.İkinci satırda, bu nesnenin zıplama kuvvetini ayarlamak için bir değişken oluşturuyoruz.Son satırda ise, bu nesnenin Rigidbody bileşenini kontrol edebilmek için bir değişken oluşturuyoruz.

Hiz = 5f;
Ziplama = 7f;
fizik = gameObject.GetComponent<Rigidbody> ();

Şimdi start() fonksiyonumuzun içerisine bu kodları yazalım.İlk satırda Cube nesnemizin hızını belirliyoruz.İkinci satırda, Cube nesnemizin zıplama kuvvetini belirliyoruz.Tabi bu değerler sizin projenizde değişiklik gösterecektir.Son satırda ise, değişkenimize Rigidbody bileşenini tanımlıyoruz.

transform.Translate (Input.GetAxis("Vertical")*-Vector3.forward*Hiz*Time.deltaTime);
transform.Translate (Input.GetAxis("Horizontal")*-Vector3.right*Hiz*Time.deltaTime);
if(Input.GetKeyDown(KeyCode.Space)){
   fizik.AddForce(Vector3.up * Ziplama, ForceMode.Impulse);
}

Daha sonra update() fonksiyonunun içerisine bu kodları yazıyoruz.İlk ve ikinci satırdaki Translate fonksiyonları ile Cube nesnemizi yatay ve dikey eksenlerde hareket ettiriyoruz.Bu fonksiyonun kullanımı için ayrı bir yazı yazdığımdan, detaylara girmiyorum.Üçüncü satıra geldiğimizde, bir koşul oluşturuyoruz.Eğer klavyeden “space” tuşuna basarsak, koşulumuz doğru oluyor ve içerisindeki bulunan kodları çalıştırıyor.

Dördüncü satırda, hareket ettirdiğimiz nesneyi zıplatmak için bir kuvvet oluşturuyoruz.Bunu AddForce fonksiyonu ile yapıyoruz.Vector3.up ile zıplama kuvvetimizi çarpıyoruz.Bu bize istediğimiz bir kuvvette yukarı yönde hareket etmemizi sağlıyor.Nesnenin kütlesine kuvveti direk aktarmak içinde, ForceMode.Impulse fonksiyonunu kullanıyoruz.Script dosyasının son hali bu şekildedir.

Sandığımızdan çıkacak nesnelerin belirlenmesi.

Evet şimdi diğer script dosyamıza gelelim.

public Vector3 KutununOncekiPozisyonu;
public List<GameObject> KutudanCikacaklar = new List<GameObject>();
public GameObject KutudanCikan;
private Rigidbody fizik;

İlk olarak bize gereken değişkenlerimizi oluşturmakla başlıyoruz.İlk satırda havada duran nesnemizin pozisyon değerlerini kaydetmek için bir değişken oluşturuyoruz.İkinci satırda yeni bir GameObject listesi oluşturuyoruz.Bu listede, tüm Prefab dosyalarımızı tutacağız.Üçüncü satırda, rastgele klonlanan nesnelerimizi kontrol etmek için bir GameObject oluşturuyoruz.Son satırda ise, bu nesnemizin Rigidbody bileşenini kontrol edebilmek için bir değişken tanımlıyoruz.

fizik = gameObject.GetComponent<Rigidbody> ();

Start() fonksiyonumuzun içerisine bu kodu yazıyoruz.Böylelikle projemizi başlattığımız zaman otomatik olarak değişkenimize, Rigidbody bileşenini eşitleyeceğiz.

void OnCollisionEnter (Collision Kontrol) {
   if (Kontrol.gameObject.tag == "oyuncu") {
      fizik.isKinematic = false;
      fizik.AddForce (Vector3.up * 5f, ForceMode.Impulse);
      Destroy (KutudanCikan);
   }
}

Evet şimdi, yeni bir OnCollisionEnter fonksiyonu oluşturuyoruz.Bu fonksiyonumuz ile çarpışmaları tespit edeceğiz.İkinci satırda yeni bir koşul oluşturuyoruz.Nesnemizin etiketi “oyuncu” ise, aşağıdaki kodları çalıştır diyoruz.Üçüncü satırda havada duran nesnemizin, “isKinematic” özelliğini false yapıyoruz.Yani fizik unsurlarını pasif hale getiriyoruz.Dördüncü satırda AddForce fonksiyonu ile bu nesnemize yukarı doğru bir kuvvet uyguluyoruz.

Hatırlayacak olursak yazımın başında, bu nesneye neden Rigidbody bileşenini eklediğimizi söyleyecektim.Biz havada duran bu nesneye zıplayıp vurduğumuzda, aynı şekilde bu nesnede olduğu yerden zıplaması için bu bileşeni ekledik.Yani bir nevi animasyon eklemiş olduk.Beşinci satırda ise, “KutudanCikan” değişkenimizde ekli olan nesneyi sahnemizden siliyoruz.

KutununOncekiPozisyonu = transform.position;
if (KutununOncekiPozisyonu.y < 4.3f) {
   fizik.isKinematic = true;
   KutununOncekiPozisyonu.y = 4.3f;
   transform.position = KutununOncekiPozisyonu;
   KutudanCikan = Instantiate (KutudanCikacaklar[Random.Range(0, KutudanCikacaklar.Count)], new Vector3(-0.04f, 4.9f, -0.09f) ,transform.rotation) as GameObject;
}

Daha sonra Update() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda, havada duran nesnemizin pozisyonlarını değişkenimize kaydediyoruz.İkinci satırda yeni bir koşul oluşturuyoruz.Eğer az önce kaydetmiş olduğumuz nesnenin y ekseninin pozisyonu, yazmış olduğumuz değerden küçükse koşulumuz doğru oluyor ve içerisinde bulunan kodlar aktif oluyor.Tabi bu değer benim oluşturduğum sahneye göre belirlendi.Siz kendinize göre ayarlamalısınız.Üçüncü satırda, “isKinematic” özelliğini true yapıyoruz.

Artık nesnemiz, fizik unsurlarından etkilenebilecek.Dördüncü satırda değişkenimizin y pozisyonunu, karşınında bulunan değere eşitliyoruz.Beşinci satırda ise, havada bulunan nesnemizin pozisyonunu,oluşturduğumuz değişkenimizin pozisyonuna eşitliyoruz.Buradaki olayı anlatayım.Biz kutuya vurduktan sonra, kutu bir fizik kuvvetine maruz kalarak havalanıyor.Düşmeye başladığında ise, yine havalandığı pozisyonda durması için yeni pozisyonunu eski pozisyonuna eşitlememiz gerekiyor.

Altıncı satırda, Instantiate fonksiyonunu kullanarak Prefab dosyalarımızı sahnemize ekliyoruz.Tabi bu klonların rastgele oluşması içinde Random fonksiyonunu kullanıyoruz.Parantez içine bakacak olursak “0, KutudanCikacaklar.Count” sıfır ile GameObject listemizin toplam eleman sayısı arasında, rastgele bir seçim yapıyoruz.Daha sonra yeni pozisyon değerlerini yazıyoruz.Bu değerler klonların, havada duran nesnenin ortasından çıkacak şekilde ayarlandı.

if(KutudanCikan != null) {
   if (KutudanCikan.transform.position.y < 6.2f) {
      KutudanCikan.transform.Translate(Vector3.up * Time.deltaTime, Space.World);
   }
   KutudanCikan.transform.Rotate(0, 90f * Time.deltaTime, 0, Space.World);
}

Evet yukarıdaki kodların devamına bu kodları yazıyoruz.Burada da, bir koşul belirliyoruz.Eğer “KutudanCikan” değişkenimiz boş (null) değilse, aşağıdaki kodları çalıştır diyoruz.OnCollisionEnter fonksiyonumuzda bu nesneyi sahnemizden siliyorduk.İşte bu silmeden sonra projemizin hata vermemesi için bu denetimi yapmamız gerekiyor.İkinci satırda bir koşul daha oluşturuyoruz.

Burada da, değişkenimizin y pozisyonu verdiğimiz değerden küçükse, içerisindeki kodları aktif ediyor.Üçüncü satırda, Translate fonksiyonu ile nesnemizi havalandırıyoruz.Tabi kare hızlarını eşitlemek için, Time.deltaTime fonksiyonunu kullanıyoruz.Böylelikle nesnemizin y eksenindeki pozisyon değeri, sınıra geldiği zaman yukarı doğru çıkmayı kesecektir.Beşinci satırda ise, Rotate fonksiyonu ile oluşan klon nesnemizi y ekseninde sürekli olarak döndürüyoruz.

Evet script dosyalarımızı gerekli nesnelerimizin üzerine sürükleyip bıraktıktan sonra, oluşturmuş olduğumuz Prefab dosyalarını havada bulunan kutu nesnemizin liste bölümüne ekliyoruz.Artık projemiz hazır duruma geldi.Bu projemizin de sonuna geldik.Bir sonraki yazıda görüşmek üzere…

 

unity-gizemli-kutu-yapımı-mystery-box-random-item