Unity Nesne Klonlamak (İnstantiate & Prefab)

Unity Nesne Klonlamak (İnstantiate & Prefab)

11 Ocak 2020 0 Yazar: Ahmet Güler

Merhaba, önceki dersimizde döngü çeşitlerine ve kullanım şekillerine bakmıştık.Bu dersimizde Unity‘de bir nesneyi kopyalamayı öğreneceğiz.Kopyalama (bir diğer değişle, klonlama) işlemi İnstantiate fonksiyonu ile yapılıyor.Bu sayede sahnemizde yer almayan nesneleri projemizde, istediğimiz koşul ve şekilde ortaya çıkartabiliyoruz.Tabi bu fonksiyonun çalışması için birde Prefab yani kısaca, sahnemizde tekrar ve tekrar kullanılması için hazırlanan şablonlara ihtiyacımız vardır.Bu sayede istediğimiz Prefab nesnesini sahnemizde kopyalayabiliyoruz.Bu özet bilgilerden sonra yeni bir proje oluşturalım ve senaryomuzu hazırlamaya başlayalım.

Sahnemizin hazırlık aşamaları.

Bu yazıda bir fabrikanın üretim bandını örnek alacağız.Bunun için bir Plane ve üç Cube nesnesine ihtiyacımız var.Hierarchy penceresinde sağ tıklayarak sırasıyla, Create > Plane ve Create > Cube seçimini yapalım.Üç Cube nesnesi olacak demiştik.Bunlardan biri bizim, Prefab nesnemizi oluştururken diğerleri üretim bandımızın başı ve sonu olacaklar.Haliyle Plane nesnemizde, üretim bandını oluşturacak.Bunların transform özelliklerini kendinize göre ayarlayabilirsiniz.Birazdan sahnenin bitmiş haline baktığınızda kafanızda daha iyi oturacaktır.

Yerleşimlere gelecek olursak, Plane nesnemizin her iki tarafına Cube nesnelerimizden birer tane yerleştiriyoruz.Daha sonra yerleştirmiş olduğumuz bu iki Cube nesnesini, Hierarchy penceresinden seçili hale (ctrl’ye basılı turarak yapabilirsiniz.) getirerek Plane nesnemizin üzerine sürükle/bırak yapıyoruz.Artık bu iki Cube nesnesi, Plane nesnesinin alt nesneleri haline geldi.Daha sonra Prefab şablonumuzu oluşturacak Cube nesnemizin üzerine tıklıyoruz ve Inspector penceresinde en alta gelerek, “Add Component” butonu basıyoruz.Çıkan arama bölümüne Rigidbody yazarak bileşeni nesnemize ekliyoruz.

Sahnedeki nesnelerin kaplamalarının eklenmesi.

Diğer derslerde nesnelerimize hep renk vermiştik.Bu dersimizde bir değişiklik yaparak, nesnelerimize kaplama ekleyelim.Bu hem daha güzel hemde daha gerçekçi görünmesini sağlayacaktır.Bunun için internette bulduğunuz çeşitli kaplamalar (texture olarak aratabilirsiniz) yeterli olacaktır.Bu kısmı sizin zevkinize bırakıyorum.Bize Plane ve iki Cube nesnemiz için kaplama gerekiyor.Benim Plane nesnem, üretim bandını temsil edeceği için ona göre bir kaplama tercihinde bulundum.Diğer iki Cube nesnem içinde yine uygun bir tercih yaptım. Şimdi bu iki kaplamamı masaüstünden (yada siz nereye indirdiyseniz) tutup sürükle/bırak yaparak, Project penceresine bırakıyorum.

Daha sonra ilk kaplamamızın üstüne tıklayalım.Inspector penceresinde Wrap Mode bölümünü, “repeat” olarak değiştirelim ve kaydedelim.Özellikle üretim bandımızda hareket efekti için bu ayar lazım olacak.Bu sayede sürekli tekrar eden bir kaplama göreceğiz.Diğer kaplama içinde aynı ayarı yapabiliriz.Daha sonra bu kaplamaları sürükle/bırak ile nesnelerimizin üzerine bırakıyoruz.

Şimdi Prefab nesnemizin üzerine tıklayalım ve Scene penceresinde hareket aracımızı (kısayolu W tuşu) seçerek, nesnemizin kopyalanacağı pozisyona götürelim.Ben üretim bandınız başında bulunan Cube nesnesinin içinde kopyalanmasını istiyorum.Pozisyonunu ayarladıktan sonra bu nesnemizi tutup, Project penceresine bırakıyorum.Artık Prefab şablonumuz hazır.

Kod planlaması.

Şimdi kodlama kısmını geçebiliriz.Bu proje için 3 adet C# script dosyasına ihtiyacımız var.Bunlardan biri üretim bandındaki şeridimizin hareketini sağlarken, diğer instantiate fonksiyonumuzu (yani klonlama kontrolünü) sonuncusu ise klon nesnemizin şerit üzerindeki hareketini kontrol edecek.Merak etmeyin kodları gayet kısa tuttum.Basit ve anlaşılır olacak.

public float kaydirmaHizi = 0.5f;
private Renderer Kaplama;

İlk scriptimizde üretim bandını kontrol edeceğiz.Yukarda değişkenlerimi tanımladım.Bunlardan biri float türünde üretim bandının hız kontrolünü ayarlarken diğer değişkenimi, üretim bandının yani Plane nesnesinin MeshRenderer bileşenine ulaşmak için yazıyoruz.

Kaplama = GetComponent<Renderer> ();

Daha sonra Start() fonksiyonu içerisinde scriptini eklendiği yani Plane nesnemizin MeshRenderer bileşeni az önce yazdığımız değişkene eşitliyoruz.Böylelikle bu değişken ile daha sonra bileşenin elemanlarına ulaşabileceğiz.

float kaydir = Time.time * kaydirmaHizi;
Kaplama.material.SetTextureOffset("_MainTex", new Vector2(0, kaydir));

Update() fonksiyonum içerisinde, bir float değişkeni daha tanımlıyorum ve daha önce tanımladığım hızı Time.time ile çarpıyorum.Artık üretim bandını hareketlendirme zamanı geldi.Bunun için, sahnemi oluştururken nesneme eklediğim kaplamanın Y eksenini değerleri ile oynayacağız.

Böylelikle kayan bir görüntü oluşacak.SetTextureOffset fonksiyonu bu işlemi yerine getiriyor.Vector2’nin ilk değeri x ikinci değeri ise y eksenini kontrol ediyor.Biz y ekseninde kaydırma yapacağımız için buraya değişkenimizi yazıyoruz.Daha sonra bu script dosyamızı Plane nesnesinin üzerine sürükleyip bırakıyoruz.

public GameObject kutuKlonu;
private GameObject klonKontrolu;

İkinci scriptimiz kutu kolanlarını oluşturacak ve kontrol edecek.Yine gerekli değişkenlerimizi oluşturuyoruz.İlki Prefab şablonu için ikincisi bu şablonlar üzerinde düzenleme yapmak için bulunuyor.

klonKontrolu = Instantiate (kutuKlonu,new Vector3(0.02f,0.47f,-7.5f),transform.rotation);
klonKontrolu.GetComponent <MeshRenderer> ().material.color = new Color (Random.Range (0f, 1f), Random.Range (0f, 1f), Random.Range (0f, 1f), 1f);

Start() fonksiyonunun içine yazıyoruz.Instantiate fonksiyonunu inceleyelim.Parantez içinde ilk parametre, klonlanacak nesnemizi barındırıyor.İkinci parametre, klonlanan nesnenin hangi koordinatlarda çıkacağını belirliyor.Üçüncü parametre ise, bu nesnenin rotasyonunu yani dönüşünü kontrol ediyor.Biz bunu nesnenin olağan değerinden alıyoruz.İkinci satırda ise, klonlanan nesnenin MeshRenderer bileşenine erişiyoruz ve buradan materyal rengine erişerek rastgele bir renk almasını sağlıyoruz.

void OnTriggerExit(Collider kontrol) {
  if (kontrol.gameObject.tag == "kutu") {
    klonKontrolu = Instantiate (kutuKlonu,new Vector3(0.02f,0.47f,-7.5f),transform.rotation);
    klonKontrolu.GetComponent <MeshRenderer> ().material.color = new Color (Random.Range (0f, 1f), Random.Range (0f, 1f), Random.Range (0f, 1f), 1f);
  }
}

Tetikleyici fonksiyonlarını öğrenmiştik.Burada Trigger kullanacağız.Böylelikle kopyalanacak nesneler, Cube nesnelerinin içinden çıkabilecek.Tabi bunun için, “isTrigger” özelliğini aktif hale getiriyoruz.OnTriggerExit fonksiyonu, collider içinden çıktıktan sonra tetikleniyordu.Klonlama aralığını kontrol etmek için, Cube nesnesine tıklayın ve BoxCollider bileşeninde bulunan “Edit Collider” seçeneği ile sınırları genişletin.Evet bu script ile işimiz bitti.Sürükle/bırak yaparak, Prefab şablonlarının çıkacağı nesnenin üzerine bırakın ve “Kutu Kolunu” bölümüne Prefab şablonunu ekleyin.

public float hiz = 1f;

Gelelim son scriptimiz olan klon nesnelerin, üretim bandı üzerindeki hareketini kontrol etmeye.Değişkenimizi yazıyoruz.Böylelikle hızını daha sonrada değiştirebileceğiz.

if (transform.position.z > 7.27f) {
  Destroy (this.gameObject);
} else {
  transform.Translate (Vector3.forward * hiz * Time.deltaTime);
}

Daha sonra Update() fonksiyonu içerisine, bir koşul yazıyoruz.Bu koşulu, klon nesnemiz z ekseninde belirli bir mesafeye geldiğinde yok etmek için yazıyoruz.Böylelikle projemizde kopya nesnelerden kaynaklı aşırı tüketimler olmayacak.Eğer z ekseni koordinatı yazdığımız koordinattan büyükse (yani o koordinatı geçtiyse) nesneyi sahneden sil diyoruz.Destroy fonksiyonu bu işe yarıyor.

Burada yazdığım değer, benim kendi sahnemde ayarladığım değerdir.Sizinki farklı olabilir.Eğer koşul sağlanmıyor ise de, nesnemizi hareket ettirmeye devam et diyoruz.Burada translate yöntemini kullandım.Daha önce bununla ilgili bir yazı yazmıştım.Son scriptimizde hazır.Bunu alıp Prefab şablonumuzun üzerine bırakıyoruz ve hız bölümüne istediğimiz bir sayıyı yazıyoruz.

Artık hazırız.

Tüm script dosyalarımız hazır artık projemizi başlatıp test edebiliriz.Gördüğünüz gibi sahnemiz istediğimiz gibi oldu ve gayet iyi görünüyor.Bu dersimizde bu kadardı.Bir sonraki yazıda görüşmek üzere…