Hepinize merhaba dostlar, bu yazımızda Unity Rigidbody Nedir ? sorusunu olabildiğince geniş çaplı şekilde cevaplayacağız. Rigidbody bileşeni nasıl kullanabiliriz, hangi fonksiyonlarla hangi işlemleri gerçekleştirebiliriz ve rigidbody sayesinde fizik motorundan nasıl yararlanabiliriz bunları adım adım anlatarak Unity Rigidbody için bir nevi döküman oluşturmuş olacağız.

Öncelikle Rigidbody nedir bundan bahsedelim. Rigidbody bileşeni, Unity fizik motorunu kullanarak gerçek dünyada olduğu gibi fiziksel hareketlerin taklit edilmesini sağlar. Yerçekimi yüzünden nesnelerin aşağı düşmesi, yuvarlak objelerin yuvarlanırken köşeli objelerin sabit kalması gibi hareketleri düşünebilirsiniz en basit haliyle. Ve bu bileşen sayesinde objelere gerçekçi şekilde hareket yeteneği de verebiliriz. Örneğin bir araba modelinde, tekerlere döndürme kuvveti (tork) uygulayarak arabanın ilerlemesini sağlayabilir ve tekerlerin rotasyonunu değiştirerek sağa sola hareket ettirebiliriz. Gördüğünüz gibi fizik motorunun gücü azımsanmayacak seviyede kolaylıklar sağlıyor bize. Şimdi biraz da Rigidbody bileşenin ne gibi özellikleri var, inspectorda nasıl gözüküyor bunlara bakalım.

Öncelikle sahneye 1 adet plane ve 1 adet küre (sphere) eklemenizi istiyorum. Ayrıca küreyi plane objesinin biraz daha yukarısına yerleştirin. Bu iki objede fiziksel işlemleri gerçekleştirmek için ihtiyaç duyacağımız Collider tipindeki bileşene sahip oyun objeleridir. Daha sonrasında küre objemize Rigidbody bileşenini  Eğer bilmiyorsanız, her GameObject’e bir bileşen (component) ekleyebiliriz. GameObject ve bileşen eklemeyi ve daha detaylı bilgileri Unity – GameObject Nedir ? yazımızda bulabilirsiniz.. Yapmanız gereken şey, objeyi seçtikten sonra inspector kısmında “Add Component” butonuna tıklamak, ardında da arama kısmına “Rigidbody” yazmak. Karşınıza gerekli bileşen çıkacaktır, tıkladığınızda da artık objeye eklenmiş olacaktır. Şimdi ufak bir test sürüşü için oyunu başlatıp kürenin nasıl aşağı hareket ettiğini izleyebilirsiniz. Söylediğim gibi, plane üstünde olmasına dikkat edin.

Ufak bir bilgi vermekte de yarar olduğunu düşünüyorum, Rigidbody ile ilgili bütün genel ayarlamaları “Edit>Project Settings>Physics” altından yapabilirsiniz. Az sonra vereceğimiz özelliklerin bir kısmı nesneye özel ayarlanması gerekirken bir kısmı da bütün objelerin kullandığı ortak özelliklerdir. Örneğin oyundaki yer çekimini veya katmanlar (layer) arasında hangilerinin birbiriyle etkileşime girebileceğini bu kısımdan ayarlayabilirsiniz.

Rigidbody Özellikleri

Şimdi de özelliklere gelelim. Inspector panelinde bileşen alanına baktığınızda bazı alanlar olduğunu farketmişsindiz. Bunlar isterseniz panel üzerinden isterseniz de kod üzerinden değiştirebileceğiniz özelliklerdir. Bu özellikler sayesinde yaratmaya çalıştığınız fizik simülasyonlarını tam olarak istediğiniz hale getirebilirsiniz. Gerçek dünyada olduğu gibi burada da fizik formüllerinden yararlanıldığı için, biraz fizik ve matematik bilgisinin size kesinlikle faydası olacaktır. Şimdi özellikleri tek tek inceleyelim ve ne işe yaradıklarını ele alalım.

Mass : Objenin kilogram cinsinden ağırlığını temsil eder. Uygulayacağınız fiziksel kuvvetler açısından önemlidir. Örneğin aynı büyüklüğe sahip demir topa vurduğunuzdaki gideceği uzaklıkla, futbol topuna vurduğunuzda gideceği uzaklık farklıdır. Bu farkı belirleyen en temel şeylerden biri ağırlıktır.

Drag : Objenin bir kuvvet uygulandığında ne kadar hava direncine / sürtünmesine sahip olacağı değeridir. Bu değer kuvvetten daha az etkilenilmesini sağlar, yani daha yavaş bir hareket oluşturur. Eğer 0 değeri verilirse harekette hiç azalma olmazken “infinity” değeri verilirse obje anında duracaktır.

Angular Drag : Objenin kuvvete karşı göstereceği başka bir hava direnci tipi. Burada farklı olarak hareket yerine rotasyon değişimi, dönme üzerinde ne kadar direnç olacağını belirtiyoruz. Yine 0 değeri verdiğimizde hiçbir dirence sahip olmayacaktır, ancak infinity değerinin kullanımı burada rotasyonu, dönüşü tamamen durdurmayacaktır.

Use Gravity : True veya false değeri alan bu değer objemizin yerçekiminden etkilenip etkilenmeyeceğini belirtir. Uzay gibi bir yerçekimsiz bir ortam yaratmak istiyorsanız fazlasıyla işinize yarayabilir. Veya objelerin havada rahatlıkla süzülmesini istediğiniz durumlarda. Olasılıklar sonsuz, değil mi ?

Is Kinematic : Yine true veya false değeri alan bu değişken ise objenin bütün fizik etkileşimlerinden muaf tutulmasını sağlar. Eğer true değerine sahipse, ister kod ile ister oyun içinde objelerin çarpmasıyla olsun, hiçbir kuvvet harekete sebep olmayacaktır. Ragdoll veya HingeJoint gibi yapılar kullanırken işinizi kolaylaştıracak bir özelliktir.

Interpolate:  Fiziksel işlemler ile objenin hareketini hesaplarken bir yumuşatmaya tabii tutulup tutulmayacağını belirlediğimi özellik. Eğer rigidbody ile hareketi sağlarken titremeler yaşıyorsanız bu ayarı kurcalamak sorununuzu çözecektir. Alabileceği 3 değer vardır. Bunlar ;

  1. None : Hiçbir yumuşatma işlemi gerçekleşmez.
  2. Interpolate : Objenin bir önceki karede sahip olduğu Transform değerlerine göre yumuşatma işlemi yapılır.
  3. Extrapolate : Objenin gelecek karede tahminen olması gereken yer baz alınarak yumuşatma işlemi gerçekleşir.

Collision Detection: Obje temaslarının tespitiyle alakalı bir ayardır. Bazı objeleriniz çok hızlı olduğundan dolayı fiziksel temaslar çalışmayabilir. Bu ayar sayesinde temas kontrolünün, algılanmasını ne kadar hassas olacağını belirleyebiliriz. 3 tane seçeneğe sahiptir. Bunlar;

  1. Discrete : Standart olarak seçili olan ayardır. 
  2. Continuous : Daha yüksek hassasiyete sahip bir ayardır. Farklı algılama değerine sahip objelere farklı şekilde tepki verir. Hızlı objelerle bir sorun yoksa Discrete kullanılması önerilir.
  3. Continuous Dynamic : Hızlı harekete sahip objelerde kullanılabilecek bir seçenektir. 
  4. Continuous Speculative : Bu seçenek performans açısından bakıldığında diğer 2 Continuous seçeneğinden daha performanslıdır. Ayrıca kinematic haldeki bileşenlere atanabilecek tek Continuous tipindeki seçenektir.

Constraints : Objemizin hareketini ve rotasyon değişimini kısıtlamamızı sağlar. Belirli eksenlerdeki hareketi Freeze Position seçenekleriyle, dönüşleri ise Freeze Rotation seçenekleriyle engelleyebilirsiniz.

Gördüğünüz bu özellikleri biraz kurcalayarak az önce oluşturduğumuz basit sahnede büyük değişiklikler yapabilirsiniz. Örneğin, Drag ve Angular Drag değerleriyle oynamayı deneyin, arttırın ve azaltın. Deneyimleyerek öğrenmek en güzel yöntemlerden biridir.

Unity Rigidbody İle Kullanılabilecek Kodlar

Unity Rigidbody Nedir? sorusunu cevaplamaya kullanabileceğimiz kodlar ile devam edelim şimdi. Ayrı başlıklar halinde anlatıma geçmeden önce, biraz daha genel kullanıma sahip olan ve Rigidbody İle Kullanılabilecek Kodlar arasında bulunan belirli başlı komutlardan bahsetmek istiyorum. Bunlar genellikle diğer bileşenlerle de kullanabileceğimiz komutlar, aklınızda bulunsun.

Ayrı başlıklar halinde anlatıma geçmeden önce, biraz daha genel kullanıma sahip olan ve Rigidbody İle Kullanılabilecek Kodlar arasında bulunan belirli başlı komutlardan bahsetmek istiyorum. Bunlar genellikle diğer bileşenlerle de kullanabileceğimiz komutlar, aklınızda bulunsun.

Destroy () : Bu method içerisine değişken olarak verdiğin obje yok olacaktır, eğer Rigidbody gibi bir bileşen verirseniz bileşeni o objeden kaldıracaktır.

//Rigidbody bileşenine ulaşıp objeden kaldırır.
	//Buradaki “gameObject” özel bir değişkendir ve MonoBehaviour kodlarında, atandığı objeyi verir.
	Rigidbody rgb=gameObject.GetComponent<Rigidbody>();
	Destroy(rgb);

Instantiate () : Bir GameObject yaratmanızı sağlar. Eğer GameObject yerine bir bileşen tipi verirseniz o bileşene sahip bir GameObject yaratır. Prefab kullanımında belirli tipe sahip objeleri kullanmak için kullanabilirsiniz. Aşağıdaki kodu denerseniz içerisine top alanına sadece Rigidbody’e sahip objeler seçebileceğinizi görebilrsiniz.

	//Space tuşuna basıldığında Rigidbody tipine sahip objeyi çoğaltır.
public Rigidbody top;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Bu koda sahip objenin konumunda ve açısında yeni bir top oluşturur
// yenitop değişkeni ile yaratılan objeye fizik komutları verebilirsiniz.
            Rigidbody yeniTop;
            yeniTop= Instantiate(top, transform.position, transform.rotation);
        }
    }

Özellikler – Erişilebilir Değişkenler

angularDrag : Dönüş hareketine etki eden değerdir. Sıfır verilirse dönüşe hiçbir etki olmaz.

    public Rigidbody rgb;
    void Start () {
        rgb = GetComponent<Rigidbody> ();
    }

    // Space tuşuna basılı tutulduğu sürece angularDrag değerini 15 yapar
    // ve dönüş hareketi yavaşlatır.
    void Update () {
        if (Input.GetKey (KeyCode.Space))
            rgb.angularDrag = 15;
        else
            rgb.angularDrag = 0;
    }

angularVelocity :Dönüşsel hareketin değeridir. Radyan/Saniye olarak belirtilir. Bu değeri direkt değiştirmek gerçekçi olmayan hareketlere sebep olabilir. 

    public Rigidbody rgb;
    public MeshRenderer renderer;

    void Start () {
        rgb = GetComponent<Rigidbody> ();
        renderer = GetComponent<MeshRenderer> ();
    }

    //Eğer angularVelocity büyüklüğü 7.5f değerinden küçük ise 
    // objeyi yeşil renge, büyük veya eşit ise kırmızı renge boyar 
    void Update () {
        if (rgb.angularVelocity.magnitude < 7.5f)
            renderer.sharedMaterial.color = Color.green;
        else
            renderer.sharedMaterial.color = Color.red;
    }

centerOfMass : Objenin ağırlık merkezi değeridir. Vector3 cinsinden değer alır ve objenin merkezine göre ağırlık merkezini belirler.

public Rigidbody rgb;

    //Ağırlık merkezini objenin 1 birim yukarısı olarak ayarlar.
    void Start () {
        rgb = GetComponent<Rigidbody> ();
        rgb.centerOfMass = new Vector3 (0, 1, 0);
    }

collisionDetectionMode : Objenin temas işlemleri için kullanılacak moddur. CollisionDetectionMode tipinde değişken alır.

constraints : Objenin hareket ve dönüş işlemlerinde kısıtlanması için kullanılan değişkendir. RigidbodyConstraits tipinde değişken alır.

 public Rigidbody rgb;

    //İstersek kısıtlmaları değişken olarak tutabiliriz.
    RigidbodyConstraints yEkseniKisitla = RigidbodyConstraints.FreezePositionY | RigidbodyConstraints.FreezeRotationY;

    void Start () {
        rgb = GetComponent<Rigidbody> ();

        //Objenin X eksenindeki hareketini engeller
        rgb.constraints = RigidbodyConstraints.FreezePositionX;

        //Objenin y ve z eksenindeki dönüşü engeller
        // '|' işaretini kullanarak birden fazla kısıtlama ekleyebiliriz.
        rgb.constraints = RigidbodyConstraints.FreezeRotationY | RigidbodyConstraints.FreezeRotationZ;

        //oluşturduğumuz kısıtlama değişkenini atayabiliriz.
        rgb.constraints = yEkseniKisitla;
    }

detectCollisions : Fiziksel işlemlerde temas, dokunma algılama işlemlerinin çalışıp çalışmamasını belirlediğimiz değişken. Standart olarak açık haldedir.

public Rigidbody rgb;

void Start () {
        rgb = GetComponent<Rigidbody> ();
    }
    void Update () {
        //Space tuşuna basıldığında algılama açık ise kapalı
        //kapalı ise açık hale getirir. ! işareti ile durumu
        // tersine çeviririz.
        if (Input.GetKeyDown (KeyCode.Space))
            rgb.detectCollisions = !rgb.detectCollisions;
    }

drag : Sürtünme, direnç kuvveti değişkenidir. Ne kadar yüksek olursa obje temaslarında hareket o kadar azalacak, yavaşlayacaktır.

public Rigidbody rgb;

    void Start () {
        rgb = GetComponent<Rigidbody> ();
    }
    void Update () {
        //Drag değeri Space tuşuna basılınca 20
        //Space basılmayı bırakınca 0 değerini alarak
        // yerçekimi gibi fiziksel etkilerden daha farklı şekilde etkilenir.
        if (Input.GetKeyDown (KeyCode.Space))
            rgb.drag = 20;
        else if (Input.GetKeyUp (KeyCode.Space))
            rgb.drag = 0;
    }

freezeRotation : Objenin fiziksel etkiler yüzünden dönüş hareketi yapıp yapmayağını belirlediğimiz değişkendir. False değeri verilirse hiçbir fiziksel etki objeyi döndüremeyecektir.

interpolation : Fizik hareketlerinde yumuşatma tipini belirlediğimiz değişkendir. Standart olarak “None” seçeneği ile gelir. RigidbodyInterpolation tipinde değişken alır.

public Rigidbody rgb;

    void Start () {
        rgb = GetComponent<Rigidbody> ();
        rgb.interpolation=RigidbodyInterpolation.Interpolate;
    }

isKinematic : Objenin fiziksel kuvvetlerden etkilenip etkilenmediğini belirlediğimiz değişkendir. True veya false değeri alır.

mass : Objenin ağırlığıdır. Float tipinden değişken alır ve fiziksel hareket hesaplarında önemli bir değişkendir.

maxAngularVelocity :Objenin saniyede yapabileceği maksimum dönüş hareketini belirlediğimiz, bir nevi sınır koymamızı sağlayan değişkendir. Standart olarak 7 değerine sahiptir. Radyan olarak kabul edilir, yani standart olarak bir obje 1 saniyede 7 radyanlık dönüş gerçekleştirebiliriz.

position : Objenin o anki pozisyonu değeridir. Vector3 cinsindedir.

public Rigidbody rgb;

    void Start () {
        rgb = GetComponent<Rigidbody> ();
    }
    void Update () {
        //Space tuşuna basıldığında objeyi 0,5,0 noktasına götürür
        //Vector3.up 0,1,0 değerine eşittir. 
        //Çarpma işlemi yaptığımızda 7 değeri çarptığımız sayı değerini almış olur
        if (Input.GetKeyDown (KeyCode.Space))
            rgb.position = Vector3.up * 5;
        //Objenin pozisyonunu ekrana yazdırır
        Debug.Log (rgb.position);
    }

rotation : Objenin yön bilgisini tutar. Quaternion cinsindedir.

public Rigidbody rgb;
    //Objenin yön bilgisini sıfırlar
    void Start () {
        rgb = GetComponent<Rigidbody> ();
        rgb.rotation = Quaternion.identity;
    }

sleepThreshold : Objenin fizik işlemlerini askıya alma, bir nevi uykuya dalması için gerekli olan enerji aralığıdır. 

solverIterations : Rigidbody objelerinde Joint ve Collision temaslarının ne kadar sık/kararlı şekilde hesaplandığını belirtir. Birbirine bağlı Rigidbody bileşenlerinde sallanma veya menteşe gibi işlemler yaparken istediğiniz sekilde, sağlıklı çalışmadığını düşünüyorsanız bu değeri arttırarak daha kararlı, sık şekilde çalışmasını sağlayabilirsiniz. Daha yüksek değerler daha iyi simülasyon oluşturur ancak performansa da etki eder. Standart olarak sahip olduğu değer 6’dır.

solverVelocityIterations : Joint ve Collision temasları sonrasında simulasyonun ne kadar yüksek hassasiyetle çalıştırıldığı ile alakalıdır. Örnek vermek gerekirse, bu değeri arttırdıktan sonra fizik motorundan yararlanan objeniz zıplamanın ardından daha yüksek hassasiyetle simule edilecektir. Standart değeri 1’dir. 

useGravity :Objenin yerçekiminden etkilenip etkilenmeyeceğini belirttiğimiz değişkendir. True veya false değeri alır.

velocity : Objenin anlık hareketinin Vector3 cinsinden değeridir. Direkt atanmaması önerilir. Velocity değerini daha sağlıklı olarak değiştirmek için aşağıda bahsettiğimiz AddForce gibi fonksiyonları inceleyebilirsiniz.

worldCenterOfMass : Obje ağırlık merkezinin genel koordinat sistemindeki pozisyonunu Vector3 cinsinden verir. Sadece okunabilir bir değişkendir, değiştirilemez.

Public Methodlar

AddExplosionForce () : Belirtilen pozisyonda bir patlama efekti simule eder. Patlama alanı bir küre olarak hesaplanır. Patlamanın merkez noktasında belirtilen kuvvet tamamen uygulanırken bu küre halindeki alanın dışına ulaştıkça değer sıfıra yaklaşır. Ayrıca ForceMode tipinde değişken belirtilerek kuvvetin nasıl etki edeceği belirtilebilir. Standart olarak verilmiş değer ForceMode.Force idir.

    public float yaricap= 3f;
    public float patlamaSiddeti= 15f;

    void Start()
    {
        Vector3 patlamaMerkezi= transform.position;
        //Belirtilen yarıçap kullanılarak patlama alanı içerisinde kalan objeleri buluyoruz
        Collider[] objeler= Physics.OverlapSphere(patlamaMerkezi, yaricap);
        foreach (Collider obje in colliders)
        {
            Rigidbody rb = obje.GetComponent<Rigidbody>();
	//eğer bulunan obje rigidbody bileşenine sahipse patlama efekti uyguluyoruz.
	//buradaki 3 değeri objeye yukarı yönde ne kadar kuvvet uygulanacağını gösterir.
            if (rb != null)
                rb.AddExplosionForce(patlamaSiddeti, patlamaMerkezi, yaricap, 3.0F);
        }
    }

AddForce (): Objeye direkt olarak Vector3 cinsinde verilen miktarda kuvvet uygular. 2. parametre olarak ForceMode tipinde bir değişken verilebilir, bu değişken verilmezse standart olarak ForceMode.Force kullanılacaktır.

//bu örnekte karaktere 5 birimlik yukarı yönlü kuvvet uygulanıyor.
//zıplama, havaya fırlama gibi 
public float ziplamaKuvveti = 5.0f;
    public Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        rb.AddForce(transform.up * ziplamaKuvveti);
    	//Değişkeni vector3 halinde yazarsak çarpma işleminin sonucunda şu şekilde olacaktır. Parantez içerisinde aşadğıdaki değişkeni kullanabilirsiniz ve siz de değerleri değiştirebilirsiniz.
//new Vector3(0,ziplamaKuvveti,0);
    }

AddForceAtPosition () : AddForce fonksiyonunda olduğu gibi objeye bir kuvvet uygulamamızı sağlar, ancak bu fonksiyonda objenin belirli bir noktasına kuvvet uygulayabiliriz. Örneğin bir kübü düşünürsek, kenar veya köşe noktalarını seçerek kuvvet uygulayabiliriz, bu sayede tahmin edeceğiniz gibi bu işlem kübü sadece hareket ettirmek yerine belirli bir tork, dönme hareketi de sağlayacaktır.

AddRelativeForce (): Bu fonksiyonda verilen kuvvet değeri diğerlerinden farklı olarak Global, genel koordinat sistemine göre değil, local , yani objenin koordinat sistemine göre değerlendirilir. Aynı AddForce gibi çalışmaktadır. Yalnız, hareketin yönü objeye göre değerlendirilecektir bunu unutmayın.

//ileri yönlü 5 birimlik kuvvet uygular. Karakterin z eksenine göre kuvvet uygulayacaktır
public float ileriHareket= 3.0f;
    public Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        rb.AddForce(new Vector3(0,0,ileriHareketi);
    }

AddRelativeTorque (): AddRelativeForce gibi  local koordinat sistemini kullanan, bir tork, dönme kuvveti uygulamamızı sağlayan fonksiyondur.

public float tork;
    public Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
// A ve D tuşlarına(Horizontal Axis Değerini değiştirmediyseniz) basıldıında objeyi Z ekseninde döndürmeye başlayacaktır.
        float donmeDegeri= Input.GetAxis("Horizontal");
        rb.AddRelativeTorque(Vector3.forward * tork* donmeDegeri);
    }

AddTorque (): AddRelativeTorque gibi obje tork, dönme hareketi oluşturmamızı sağlar. Local yerine Global koordinat sistemine göre hareket eder.

ClosestPointOnBounds (): Belirtilen pozisyona en yakın objenin collider noktasını/konumunu bulur ve Vector3 olarak döndürür.

void EnYakinNoktayiIsaretle(){
	//Objenin 1,0,1 noktasına en yakın kısmını bulup o konumda bir küre objesi yaratarak işaretleme yapar. Değerlerle oynayarak ya da objeyi hareket ettirerek değişimi görebilirsiniz.
//işaret küresinin boyutunu .1 değerine düşürür.
	 Vector3 enYakinNokta= rb.ClosestPointOnBounds(new Vector3(1,0,1);
	GamObject isaretKuresi=GameObject.CreatePrimitive(PrimitiveType.Sphere);
	isaretKuresi.transform.scale=Vector.one*.1f;
}

IsSleeping (): Rigidbody bileşenin uyku moduna geçip geçmediğini bool tpinde döndüren fonksiyondur.

MovePosition (): Kinematic haldeki rigidbody bileşenine sahip objeleri belirtilen pozisyona hareket ettirmeyi sağlar.  Eğer kinematic özelliği kapalıysa yavaşça hareket ettirmek yerine objeyi belirtilen konuma ışınlar.

//objeyi sağa doğru sabit hızla hareket ettirir.
Rigidbody rb;
 void Start()
    {
        rb = GetComponent<Rigidbody>();

        // Moves the GameObject using it's transform.
        rb.isKinematic = true;
    }
void FixedUpdate()
    {
        rb.MovePosition(transform.position + transform.right * Time.fixedDeltaTime);
    }


MoveRotation (): Objenin rotasyon değerini ayarlamaya yardımcı olan fonksiyondur. Eğer rigidbody kinematic özelliği açık ise yavaşça, kapalı ise aniden belirtilen rotasyon değerine geçilir.

Rigidbody rb;
Vector3 rotasyonDegisim;
 void Start()
    {
        rb = GetComponent<Rigidbody>();
rotasyonDegisim=new Vector3(1,0,0);
    }
void FixedUpdate()
    {
 Quaternion rotasyonCarpani= Quaternion.Euler(rotasyonDegisim * Time.deltaTime);
        rb.MoveRotation(transform.position + transform.right * Time.fixedDeltaTime);
    }

ResetCenterOfMass (): Ağırlık merkezinin objenin sahip olduğu collider bileşenlerine göre tekrar hesaplayıp resetleyen fonksiyondur.

SetDensity(): Float tipinde değişken alır ve objenin yoğunluğunu ayarlamamızı sağlar. Objenin sahip olduğu collider baz alınarak verilen yoğunluğu elde etmek için ağırlık (mass) değerini hesaplar ve günceller.

Sleep (): Rigidbody bileşenini uyku moduna zorlar. 

SweepTest (): Obje verilen pozisyonda ilerlerse sahnede herhangi bir objeyle çarpışma, temas yaşar mı durumunu kontrol etmemizi sağlayan fonksiyondur.

//verilen temas kontrol mesafesini kullanarak objenin ileri yönünü kontrol işlemi gerçekleştirir
// eğer bir objeye çarpma durumu oluşacaksa log ekranına çarpışmaya/ ne kadar mesafe kaldığı yazdırılır.
public float temasKontrolMesafesi;
    public Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    void Update()
    {
        RaycastHit temas;
        if (rb.SweepTest(transform.forward, out temas, temasKontrolMesafesi))
        {
	Debug.Log(“Çarpışmaya kalan mesafe”+ temas.distance);
        }
    }

SweepTestAll (): Bu fonksiyonda SweepTest gibi çalışır ancak bir farkı vardır, SweepTest tek bir objeyle teması algıladığı anda dururken, SweepTestAll verilen mesafede çarpışılabilecek, temas edilebilecek bütün objeleri döndürür.

//Objenin önünde verilen mesafede bulunan obje sayısını log ekranına yazdırır.
public float temasKontrolMesafesi;
    public Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        RaycastHit[] temaslar=rb.SweepTestAll(transform.forward, temasKontrolMesafesi);
	Debug.Log(“Objenin önünde ”+ temaslar.Count()+” adet çarpışabileceği obje bulunuyor”);
    }

WakeUp (): Objeyi uyku modundan çıkmaya, tekrar çalışmaya başlamaya zorlar, geçirir.

Evet, bu şekilde Unity Rigidbody Nedir? sorusunu ingilizce Unity Rigidbody dökümanından da yararlanarak olabildiğince cevaplamaya çalıştım. Umarım işinize yarar bir kaynak oluşmuştur. Gelecek yazılarda görüşmek dileğiyle, kendinize iyi bakın.

2 YORUMLAR

CEVAP VER

Buraya yorumunuzu ekleyin
Buraya adınızı girin