Unity Küp Yuvarlama

Unity Küp Yuvarlama


Unity Küp Yuvarlama

 Hepinize merhaba arkadaşlar yeni bir Unity dersi ile tekrardan karşınızdayım bu gün ki videomda sizlere Unity de bir küpü nasıl yuvarlayabileceğinizi, bir obje içerisindeki pivot adreslerinin konumlarını değiştirerek nasıl döndürebileceğinizi anlatmaya çalışacağım..

Küp Yuvarlama Aşama 1 - Sahnenin Hazırlanması

İlk olarak sahnemizi hazırlayalım, birbiri ile aynı boyutta olan 9 adet küp ile yuvarlayacağım küp için bir zemin hazırlıyorum, zemin ile aynı boyutta bir küpü de karakter olarak belirliyorum. İnternetten bulduğum 2D kare görsellerini zemin küplerime ve karakterime atıyorum ki hangisinin hangisi olduğu belli olsun.

Unity Küp Yuvarlama Sahne

Sahneme koyduğum hep küp Unity için 1Br büyüklüğe sahip.

Ek olarak söylemem gerekir ise şu an için ne zemin küpüme ne de karakter küpüme 2d görseller hariç herhangi bir özellik atamasında bulunmadım. (Rigidbody gibi) 

Eğer ki bir fiziksel özellik vermek isterseniz karakter küpünüze rigidbody üzerinden freeze rotation ve position yapmaz iseniz sorunlar ile karşılaşabilirsiniz.

Küp Yuvarlama Aşama 2 - Küpü Döndürme Mantığının Kavranması

Şimdi küpümüzü nasıl yuvarlayacağımızı kavramadan direkt olarak küpümüzü döndürmeye kalkışırsak sorunlar ile karışılacağımız ve temelimiz sağlam olmadığı için de sürekli hatalara çözüm üretme peşinde olacağımız için ilk olarak nasıl bir yol izlemeliyiz bunu bir anlayalım.

3D objelerde pivot noktası dediğimiz bir nokta vardır ve bu genel olarak objenin tam ortasında yer alır. Objeler dönme işlemi yaparken bu pivot noktalarını baz alarak dönerler.

Gelin size bu pivot noktasının ortada olduğunda dönme işlemini ufak bir video ile göstereyim.



Gördüğünüz gibi pivot noktası merkezde olduğu için sürekli olarak orta taraf baz alınarak dönüyor, biz buradaki pivot noktalarını köşelere getirerek küpümüzün istediği yöne doğru gitmesini sağlayacağız.

Bu pivot noktasını köşeye aldığımızda ne olacağını daha iyi anlamanız için yeni bir küp ekleyeyim ve sizlere en basit hali ile anlatmaya çalışayım.

Yeni bir küp oluşturup karakter küpümün dönmesini istediğim yöne getirdim ve karakter küpümü yeni oluşturduğum daha küçük küpün içine atıp sonrasında küçük küpü döndürdüğüm zaman pivot noktamdan karakter küpüm de dönme hareketi gerçekleştirmiş oldu.



Gördüğünüz gibi küpümüz tam istediğimiz yöne doğru dönüyor ve hareket etmiş oluyor, işte bu hareketi yani pivot noktası belirlemeyi böyle bir küp ile yapmak yerine kodlarımızda karakter küpümüz için yapacak ve oldukça kolaya indirgeyeceğiz

Küp Yuvarlama Aşama 3 - Kodların Yazılması

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class kupYuvarla : MonoBehaviour
{
    #region Değişkenler
    public float donmeHizi; // Kaç adımda döneceğini hesaplamak için kullandığımız değişken.
    bool donmeKontrol = false; // Küpümüz dönerken kullanıcı tarafından tekrar döndürülmesini engellemek amacı ile oluşturduğumuz değişken.
    #endregion

    #region Unity Fonksiyonları
    void Update()
    {
        KupDondurTusKontrol(); // Burada Küpümüzü döndürmek için yazdığımız fonksiyonumuzu çağırıyoruz.
    }
    #endregion

    #region Küp Döndürme Amacı İle Yazdığımız Fonksiyonlar
    void KupDondurTusKontrol() // Küpümüzün dönmesi için hangi tuşlara basılacağını kontrol ettiğimiz fonksiyonumuzu yazıyoruz.
    {
        if (donmeKontrol) // Küpümüzün dönüp dönmediğini kontrol ediyoruz.
        {
            return; // Eğer küpümüz dönüyorsa buradan sonraki kodların çalışmamasını sağlıyoruz.
        }
        else // Küpümüz dönmüyorsa olacak kodları buranın altına yazdık
        {
            Vector3 _kupKonum = transform.position; // Küpümüzün geçerli konumunu aldık
            if (Input.GetKeyDown(KeyCode.W)) // W tuşuna basıldığı zaman yapılacakları yazıyoruz.
            {
                donmeKontrol = true; // Küp dönmesini doğru konumuna getirdik
                StartCoroutine(KupDondur(_kupKonum + new Vector3(0, -0.5f, 0.5f), Vector3.right)); // Küpümüzün konumuna göre pivot noktamızı değiştirdik, sağa doğru dönmesi için komut girdik.
            }else if (Input.GetKeyDown(KeyCode.S)) // S tuşuna basıldığı zaman yapılacakları yazıyoruz.
            {
                donmeKontrol = true; // Küp dönmesini doğru konumuna getirdik
                StartCoroutine(KupDondur(_kupKonum + new Vector3(0, -0.5f, -0.5f), Vector3.left));  // Küpümüzün konumuna göre pivot noktamızı değiştirdik, sola doğru dönmesi için komut girdik.
            }
            else if (Input.GetKeyDown(KeyCode.A))
            {
                donmeKontrol = true; // Küp dönmesini doğru konumuna getirdik
                StartCoroutine(KupDondur(_kupKonum + new Vector3(-0.5f, -0.5f, 0), Vector3.forward));  // Küpümüzün konumuna göre pivot noktamızı değiştirdik, yukarı doğru dönmesi için komut girdik.
            }
            else if (Input.GetKeyDown(KeyCode.D))
            {
                donmeKontrol = true; // Küp dönmesini doğru konumuna getirdik
                StartCoroutine(KupDondur(_kupKonum + new Vector3(0.5f, -0.5f, 0), Vector3.back));  // Küpümüzün konumuna göre pivot noktamızı değiştirdik, arkaya doğru dönmesi için komut girdik.
            }
        }



    }

    IEnumerator KupDondur(Vector3 pivotNoktasi, Vector3 _vector) // Küpümüzü hareket ederken IEnumerator kullanıyoruz, bu sayede daha pürüzsüz bir dönüş sağlıyoruz, direkt dönmesini engelliyoruz.
    {
        // Dönme açısını 90 olarak alıp donme hızına bölüyoruz ve for ile bunu eşitliyoruz.
        for (int i = 0; i < (90 / donmeHizi); i++)
        {
            this.transform.RotateAround(pivotNoktasi, _vector, donmeHizi); // Küpümüze dönme işlemini burada gerçekleştiriyoruz.
            yield return new WaitForSeconds(0.001f); // Burada küpümüzün dönerkenki açılarda ne kadar süre bekleyeceğini giriyoruz.
        }
        // Burada küpümüz dönerken 0,99999 gibi bir konumda kalabiliyor bunu düzenlemek için yeni konum adında bir Vector3 oluşturuyor ve bu 0,9999 olan konumu yazdığımız fonksiyon ile düzenleyip en yakın tam sayıya dönüştürüyoruz.
        Vector3 _yeniKonum = new Vector3(TamSayiyaDonustur((double)transform.position.x), TamSayiyaDonustur((double)transform.position.y), TamSayiyaDonustur((double)transform.position.z));
        this.transform.position = _yeniKonum; // Küpümüzün konumunu bu yeni düzenlenmiş konumma getiriyoruz.
        donmeKontrol = false; // Dönme işleminin bittiğini söylüyoruz
        yield return null; // Burada gecikme vermeden kodların devam etmesini söylüyoruz.

    }
    #endregion

    #region Diğer Fonksiyonlar
    // Küpümüzün konumunu en yakın tam sayıya yuvarlamak için olan fonksiyonumuzu yazıyoruz.
    int TamSayiyaDonustur(double sayi){
        return Mathf.RoundToInt((float)sayi); // RoundToInt ile gelen 0,999 gibi sayıyı en yakın tam sayıya yuvarlıyoruz. Örnek vermek gerekir ise 0,999 = 1 veya 1,98989 gibi bir sayıyı 2 ye.
    }
    #endregion
}

Burada açıklamam gereken tek şey normalde karakterimiz z eksenine bağlı olarak sağ sol yaparken ve x ile dikey olarak ilerlerken burada tam tersi olarak giriyoruz eğer bunu yapmazsak karakterimiz yukarı ve aşağı gibi bir yön alabiliyor..

Not: Scripti yazdıktan sonra döndürmek istediğiniz küpe atmayı ve dönme hızı değerini girmeyi unutmayın ve bana kalırsa dönme hızını belirlerken 90 a tam bölünebilen sayılardan seçmeyi unutmayın, yoksa ufak sorunlar ile karşılaşabilirsiniz.

Yukarıdaki kodlarda ne ne işe yaradığı tam olarak anlatılıyor yorum satırları ile bu yüzden tekrardan burada açıklama yapmayacağım ama kodlar ile ilgili herhangi bir yerde takılırsanız aşağı tarafta yorum olarak yazabilirsiniz.

Küp Yuvarlama Aşama 4 - Sonuca Bakalım