Unity Tetikleyici Kullanımı (Collision & Trigger)
Merhaba, bir önceki yazımızda Unity ile nasıl animasyon yapıldığına bakmıştık.Bu dersimizde Unity projelerimizde sıkça başvuracağımız tetikleyici fonksiyonlarına bakacağız.Bu fonksiyonlar gerek işlevleri gerekse kullanım kolaylıkları olarak, projenizde çözüm üretmekte gayet faydalılar.Şimdi nasıl kullanıldıklarına bakmak için Unity‘i açalım ve yeni bir proje oluşturalım.Öncelikle senaryomuzu oluşturalım.
Gereken Malzemeler:
Bu senaryomuzda, bir geçit olacak ve bu geçit ile etkileşime girdiğimiz zaman neler olduğuna bakacağız.Bunun için iki tane Cube nesnesine (bu senaryoda ben bunları tercih ettim.) ihtiyacımız var.Hierarchy penceresinde sağ tıklayarak sırasıyla, Create > Cube seçimi yapıyoruz.İlk nesnemiz geçit görevi görecektir.Bunun için Scene penceresinde istediğim şekle getiriyorum.Daha sonra ikinci Cube nesnemi oluşturuyorum ve onun hali hazırdaki formu ile oynamadan bırakıyorum.
Daha sonra çarpışma noktalarını daha iyi ayırt edebilmek için, bunlara bir renk vermemiz gerekiyor.Bunun için, Project penceresinde sağ tıklayarak sırasıyla, Create > Material seçimi yapıyoruz.Daha sonra bir renk seçimi yapıyoruz ve klavyeden ctrl+d kombinasyonu ile bir adet kopya oluşturuyoruz.Bu nesnemize de farklı bir renk verdikten sonra, sürükle/bırak yöntemi ile sahnemizde oluşturduğumuz nesnelerin üzerine bırakıyoruz.Şimdi sahnemiz hazır kodlamaya geçebiliriz.
İki farklı fonksiyon ve görevleri:
Yeni bir C# script dosyasını, Project penceresinde Create > C# Script diyerek oluşturalım.Daha sonra bu dosyamızın isimini verdikten sonra, sürükleyerek daha önce geçit olarak oluşturduğumuz nesnemizin üstüne bırakalım.Artık kod yazma zamanı.Editörümüzü açtıktan sonra, Start() ve Update() fonksiyonlarını silelim.Çünkü bu fonksiyonlar ile bir işimiz yok.Daha sonra, aşağıdaki kodu yazarak projemizi canlandırmaya başlayalım.
void OnCollisionEnter(Collision denetle) { Debug.Log ("Dikkat, " + denetle.gameObject.name + " nesnesi bana çarptı!"); }
Evet ilk olarak, OnCollisionEnter fonksiyonun ne işe yardığı ile başlıyoruz.Birazdan yine değineceğim ama kısaca üstünden geçeyim.Bu fonksiyon, Trigger fonksiyonundan sınıfça farklılık gösterirler.Yani Collision, collider sınıfına ait değildir.Kafanız karışmasın diye konumuza geri dönüyorum.Şimdi OnCollisionEnter fonksiyonu, ekli olduğu nesneye farklı bir nesne çarptığından tetiklenir.Bu sadece bir kez olur.Yani ilk çarpışmayı algılarda diyebiliriz.Parantez içindeki collision ise az önce dediğim gibi, ekli olduğu sınıfın özelliklerini kullanmak için yazılır.
Bu sayede nesneme çarpan diğer nesnenin özelliklerini kullanabilir ve değiştirebilirim.Bu sizin hayalgücünüze ve projenizde yapmak istediklerinize göre çeşitlenebilir.Ben burada sadece Console penceresine, nesneme çarpan diğer nesnemin ismini yazdırmak istiyorum.Projeyi başlatıp kutu nesnemizi, Scene penceresinden geçit nesnemize yakınlaştırıp temasını sağladığımız zaman bir şey olmadığını göreceksiniz.Bunun nedeni her iki fonksiyonu kullanırken, çarpan nesnede Rigidbody bileşeninin olması gerektiğidir.Bu önemli bir detaydır.Şimdi kutu nesnemize, Rigidbody bileşenini ekleyerek devam edelim.
“Dikkat, kutu nesnesi bana çarptı!”
Projemizi başlatıp tekrar denersek, bu mesajı göreceksiniz.Evet diğer fonksiyonumuza geçebiliriz.
void OnCollisionStay(Collision denetle) { Debug.Log ("Dikkat, " + denetle.gameObject.name + " nesnesi bana çarptı!"); }
Gördüğünüz gibi Enter yerine Stay yazılıdır.Diğer herşey aynı kalıyor.Bu kod bir öncekinde farkı ise, nesneye temasın devam ettiği sürece çalışmasıdır.Şimdi diğerine bakalım.
void OnCollisionExit(Collision denetle) { Debug.Log ("Dikkat, " + denetle.gameObject.name + " nesnesi bana çarptı!"); }
Bu sefer ise farklı olarak, Exit yazılı olduğunu görüyorsunuz.İsminden de belli olduğu üzere, bu fonksiyon nesneye temasın kesildiği anda sadece 1 kere çalışır.Şimdi ise, diğer fonksiyonumuzu ele alalım.
void OnTriggerEnter(Collider denetle) { Debug.Log ("Dikkat, " + denetle.gameObject.name + " nesnesi bana çarptı!"); }
İki fonksiyonun farklarına en son değineceğim fakat, Trigger fonksiyonun en büyük olayı nesnenin içinde geçebilmesidir.Yani bu şekilde tetiklenir.Bu kodu yazdıktan sonra projemizi başlatalım ve nesnenin temas etmesini bekleyelim.Sizde göreceksinizdir ki, Console penceresinde herhangi bir mesaj gözükmeyecektir.
Çünkü bizim kodumuzun geçerli olması için çarptığımız nesnenin Inspector penceresinde bulunan Collider (bizim buradaki Box Collider) bileşeninin, Is Trigger özelliğinin aktif olması gerekiyor.Bunu aktif ettikten sonra bir daha bakacak olursak, nesnemizin içine girdiği anda 1 kere çalıştığını göreceksiniz.Parantez içindeki sınıf farklılığına dikkat ediniz.
void OnTriggerStay(Collider denetle) { Debug.Log ("Dikkat, " + denetle.gameObject.name + " nesnesi bana çarptı!"); }
Yine bu fonksiyonumuz ise, çarptığımız nesnenin içinde olduğumuz sürece çalışmaya devam edecektir.Trigger fonksiyonlarının sonuncusuna geçecek olursak,
void OnTriggerExit(Collider denetle) { Debug.Log ("Dikkat, " + denetle.gameObject.name + " nesnesi bana çarptı!"); }
Evet son Trigger fonksiyonumuz olan OnTriggerExit’da ise, çarptığımız nesnenin içinden çıktıktan sonra yani temasın kesilmesinden sonra sadece bir kez tetiklenir.
İki fonksiyon arasındaki fark nedir?
Bir tanesi, çarpışmada tetiklenirken diğeri çarptığı nesnenin içinde geçince tetikleniyor.Bunu sağlamak içinde Is Trigger özelliğinin aktif olması gerekiyor.Diğerinde ise bu özelliğe gerek yoktur.Evet tüm fonksiyonlarımızı hazırlamış olduk.
Evet bu dersimizin sonuna geldik.Yaptığınız projedeki ihtiyaçlarınıza göre, her iki yöntemi de farklı şekillerde kullanabilirsiniz.Bir başka derste görüşmek üzere…