Unity’de Asansör Yapımı

Unity’de Asansör Yapımı

25 Ocak 2020 2 Yazar: Ahmet Güler

Merhaba bir önceki yazımda, Unity‘de top fiziği üzerinde durmuştuk.Bir kale hazırlamıştık ve faremiz ile futbol topunun çeşitli yerlerine tıklayarak, farklı yönlerde ivmelenmesini sağlamıştık.Bu dersimizde ise, bir asansör mekaniği yapacağız.Bunu yaparken daha önceki derslerde gördüğümüz pek çok yöntemi kullanacağız.Lafı uzatmadan dersimize başlayalım.

Senaryo için gerekli nesnelerin hazırlanması.

Öncelikle asansör yapacağımızı söylemiştim.Bir binamız olacak ve dışarıya yapmış olduğumuz asansöre binerek bir üst kata çıkacağız.Daha sonra binip tekrar aşağı kata ineceğiz.Mekanik olarak çok basit ve sade tutmaya çalıştım.Şimdi bir Plane nesnesi oluşturalım.Bu nesne bizim zeminimizi oluşturacak.Daha sonra bir boş nesne oluşturalım.Bunu Hierarchy penceresinde sağ tıklayarak, Create Empty seçimi ile yapıyoruz.

Asansörü oluşturduğumuz elemanları bu boş nesne altında toplayacağız.Daha sonra boş nesne seçili haldeyken sağ tıklayarak bir Cube nesnesi oluşturalım.Ben toplamda beş tane Cube nesnesi kullandım.Bunlardan dört tanesi, asansörün iskeletini oluştururken sonuncusu asansörün kabinini oluşturacak.Burada önemli nokta, asansörün zemini oluşturduğumuz nesneye Rigidbody bileşenini eklememiz gerekiyor.Yoksa durması gereken noktalarda durmayacaktır.

Ayriyeten kabin tetiklemeyi üstlenecek.Bu yüzden “isTrigger” özelliğini aktif etmemiz gerekiyor.Yoksa asansörün içerisine binemeyiz.Hazır tetikleyiciden bahsetmişken, bir boş nesne daha oluşturuyoruz.Bu boş nesnenin altında da, asansörümüzün durması gereken noktaları belirleyeceğiz.İki tane Cube nesnesi oluşturuyoruz.Bunlardan biri yukarıda diğeri aşağıda konumlanacak.Böylelikle asansörümüz bu iki nesne arasında gidip gelecek.Son nesnemiz ise, tetikleyiciyi harekete geçirmek için bir Cube olacak.Bu nesneyi biz yönlendireceğiz.Evet sahnemiz hazır.İsterseniz bu nesnelere material atayabilirsiniz.O kısım sizin tercihinize kalmış.Sahnemizin son hali aşağıdaki gibidir.

unity_asansor_yapimi

Görev dağılımının yapılması.

Evet şimdi dört tane C# Script dosyası oluşturuyoruz.Bunlardan birini hareket ettireceğimiz Cube nesnesine atıyoruruz.İkincisini, asansörümüzün kabinini oluşturan nesneye atıyoruz.Geriye kalan iki script dosyasını da, asansörün duracağı noktalara atıyoruz.Yani birini asağıdaki nesneye, diğerini yukarıdaki nesneye atıyoruz.Şimdi sıradan başlayalım.

Hareket için script dosyasının oluşturulması.

public float NesneHizi;
void Start () {
   NesneHizi = 5f;
}
void Update () {
   transform.Translate (Input.GetAxis("Vertical")*Vector3.forward*NesneHizi*Time.deltaTime);
   transform.Translate (Input.GetAxis("Horizontal")*Vector3.right*NesneHizi*Time.deltaTime);
}

İlk olarak nesne hareketi için oluşturduğumuz script dosyasını açıyoruz ve bu kodları yazıyoruz.İlk olarak bir değişken oluşturuyoruz.Daha sonra start() fonksiyonunda bu değişkene bir değer veriyoruz.Update() fonksiyonunun içerisinde ise, Translate fonksiyonundan yararlanarak nesnemizi yatay ve dikey eksende hareket ettiriyoruz.Bu fonksiyonun kullanımı daha önceki yazılarımda detaylı değindiğim için, şuan yüzeysel geçiyorum.

Asansör kabini için script dosyasının oluşturulması.

public GameObject AsansorNesnesi;
public int kat;
public bool asansorAktifMi;
public bool asansorAsagi;
public bool asansorYukari;

Evet şimdi, asansör kabinimize eklediğimiz script dosyasına gelelim.İlk olarak bize gereken değişkenlerimizi oluşturuyoruz.İlk satırda, GameObject oluşturuyoruz.Bu değişkeni asansörü hareket ettirmek için kullanacağız.İkinci satırda, asansörün bulunduğu katı öğrenmek için bir int (integer) türünde değişken oluşturuyoruz.Üçüncü, dördüncü ve beşinci satırlarda bool türünde değişkenler oluşturuyoruz.Bunları kullanarak asansörün kontrolünü sağlayacağız.

AsansorNesnesi = GameObject.Find ("ASANSOR");
kat = 0;
asansorAktifMi = false;

Evet şimdi start() fonksiyonun içerisine bu kodları yazıyoruz.İlk satırda değişkenimize, ismi “ASANSOR” olan nesneyi eşitliyoruz.İkinci satırda, “kat” değişkenimizi sıfıra eşitliyoruz.Son satırda ise, “asansorAktifMi” değişkenini false yapıyoruz.

public void OnTriggerEnter(Collider kontrol)
{
   if (kontrol.gameObject.name == "KUTU") {
      asansorAktifMi = true;
   }
}
public void OnTriggerExit(Collider kontrol)
{
   if (kontrol.gameObject.name == "KUTU") {
      asansorAktifMi = false;
   }
}

Daha sonra tetikleyici fonksiyonlarımızı yazıyoruz.OnTriggerEnter fonksiyonunda, eğer ismi “KUTU” olan nesne asansör kabinin içerisine girerse, “asansorAktifMi ” değişkenin değerini true olarak belirliyor.OnTriggerExit fonksiyonunda ise, ismi “KUTU” olan nesne asansör kabinin içerisinden çıkarsa “asansorAktifMi ” değişkenin değerini false olarak belirliyor.Böylelikle asansörün içerisinde değilken hareket etmesini engelliyoruz.

void AsansorKontrol() {
   if (asansorAktifMi && kat == 0 && Input.GetKeyDown(KeyCode.LeftShift)) {
      asansorYukari = true;
   }
   if (asansorAktifMi && kat == 1 && Input.GetKeyDown(KeyCode.LeftControl)) {
      asansorAsagi = true;
   } 
}

Daha sonra bir fonksiyon daha oluşturuyoruz.Bu fonksiyonda ise, asansörü hareket ettirmek için koşullarımızı oluşturuyoruz.İlk koşulda “asansorAktifMi ” değişkeni true, “kat ” değişkeni sıfıra eşit ve sol shift tuşuna basarsak, “asansorYukari ” değişkenimiz true olarak belirleniyor.İkinci koşulumuzda ise yine asansörümüz aktifse, katımız bu sefer bire eşitse ve sol ctrl tuşuna basarsak,  “asansorAsagi ” değişkenimiz true olarak belirleniyor.Böylelikle asansörümüzün gideceği yönünü ayarlıyoruz.

void AsansorYukari() {
   if (asansorAktifMi && asansorYukari) {
      AsansorNesnesi.transform.Translate (Vector3.up * Time.deltaTime, Space.World);
   } 
}
void AsansorAsagi() {
   if (asansorAktifMi && asansorAsagi) {
      AsansorNesnesi.transform.Translate (-Vector3.up * Time.deltaTime, Space.World);
   }
}

Daha sonra hareket animasyonunu sağlamak için iki fonksiyon daha oluşturuyoruz.İlk fonksiyonumuzda, “asansorAktifMi” ve “asansorYukari” değişkenlerimiz true değerine sahipseler, asansörümüzü Translate fonksiyonu ile yukarı çıkartıyoruz.İkinci fonksiyonumuzda ise “asansorAktifMi” ve “asansorAsagi” değişkenlerimiz true değerine sahipseler, asansörümüzü Translate fonksiyonu ile bu sefer aşağıya indiriyoruz.

void Update () {
   AsansorKontrol ();
   AsansorYukari ();
   AsansorAsagi ();
}

Ve bu script dosyamız için son olarak update() fonksiyonun içerisine bu kodları yazıyoruz.Böylelikle az önce oluşturmuş olduğumuz fonksiyonlar her karede çalışacak şekilde bekliyorlar.Bunları yazmazsak animasyonumuz çalışmayacaktır.

Asansörü durdurmak için script dosyalarının oluşturulması.

asansor AsansorScripti;
void Start () {
   AsansorScripti = GameObject.Find ("AsansorKabini").GetComponent<asansor> ();
}
public void OnTriggerEnter(Collider kontrol) {
   if (kontrol.gameObject.name == "AsansorZemini") {
      AsansorScripti.asansorAsagi = false;
      AsansorScripti.kat = 0;
   }
}

Evet şimdi aşağıda bulunan tetikleyici nesnemiz için oluşturduğumuz script dosyasına bu kodları yazıyoruz.İlk satırda, diğer script dosyasından veri almak için değişkenimizi oluşturuyoruz.Bu konuya diğer yazılarımda değişmiştim.Dilerseniz oradan detaylı olarak bakabilirsiniz.Daha sonra start() fonksiyonunun içerisinde, bu değişkene ismi “AsansorKabini” olan nesnenin, “asansor” bileşenini eşitliyoruz.OnTriggerEnter fonksiyonunda ise, ismi  “AsansorZemini” olan nesneyle çarpıştığımız zaman diğer script dosyasındaki “asansorAsagi” değişkenini false yapıyoruz.Ve yine aynı script dosyasındaki “kat” değişkenini sıfıra eşitliyoruz.

asansor AsansorScripti;
void Start () {
   AsansorScripti = GameObject.Find ("AsansorKabini").GetComponent<asansor> ();
}
public void OnTriggerEnter(Collider kontrol) {
   if (kontrol.gameObject.name == "AsansorTavani") {
      AsansorScripti.asansorYukari = false;
      AsansorScripti.kat = 1;
   }
}

Yine yukarıda bulunan nesnemize eklediğimiz script dosyası içinde aynı şeyler geçerlidir.Sadece OnTriggerEnter fonksiyonunda bu sefer, “asansorYukari” değerini false yapıyoruz ve “kat” değişkenini bire eşitliyoruz.Böylelikle asansörümüz aşağıda yada yukarıda iken, gerekli tuşa bastığımız zaman animasyonumuz istenmeyen şekilde hareket etmemiş oluyor.Evet tüm script dosyalarımızın son hali aşağıdaki gibidir.

Evet her şey yolunda ise, asansör mekaniğimiz sorunsuz bir şekilde çalışacaktır.Unutmadan tetikleyici görevi gören nesnelerimiz gizlemek isterseniz, nesneyi seçip Inspector penceresinde Mesh Renderer bileşeninin yanındaki tiki kaldırmanız yeterli olacaktır.Ayriyeten Find fonksiyonu yerine FindWithTag fonksiyonunu kullanmanız projeniz için daha iyi ve hızlı olur.Evet bu projemizin de sonuna geldik.Bir sonraki yazıda görüşmek üzere…

unity_asansor_yapimi