Merhaba arkadaşlar bu yazıda belirlediğimiz bir noktadan belli zaman aralıkları ile kendi kendine obje çıkması işlemini anlatmaya
çalışacağız. Öncelikle bu işlemi yapabilmemiz için kullancağımız fonksiyon Instantiate fonksiyonu.
Bu fonksiyon 3 adet parametre alıyor ilk parametre bizim belirlediğimiz noktadan çıkacak olan nesneyi belirttiğimiz parametre.
İkinci parametre belirlediğimiz nesnenin hangi pozisyondan çıkacağı üçüncü nesne hedefin doğrultusunu belirtiyor.Tabi bu fonksiyonu kullanırken Instantiate fonksiyonu sürekli nesne üretecektir bunu belli zaman aralıklarına çekmek için Invoke fonksiyonunu kullanmalıyız.
Invoke fonksiyonuda 2 parametre alıyor ilk parametre çalışacak olan fonksiyonu string olarak alıyor ikinci fonksiyon ise yazdığımız fonksiyon hangi zaman aralıklarıyla çalışacak bunu belirtiyoruz.
Benim yaptığım örnekte bulutların otomatik olarak geçmesi olayı var.
Şimdi ilk öncelikle çıkacak olan bulutun hareket etmesini sağlayalım;
public class bulutGit : MonoBehaviour { //bulutGit sınıfı void Update () { transform.position =(new Vector3(transform.position.x-0.05f,transform.position.y,transform.position.z));//burada bulutlar çıktıkları anda sola //doğru gitmelerini sağlamak için pozisyon değerlerini değiştiriyoruz. } }
Burada bulut belirlediğimiz noktadan çıktığı anda hemen belirlediğimiz yöne doğru hareket edecek. Bu sınıfı yazdıktan sonra bulut gameobjcetmizin üzerine atıyoruz.,
Şimdi asıl sınıfa bakalım bulutların çıkacağı fonksiyona;
//bulut sınıfı using UnityEngine; using System.Collections; public class bulut : MonoBehaviour { bulutYokEt yok; public GameObject bulut1, bulut2, bulut3; void Start() { bulut1 = GameObject.Find ("bulutUst");//burada oluşturduğumuz bulut nesnelerini buluyoruz sahnedeki bulut2 = GameObject.Find ("bulutOrta"); bulut3 = GameObject.Find ("bulutAlt"); Invoke ("bulutUst",Random.Range(3f,3f));//Invoke fonksiyonu ile rastgele en başta bulutların çıkması tetikleniyor Invoke ("bulutOrta",Random.Range(3f,6f));//random bize yazdığımız değerler arası değer üretiyor Invoke ("bulutAlt",Random.Range(6f,9f)); yok = GameObject.Find ("bulutYokEt").GetComponent<bulutYokEt>();//burada çok fazla bulut oluşacak bir süre sonra oluşacak bulutları yok etmek için //yok edeceğimiz bulutları bulup yok edeceğiz } void bulutUst()// burada belli zaman aralıkları ile çalışacak olan fonksiyonumuz { Instantiate (bulut1,GameObject.Find("bulutCikisUst").transform.position,Quaternion.Euler(new Vector3(270,0,0)));//burada belirlediğimiz noktadan çıkacak olan } //nesneler void bulutOrta() { Instantiate(bulut2, GameObject.Find ("bulutCikisOrta").transform.position,Quaternion.Euler(new Vector3(270,0,0))); } void bulutAlt() { Instantiate (bulut3,GameObject.Find("bulutCikisAlt").transform.position,Quaternion.Euler(new Vector3(270,0,0))); } void LateUpdate ()//late update normal update göre daha yavaş çalışan update fonksiyonlarından { if (yok.b1 == 1) {//burada bulutlar yok oldukça diğer sınıftan aldığımız bilgiye göre yeni bulut oluşmasını isteyeceğiz. Invoke ("bulutUst", Random.Range (3f, 3f)); yok.b1 = 0;//yeni bulut oluşmaması için sıfır değeri atadık } if (yok.b2 == 1) { Invoke ("bulutOrta", Random.Range (3f, 6f)); yok.b2 = 0; } if (yok.b3 == 1) { Invoke ("bulutAlt", Random.Range (6f, 9f)); yok.b3 = 0; } } }
Burada bir önceki derste gördüğümüz sınıf haberleşmesini kullandık. Bir taraftan bulutlar çıkıyor ve diğer tarafta yok oluyorlar bu sayede aslında senkron bir sistem elde etmiş olduk.Bulut yok oluyor bulut yok olduğu zaman ilgili sınıfa gidilip yeni bulutun çıkması sağlanıyor. Bu scripti istediğimiz herhangi bir objenin üstüne atabiliriz ben empty bir gameobject oluşturup onun üstüne attım.
Şimdi de bulutların yok edileceği sınıfa bakalım;
using UnityEngine; using System.Collections; public class bulutYokEt : MonoBehaviour { public int b1=0,b2=0,b3=0; void OnTriggerEnter(Collider other)//burada bulutların değdikleri zaman yok olmaları sağlanıyor { if (other.tag == "bulut1") // bulutun tagine göre değen bulut yok oluyor. { Destroy (other.gameObject); b1 = 1;//eğer bulut değip yok olduysa diğer sınıfa bulutun yok olduğunu bildirerek diğer tarafta yeni bulut çıkmasını sağlıyor. } if (other.tag == "bulut2") { Destroy (other.gameObject); b2 = 1; } if (other.tag == "bulut3") { Destroy (other.gameObject); b3 = 1; } } }
Bu sınıf bulut sınıfı ile haberleşiyor bizim 3 adet bulut çıkış noktamız var dolayısı ile her seferinde 3 adet bulut oluşabilir ekranda bu durumdan faydalanarak her buluta ayrı değişken tanımlayıp bu değişkenler yardımıyla haberleşme sağlıyoruz misal b1 bulutu geldiği zaman bulut sınıfına 1 değeri gönderiliyor ve bulut sınıfında ki ilgili fonksiyon aktif hale getiriliyor böylelikle iki sınıf haberleşmiş oluyor. Bu yazdığımız sınıfı ise destroy yapacağımız nesnenin üzerine atıyoruz burada trigger işlemi olduğu için yani fiziksel bir işlem rigidbody ve collider koymayı unutmamalıyız her iki gameobjectede(bulutlara ve destroy yapacak gameobjecte).
Sonuç;
Burada ben görsellik olması açısından bulutlar ile bir şeyler yapmaya çalıştım ama bu fonksiyonlar bir çok projede bir çok farklı amaca hizmet edebilirler. Misal ateş etme örneğinde bulut yerinde mermi merminin çıkacağı kısmı da silahın namlusu olarak ayarlanırsa burada da iş görür. Ya da işte yukarıdan misal elmalar düşüyor bizde bu elmaları yakalamaya çalışıyoruz gibi basit başlangıç için bir uygulama olabilir. Ya da meşhur flappy bird oyununda sürekli gelen engeller yine bu yöntem ile yapılabilir, herkese iyi çalışmalar.