Unity’de Roket Adam Yapımı

Unity’de Roket Adam Yapımı

28 Ocak 2020 0 Yazar: Ahmet Güler

Merhaba, bir önceki dersimizde Unity ile rastgele nesne (item) veren bir sandık yapmıştık.Bu sandığa daha önceden hazırlamış olduğumuz Prefab dosyalarımızı ekleyerek, bunlar arasından rastgele bir seçim yaptırıyorduk.Bugünkü dersimizde ise, bir roket adam (Rocketman) yapacağız.Evet hemen dersimize başlayalım o zaman.İlk olarak yeni bir proje oluşturalım.

Sahnemizin kurulum aşamaları.

Bu projemizde kullanacağımız senaryoya bir bakalım.Unity‘de hali hazırda bulunan nesneleri kullanarak bir adam tasarlayacağız.Daha sonra bu adama bir sırt çantası yapacağız ve üzerine roketleri yerleştireceğiz.Tabi bunlarda Unity‘de ki hazır nesnelerden oluşacak.Sonra bu roketleri aktif hale getirerek, bu adamı havada süzülecek bir halde ayarlayacağız.Şimdi ilk olarak, iki adet Plane nesnesi oluşturuyoruz.Bunlardan biri zemini oluştururken, diğeri sahnemizin arkaplanını oluşturacak.Bunun için ikinci Plane nesnesini x ekseninde 90 derece döndürüyoruz.Daha sonra bir boş nesne (Create Empty) oluşturuyoruz.

Bu nesne, bizim roket adamımızın tüm parçalarını içerisinde barındıracak.Daha sonra bu nesneye sağ tıklayarak 3D Object > Cube seçimini yapıyoruz.Bu Cube nesnelerinden çeşitli parçalar oluşturacağız.Bunu yapmak için Scene penceresindeki araçlardan yararlanıyoruz.Küpten adamımızı yaptıktan sonra, sırtında bulunacak roketini de yapıyoruz.Yine aynı aşamaları kullanıyoruz.Daha sonra, az önce oluşturduğumuz boş nesneye bir Rigidbody bileşeni ekliyoruz.Burası önemli bir yer.Çünkü Hava roketlerimizi kapatırsak, adamımızın yere inmesi gerekiyor.Bunun içinde fizik unsurları lazım.

Evet sahnemizde bulunan nesnelerimize isterseniz kaplama verebilirsiniz.Ben bu kısmı sizin tercihinize bırakıyorum.Sahnemiz şu anda hazır duruma geldi.Ben ayriyeten, roket motorlarından çıkacak bir dumanda yaptım.Bunu Particle System (parçaçık sistemi) ile tasarladım.Bu sistemin kullanımı daha önceki yazılarımda değinmiştim.İsteyen araştırabilir.Bu projeye bu efekti dahil etmeyeceğim.Sadece görsellik kazanması için yaptım.Evet sahnemizin son hali bu şekildedir.

unity-roket-adam-yapımı-rocketman-make

Kodlarımızın yazalım.

Öncelikle yeni bir C# Script dosyası oluşturuyoruz.Daha sonra bu dosyamıza bir isim veriyoruz ve sürükleyerek roket adamımızın parent yani ebeveyn nesnesinin üzerine bırakıyoruz.Şimdi editörümüz ile açarak kodlarımızı yapamaya başlayalım.

public bool RoketleriCalistir;
public bool RoketlerAktifMi;
public float Guc;
public GameObject GovdeKontrolu;
public Vector3 YeniKonum;
private Rigidbody fizik;

Evet ilk olarak projemizde bize lazım olacak değişkenlerimizi oluşturmakla başlıyoruz.Birinci ve ikinci satırlara, roketimizin çalışmasını kontrol eden ve ateşleme zamanını ayarlayan bool türündeki değişkenlerimizi yazıyoruz.Üçüncü satırda, roketimizin gücünü ayarlamak için float türünde bir değişken tanımlıyoruz.Dördüncü satırda, saga-sola hareket edeceğimiz zaman adamımızın da aynı yönde dönmesi için bir GameObject değişkeni oluşturuyoruz.

Beşinci satırda roket adamın hareket ettikçe pozisyonu değişeceği için, bu değerleri kaydedip düzenleyeceğimiz bir Vector3 değişkeni oluşturuyoruz.Son satırda ise, roket adamımızın Rigidbody bileşenine erişmek için bir değişken oluşturuyoruz.

RoketleriCalistir = false;
Guc = 0.4f;
GovdeKontrolu = gameObject.transform.GetChild (0).gameObject;
fizik = gameObject.GetComponent<Rigidbody> ();

Şimdi start() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda projemizi başlattığımız zaman roketlerimizin çalışmasını engellemek için, değişkenimizi false yapıyoruz.İkinci satırda, “Guc” değişkenimizin alacağı değeri ayarlıyoruz.Dördüncü satırda roket adamımızın gövdesinin rotasyon değerlerini değiştirmek için, kontrol edeceğimiz bu nesneyi GetChild fonksiyonu ile çocuk nesneler arasından buluyoruz ve değişkenimize eşitliyoruz.Gövdemizi oluşturan nesne ilk sırada olduğu için sıfır “0” yazıyoruz.Sizde farklı bir sırada ise o sıra numarasını yazmanız gerekiyor.Son olarak da, Rigidbody bileşenini değişkenimize tanımlıyoruz.

void RoketAdaminKontrolu() {
   if (Input.GetKey(KeyCode.W)) {
      YeniKonum = transform.position;
      YeniKonum.y += Time.deltaTime;
      transform.position = YeniKonum;
      GovdeKontrolu.transform.rotation = Quaternion.Euler(0, 0, 0);
   }
   if (Input.GetKey(KeyCode.S)) {
      YeniKonum = transform.position;
      YeniKonum.y -= Time.deltaTime;
      transform.position = YeniKonum;
      GovdeKontrolu.transform.rotation = Quaternion.Euler(0, 0, 0);
   }
   if (Input.GetKey (KeyCode.A)) {
      YeniKonum = transform.position;
      YeniKonum.x -= Time.deltaTime;
      transform.position = YeniKonum; 
      GovdeKontrolu.transform.rotation = Quaternion.Euler(0, 90, 0);
   }
   if (Input.GetKey(KeyCode.D)) {
      YeniKonum = transform.position;
      YeniKonum.x += Time.deltaTime;
      transform.position = YeniKonum;
      GovdeKontrolu.transform.rotation = Quaternion.Euler(0, -90, 0);
   }
}

Şimdi yeni bir fonksiyon oluşturuyoruz.Bu fonksiyonumuzun içerisinde roket adamımızı kontrol edeceğimiz mekanikleri belirleyeceğiz.İlk olarak, dört tane koşul oluşturuyorum.Bunlara sırasıyla istediğim tuşlara atamasını yapıyorum.Ayrı ayrı koşulların ne yaptığını anlatmak uzun süreceği için ilk baştaki koşulumuzu anlatacağım.Zaten hepsi aşağı yukarı aynı görevleri yapıyor.

İlk koşulumuza bakalım.Eğer “W” tuşuna basılı tutarsak aşağıdaki kodları çalıştır diyoruz.Üçüncü satırda değişkenimize, roket adamın o andaki konumu eşitleniyor.Dördüncü satırda y eksenindeki konumunu, Time.deltaTime fonksiyonu ile arttırıyoruz.Beşinci satırda, değişen bu pozisyonu bu sefer roket adamın pozisyonuna eşitliyoruz.Böylelikle o pozisyona doğru ilerliyor.

Altıncı satırda ise, yukarı doğru çıktığımız için roket adamımızın rotasyonunda herhangi bir değişiklik olmuyor.Ancak “D” tuşunun koşuluna bakacak olursak, y ekseninde “-90” derece döneceğini göreceksiniz.W tuşu ile yukarıya çıkmıştık.Aşağı inmek içinde S tuşunu kullanıyoruz.Bu sefer, y eksenindeki konumumuz eksi “-” olarak Time.deltaTime fonksiyonu ile azalıyor.Diğer koşullarda da, bu mantık var.

void RoketlerinAteslenmesi() {
   if (Input.GetKeyDown (KeyCode.Space)) {
      RoketleriCalistir = !RoketleriCalistir;
      fizik.isKinematic = RoketleriCalistir;
   }
}

Şimdi bir tane daha fonksiyon oluşturuyoruz.Bu fonksiyonda ise, roketlerimizin ateşlenmesini kontrol edeceğiz.İkinci satırda yeni bir koşul oluşturuyoruz.Eğer klavyeden “space” tuşuna basarsak, içinde bulunan kodları çalıştır diyoruz.Üçüncü satırda, aslında alışık olunmayan ancak çok pratik bir kullanımı olan bool türündeki değişkenlerin true/false değerini değiştirmeyi görüyoruz.

Mantık ise şu şekildedir.”RoketleriCalistir” değişkenimiz eğer true değerine sahip ise, değerini false yap.Tam tersi ise, değerini true yap.Böylelikle her “space” tuşuna bastığımız zaman, değişkenimizin değeri kontrol edilip ona göre değişiyor.Dördüncü satırda, fizik unsurlarını aktif veya pasif hale getiriyoruz.Bunu isKinematic fonksiyonunu açıp kapatarak yapıyoruz.Böylelikle roket adamımızın motorlarını kapattığımız zaman, yere inişini gerçekleştirebiliyoruz.

IEnumerator RoketlerinAteslemeZamani() {
   if (RoketleriCalistir) {
      if (RoketlerAktifMi) {
         transform.Translate (-Vector3.up * Guc * Time.deltaTime);
         yield return new WaitForSeconds (1);
         RoketlerAktifMi = true;
      } else {
         transform.Translate (Vector3.up * Guc * Time.deltaTime);
         yield return new WaitForSeconds (1);
         RoketlerAktifMi = false;
      }
   }
}

Üçüncü bir fonksiyon daha oluşturuyoruz.Bu fonksiyonun diğerlerinden farkı ise, IEnumerator metodunu kullanması.Böylelikle roketlerimizi belirli bir zaman aralığında açıp kapatarak, havada süzülme animasyonu yapabileceğiz.İkinci satırda, bir koşul oluşturuyoruz.Bu koşul roketlerin çalışıp çalışmadığını kontrol edecek.Çalışıyor ise havalanacağız.Aksi takdirde fizik unsurları görevini yapacak.Üçüncü satırda, bir koşul daha oluşturuyoruz.Burada ise, çalışan roketlerin ateşlenme zamanlarını kontrol ediyoruz.

Eğer “RoketlerAktifMi” bool değişkenimizin değeri true ise, Translate fonksiyonu ile roket adamımızı aşağı yönde hareket ettiriyoruz.Tam tersi ise, bu sefer yukarı yönde hareket ettiriyoruz.Bunların yaparken WaitForSeconds fonksiyonundan yararlanarak bir süre belirliyoruz.Ve bu süre son erince de, “RoketlerAktifMi” bool değişkeninin değerini true yada false olarak ayarlıyoruz.Aslında bu işlemi bir döngü haline getirmiş oluyoruz ve sürekli aşağı yukarı yaparak havada süzülen bir roket adamımız oluyor.

void Update () {
   RoketAdaminKontrolu();
   RoketlerinAteslenmesi();
   StartCoroutine(RoketlerinAteslemeZamani());
}

Tabi bu kadar fonksiyonu oluşturduktan sonra kullanabilmemiz için bir yerlere yazmamız gerekiyor.Bunun içinde update() fonksiyonunu kullanıyoruz.Böylelikle fonksiyonlarımız her karede çalışmış oluyor.İsterseniz her mekanik için yeni bir fonksiyon oluşturmak yerine, kodlarını update() fonksiyonunun içerisinde de kullanabilirsiniz.Tercih sizin.Ayriyeten IEnumerator metodunu kullanan fonksiyonumuzun çalışabilmesi için, StartCoroutine fonksiyonunu kullanmamız ve içerisine yazmamız gerekiyor.Yoksa çalışmayacaktır.C# script dosyamızın son hali bu şekildedir.

Evet bugünkü projemizin de sonuna geldik.Farklı mekanikler ekleyerek, roket adamımıza daha fazla dinamik katmak mümkündür.Bu sizin hayal gücünüze kalmış.Ben olabildiğince basit tutmaya özen gösterdim.Bir sonraki yazıda görüşmek üzere…

unity-roket-adam-yapımı-rocketman-make