Unity Rigidbody ve Temas Algılama

Unity

Unity Temas Algılama


Merhaba arkadaşlar bu yazımda sizlere Unity ile iki objenin birbirileri ile olan temaslarını nasıl belirleyebileceğimizden bahsedeceğim.

Unity içinde bulunan Rigidbody componenti ile bu temasları çok rahat bir şekilde algılayabiliyoruz.
Rigidbody componenti ile daha bir çok şeyi ayarlayabiliyoruz ama bunları ilerleyen zamanlarda daha detaylı bir şekilde projelerde nasıl kullandığımızı göstererek öğrenmenizden tarafayım.


Rigidbody

Unity de 2 adet Rigidbody bulunmaktadır birisi 2D oyunlar için ve 2D objeler için geliştirilmiş olan Rigidbody2D ve diğeri 3D oyunlar için geliştirilmiş olan adında 2D gibi bir ek bulunmadan düz Rigidbody. Bu yazıda sizlere direkt olarak 3D olanı üzerinden Rigidbody yi özetleyeceğim zaten 2D olanı ile ikisi aynı.

Rigidbody

Rigidbody eklemek istediğimiz nesneye gelip "Add Component" kısmından Rigidbody tipini seçiyoruz. Nesnemizde yukarıdaki gibi bir görüntü gelecektir.
Mass : Kütle
Drag : Sürtünme kat sayısı, nesnenin durma hızını arttırmak için arttırabilirsiniz.
Angular Drag : Nesnenin dönme hızını yavaşlatmak için arttırabilirsiniz / kullanabilirsiniz.
Use Gravity : Yer çekimini kullan. Aktif hale getirdiğiniz zaman nesne yere doğru düşmeye başlayacaktır eğer bir zemin tarafından (Collider) engellenmez ise.
Is Kinematic : Etkinleştirildiği zaman fizik motoru nesne için aktifleşmez, genel olarak hareketli nesneler için kullanılır. (Hareketi rigidbody tarafından kontrol edilmeyen nesneler için.)
Interpolate : Nesnenin hareketinde sıkıntı varsa düzelmek için kullandığımız seçenektir.
Collision Detection : Temasın nasıl tespit edileceğini seçiyorsunuz. (temas eder etmez, temas ederken, hem temas ederken hem de nesne ile iletişim halindeyken gibi...)
Constraints : Nesnenin rigidbody tarafından hangi yöne döneceğini ve hareket edeceğini açıp kapatabildiğiniz alandır.
Eğer ki nesnenin çarpışmalar sonucu dönmesini veya hareket etmesini istemiyorsanız oradaki her şeye tik atabilirsiniz.

Temas Algılama

Rigidbody hakkında bilgi verdiğimize göre artık Unity ile nesnelerin temaslarını nasıl algılayabileceğimize geçelim.

Unity Temas Algılama 1


İlk olarak 2 kare ve 1 de küre oluşturuyoruz, burada küremiz karakteri temsil etsin, sağındaki kare puan kutusu ve solundaki kare de engel/düşman gibi düşünelim.
Karakterimize 
Rigidbody ekliyoruz ve herhangi bir Collider bulundurduğundan emin oluyoruz.

Unity Temas Algılama 2

Şimdi puan için olan nesnemizde Collider olduğundan emin oluyor ve tag kısmında "Puan" tagını veriyoruz.
Bu arada Collider kısmında "Is Trigger" in aktif olmadığından emin olun. Çünkü kodlarımızı yazarken 2 farklı fonksiyon ile yazacağız.
Eğer ki Trigger aktif olursa yazacağımız kod çalışmayacaktır.

Is Trigger ne işe yarıyor diye soracak olursanız, karakterimiz gibi diğer Collideri olan nesnelerin bu nesnenin içinden geçmesini engelliyor.

Unity Temas Algılama 3

Engel için olan nesnemize "Engel" tag ini atıyoruz ama bu sefer nesne içinden geçsin istiyorum ve bu yüzden "Is Trigger" i aktif hale getiriyorum.

Şimdi sahnemizi hazırladığımıza göre artık kodlarımızı yazmaya başlayabiliriz, bu iki obje için iki farklı kod yazacağız.

Temas Algılama 4

"karakter" adı altında bir script oluşturuyor ve karakter olarak belirlediğim küre nesnemin component kısmına atıyorum.

OnCollision

Birbirinin içinden geçemeyen nesnelerin temaslarını algılamak için kullanılır. 
3 Farklı durumu vardır.
Fonksiyon yazıldıktan sonra Collision olarak iç değişken alır.
OnCollisionEnter() : Nesneye ilk defa temas ettiği zaman 1 kere çalışır.
OnCollisionExit() : Nesneye olan teması bittiği zaman 1 kere çalışır.
OnCollisionStay() : Nesneye temas ettiği süre boyunca çalışır.

void OnCollisionEnter(Collision collision){
         if(collision.transform.tag == "Puan"){
            Debug.Log("Puan ile temas edildi");
            //Yapılması istenen diğer komutlar..
        }
    }


OnTrigger

Birbirinin içinden geçebilen nesnelerin temaslarını algılamak için kullanılır.
OnCollision da olduğu gibi bununda 3 farklı durumu bulunmaktadır.
Fonksiyon tanımlandıktan sonra Collider olarak iç değişken alır.
OnTriggerEnter() : Nesneye ilk defa temas edildiğinde 1 kere çalışır.
OnTriggerExit() : Nesneye olan temas bittiği zaman 1 kere çalışır.
OnTriggerStay() : Nesneye olan temas sürdükçe çalışır.

   void OnTriggerEnter(Collider collider){

         if(collider.transform.tag == "Engel"){
            Debug.Log("Engel ile temas edildi");
           
        }
    }

Temas algılama ile bütün kodlarımızı yazacak olursak
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class karakter : MonoBehaviour
{
    // Start is called before the first frame update

    void Start()
    {
       
    }

    // Update is called once per frame
    void Update()
    {

    }


    void OnCollisionEnter(Collision collision){
         if(collision.transform.tag == "Puan"){
            Debug.Log("Puan ile temas edildi");
           
        }
    }
    void OnTriggerEnter(Collider collider){

         if(collider.transform.tag == "Engel"){
            Debug.Log("Engel ile temas edildi");
           
        }
    }
}

Temas algılama ile ilgili kodlarımız bu kadar arkadaşlar merak ettiğiniz başka sorularınız var ise yorum olarak yazabilirsiniz.