Selamlar dostlar, bu yazımızda Unity Collider Nedir ? sorusunu olabildiğince genel kapsamlı şekilde cevaplayacağız. Collider, en temeliyle Unity oyun motoru içerisinde kullandığımız objelerin (GameObject) birbirinin içerisinden geçmesini önleyen veya birbiri içinden geçip geçmediğini algılamamızı sağlayan, fizik motoruyla beraber kullandığımız bir yapıdır.. Collider bileşenlerini nesneleri bir katılık, bir çerçeve kazandıran bileşen olarak da değerlendirebiliriz.
Bahsettiğimiz şekilde, objelerin birbirine temasını engellemek için öncelikle belirli bir harekete sahip olmaları gerekiyor. Objeleri Transform bileşeniyle de hareket ettirebiliriz ancak fizik motoru kullanmadığımız için bu temasları ve birbirinin içinden geçmelerini algılayamayız. Bu işlemleri yapmak için hareket ettirmek istediğimiz objelerimizi fizik sistemine dahil etmeli, yani bu objelere Rigidbody bileşeni eklemeliyiz. Objemizi seçtikten sonra Inspector panelinde bulunan “Add Component” butonuna tıkladığımızda arama kısmına “Collider” yazarak ekleyebileceğimiz çeşitli bileşenleri görebiliriz. Bu noktada dikkat etmeniz gereken 3 boyutlu olanları seçmek, bu derste 3 boyutlu bileşenlerden bahsedeceğiz. Objelere bileşen ekleme ve daha fazla bilgi için “Unity GameObject Nedir?” yazımızı inceleyebilirsiniz. Hareket etmeyen objelerimizde collider bileşeni olması yeterli olacaktır.
Collider Türleri
Biraz da Collider türleri hakkında bahsetmek istiyorum. Genel olarak fizik işlemler için kullanabileceğimiz bu iskelet yapısı performans kaygısı nedeniyle fazlasıyla basit halde tutulmaktadır. Unity bize 3 adet temel şekle sahip collider türü sağlamaktadır, bunlar küre, küp ve kapsül şekillerindedir. Ayrıca istersek yüklediğimiz 3 boyutlu modelimizin şeklini de kullanabiliriz ancak bunu da biraz daha kaba hale getirmemiz gerekmekte çoğu durumda.
Bu collider türleri hakkında detaylı bilgi vermeden önce şunu belirteyim, bu aşamada sadece bu türlere özel konulardan bahsedeceğim. Daha sonrasında da hepsinde ortak olarak kullanabildiğimiz kodlardan ve özelliklerden bahsedeceğim. Hazırsanız kullanabileceğim 4 türe geçelim ve onlara özel yapılardan bahsedelim.
Box Collider : Bu bileşen küp şeklinde bir çerçeve oluşturarak temas işlemlerini algılamamıza yardımcı olur. Unity içerisinde bir küp eklediğinizde bu bileşene sahip olduğunu görebilirsiniz. Center ve Size adında 2 değişkene sahiptir. Center değişkeni objenin local koordinat sistemine göre bu kübün merkezini belirtirken, Size değişkeni x,y ve z eksenlerindeki boyutunu ayarlamamızı sağlayan değişkendir.
Sphere Collider : Küre şeklinde olan bu tür 2 adet değişkene sahiptir. Sahneye bir Sphere objesi eklediğimizde temel olarak bu bileşene sahip olacaktır. Yine Center değişkeni ile objenin local sistemindeki konumunu ayarlarız. Radius değişkeni ise kürenin yarıçapını belirtmektedir, boyutunu bu değişkeni değiştirerek ayarlayabiliriz.
Capsule Collider : Kapsül şeklinde bir çerçeve elde ettiğimiz bir bileşendir, standart örneklerde gördüğümüz gibi FPS kontrollerde için eklediğimiz Capsule objesinin içerisinde bulunur. 4 adet değişkeni bulunur, bunlar; Center, Direction, Height, Radius değişkenleridir. Sırayla bahsedersek, Center bu bileşenin merkezinin obje koordinatlarına göre alacağı konumu belirtir. Direction değişkeni x, y veya z ekseni olarak seçebileceğimiz, collider yönünü belirten değişkendir. Height yükseklik değer, radius ise genişlik değerini belirtmektedir.
Mesh Collider : 3 boyutlu objelerimizin şeklini collider olarak belirtmemizi sağlayan yapılardır. 3 adet değişkene sahiptir. Convex değişkeni verilen meshi kullanarak oluşturduğumuz colllider yapısının daha basit, kaba hale indirgenip indirgenmeyeceğini belirtir. Cooking Options ile mesh objemizin fizik işlemlerine uyarlanması sırasında yapılacak işlemler için seçilebilecek ayarlardır. Ve son olarak Shared Mesh ise kullanacağımız 3 boyutlu model dosyasını belirttiğimiz değişkendir.
Unity Collider İle Kullanılabilecek Kodlar
Unity Collider Nedir? sorusunun cevabına kullabileceğiimiz kodlar ile devam etmek istiyorum. Unity Collider ile Kullanılabilecek Kodlar 3 ayrı başlıkta ayrılıyor. Bunlar özellikler/değişkenler, public metodlar, ve mesajlardır (temaslardan haberdar olmak için çağırılan kodlar). Bu başlıklar altında hepsini sırayla inceleyelim.
Özellikler – Erişilebilir Değişkenler
attachedRigidbody : Bu değişken sayesinde direkt olarak collider bileşenin bulunduğu objenin rigidbody bileşenine erişebiliriz.
void Start()
{
// Rigidbody bileşenini bulup z ekseninde 5 birimlik kuvvet uygular
GetComponent<Collider>().attachedRigidbody.AddForce(0, 0, 5);
}
bounds: Bounds tipinde olan döndüren bu değişken sayesinde collider merkezini, genişliği, yüksekliği gibi verilere ulaşabiliriz. Dikkat etmeniz gereken konu, bounds objenin içerisine sığabileceği bir kutuyu temsil eder diyebiliriz.
void Start()
{
// Collider büyüklüğünü log ekranına yazdırır
float size= GetComponent<Collider>().bounds.size;
Debug.Log(“Obje Boyutu= ” + size);
}
contactOffset : Temas işlemleri hesaplanırken collider yüzeyinden ne kadar uzakta hesaplanacağını belirlediğimiz, bir nevi ekstra bir boşluk kattığmız değişkendir. Bu sayede görsel olarak objeler birbirine değmese bile bir temas varmış gibi işlem yapılabilir.
enabled : Collider bileşeninin aktif olup olmayacağını belirttiğimiz değişken. Eğer deaktif hale getirirsek, obje diğer objelerle temas durumunda bir işlem yapmayacak, haberdar olamayacaktır.
Collider col;
void Start()
{
//Collider bileşeni ataması yapar
col= GetComponent<Collider>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
//Space tuşuna her bastığımızda aktifliği tersine çevirir
//örneğin aktif ise deaktif, deaktif ise aktif hale gelir
col.enabled = !col.enabled;
}
}
isTrigger : En önemli özelliklerden biri isTrigger özelliğidir. Bu özelliği aktif hale getirdiğimiz, true değeri atadığımız taktirde objelerimiz artık içinden geçilebilir halde olacaktır. Aynı zamanda bu birbirinin içinden geçme durumlarından da bizi haberdar edecektir. Temas durumlarına dair fonksiyonlara yazının devamında detaylı şekilde ulaşabilirsiniz.
material : Collider’ın sahip olduğu fizik materyaline rerişmemizi sağlayan fonksiyondur. Bu sayede sürtünme, geri tepme gibi özelilklerin atamasını yapabiliriz. Eğer birden fazla objenin kullandığı bir materyale sahipse, çalışma anında materyalin bir kopyasını yaratır ve objeye bu kopya materyali atar.
Collider col;
// Fizik materyaline erişip dinamik sürtünme ve zıplama etkilerine değerler atar.
void Start()
{
coll = GetComponent<Collider>();
col.material.dynamicFriction = 2f;
col.material.bounciness = .5f;
}
sharedMaterial : Aynı material özelliğinde olduğu gibi collider’ın kullandığı materyali alır. Ancak bu komut sayesinde yaptığınız her işlem aynı materyale sahip diğer objeleri de etkileyecektir. Eğer değişikliği tek bir objede yapmak istiyorsanız sharedMaterial yerine material kullanmanız gerekir.
Public Metodlar
ClosestPoint : Verilen konuma en yakın olan obje noktasını verir.
ClosestPointOnBounds: Collider’ın Bounds adlı değişkenini baz alarak, belirtilen konuma en yakın noktayı döndürür.
Raycast: Sadece bu objeyle etkileşime geçecek bir ışın yaratır. Bu sayede, sadece attığınız ışının ile objenizin arasında başka objeler bulunsa da, sadece bu objeyle temas gireceğinden dolayı, filtreleme işlemlerine ihtiyaç duymadan bir ışın oluşturmanız mümkündür. Aşağıdaki basit örnekte, objenin üzerine tıkladığınızda, objeyi kendi üstünde tıkladığınız konuma getirmeyi sağlayan yapıyı görebilirsiniz.
Collider col;
void Start()
{
col= GetComponent<Collider>();
}
void Update()
{
// Objeyi mouse ile ekranda tıkladığınız konuma götürür
if (Input.GetMouseButtonDown(0))
{
Ray isin= Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit temas;
if (col.Raycast(isin, out temas, 100.0f))
{
transform.position = temas.point;
}
}
}
Mesajlar
Mesajlar kısmını aslında 2 farklı tipte toplam 6 metod içeriyor. Temas etme ve içerisinden geçme/üstüste binme işlemleri için. Daha toplu halde olması adını önce bu şekilde ikiye ayırıp önce Temas ardından da birbirinin içinden geçmeye dair işlemleri anlatıp örnek kodlarını toplu yazacağım.
OnCollisionEnter : Objenin başka bir objeye temas ettiği an yollanan mesaj sayesinde çalışan bir fonksiyondur.
OnCollisionExit : Objenin teması bıraktığı, diğer objeden ayrıldığı an çağırılan fonksiyondur.
OnCollisionStay : Temas etme işlemi gerçekleştiği sürece aynı update gibi tekrar tekrar çalışan fonksiyondur.
Önemli bir hatırlatma, bu fonksiyonların çalışabilmesi için temas edecek iki objenin de isTrigger değeri false olmalı. Eğer bir tanesi bile true değerine sahip olursa, yani trigger halde olursa yazının devamındaki OnTrigger şeklindeki fonksiyonlar çağırılacaktır.
//Örneklerde temel olarak yaptığımız şey aynı,
// temas gerçekleştirdiğimiz objenin adını alıp log ekranına yazdırıyoruz. 3 farklı durum için bunu gerçekleştiriyoruz böylece.
void OnCollisionEnter(Collision temas)
{
Debug.Log(“Temasa başlanan obje: “+temas.transform.name”);
}
void OnCollisionExit(Collision temas)
{
Debug.Log("Temas etme biten obje " + temas.transform.name);
}
void OnCollisionStay(Collision temas)
{
Debug.Log(“Temas halinde olunun obje” + temas.transform.name”);
}
OnTriggerEnter :Obje başka bir objenin içinden geçmeye başladığı an çalışan fonksiyondur.
OnTriggerExit : Objenin başka bir objenin içinden geçmeyi bıraktığı, üstüste binme işleminin bitti an çağırılan, aktif olan fonksiyondur.
OnTriggerStay : Obje bir başka objeyle üstüste bindiği sürece, içinden geçmeye devam ettiği sürece, update gibi, sürekli çağırılan fonksiyondur.
Önemli bir hatırlatma yapayım,Bu fonksiyonların çalışabilmesi için temas edecek iki objeden en az birinin collider isTrigger değeri true olmalı. Trigger halde olmamaları halinde az önce bahsettiğimiz OnCollision şeklindeki fonksiyonlar aktif olacak ve çağırılacaktır.
//bu örneklerin genelinde de objelerin temas anından, temas süresince ve temas bitiminde birbirinden ne kadar uzakta olduklarını log ekranına yazdırıyoruz
void OnTriggerExit(Collider digerObje)
{
Debug.Log(“Başlangıçta Aradaki mesafe:”+(transform.position-digerObje.transform.position));
}
void OnTriggerExit(Collider digerObje)
{
Debug.Log(“Temas ederken aradaki mesafe:”+(transform.position-digerObje.transform.position));
}
void OnTriggerStay(Collider digerObje)
{
Debug.Log(“Temas bittiğinde aradaki mesafe:”+(transform.position-digerObje.transform.position));
}
Kullanılabilen kodlardan da bahsettiğimize göre, Unity Collider Nedir? sorusunu cevaplamış olduk böylece. 3D dışında, 2D için de collider tipleri bulunuyor ancak onlar farklı bir yazının konusu. Benzerliklerinin yanında farklılıkları da baya bol emin olun. Türkçe olarak erişebilseniz de, orjinal Unity Collider dökümanına erişmek için buraya tıklayabilirsiniz.