Bu yazımızda Unity C# Temel Dersi ve Fizik ile Basit Hareket adlı videomuzu yazılı halde ilerleteceğiz. Yazının genelinde C# temel konularından bahseceğim ve adım adım bir küre (Sphere) nesnesini Unity’nin fizik altyapısı kullanarak basit hareket işlemlerini gerçekleştireceğiz. Biraz eski video olması sebebiyle dönüp bakmanızı çok öneresim gelmiyor ama merak edenler olursa buraya tıklayarak videoya gidebilirsiniz.

Öncelikle temel olarak sahnemizde neler olmalı bunlardan bahsedeyim. Eğer videoyu izlediyseniz rigidbody ile fizik işlemlerinden etkilenen birden fazla GameObject bulunuyor. Ancak 1 adet plane ve 1 adet küre objesinin olması bu ders için yeterli olacaktır. Bunları eklemek için Hieararchy paneline sağ tıklayıp açılan menüden seçerek işlemleri gerçekleştirebilirsiniz. GameObject hakkında daha detaylı bilgi edinmek için Unity – GameObject Nedir ? adlı yazımıza göz atabilirsiniz. 

Sahne içerisinde 1 adet plane ve 1 adet küre oluşturduktan sonra yapmamız gereken 2 şey var. İlki küre objesini seçip “Add Component” butonuna basarak rigidbody eklemek. Ardından tekrar aynı butona basıp “New Script” seçeneği ile bir C# dosyası oluşturmak. Bu dosya otomatik olarak objemize atanacaktır. Bunun ardından script dosyasına çift tıklayarak sahip olduğunuz kod düzenleme programı(VsCode, Visual Studio, XCode vb) üzerinde dosyamızı açalım.

Unity C# Temel

Karşımızdaki ekranda temel olarak Unity’nin bize sunduuğu hazır bir C# yapısı bulunuyor. Burada 2 adet fonksiyon göreceksiniz. Start fonksiyonu oyun başlangıç anında çalışırken Update fonksiyonu oyun çalıştığı sürece her an çağırılan bir fonksiyondur. Oyun saniyede kaç kare çalıştırabiliyorsa Update fonksiyonu da o kadar sık çağırılacaktır. Bu yüzden (benim videoda yaptığımın aksine ) fizik işlemlerini Update yerine FixedUpdate fonksiyonu içerisinde yapmak çok daha sağlıklı olacaktır. Basit işlemlerde çok farketmeyebilirsiniz ancak fizikten etkilenen objelerin sayısı arttıkça performansınıza etki etmeye başlayacaktır.

Bu bilgiler ardından, bilmeyenler için fonksiyon ve değişkenlerde bahsedeyim. Basitçe anlatmak gerekirse fonksiyonlar çağırdığımızda içerisinde bulunan kodları çalıştıran yapılardır. Bazen bir değer döndürebilirler. Ancak bu derste biz void tipini Hareket() adıyla bir fonksiyon tanımlayıp hareket işlemlerini bu fonksiyon içerisinde yapacağız. Void kullandığımız fonksiyonlar bize bir değer döndürmeyecektir. Şu anda da ihtiyacımız yok.

 Öte yandan değişkenler ise, içerisinde farklı tipte değerler tutan yapılardır, yani onları çağırdığımızda bize bir değer gönderirler. Bu değerler tam sayı (int), Ondalıklı Sayı (float) veya metin (string) olabilir. Noktalıklı sayıları yazarken dikkat etmemiz gereken şey sonlarına ‘f’ karakterini koymamız gerektiğidir. Örneğin : float ondalikli= 0.1f; gibi. Metin karakterleri de çift tırnak (“) içerisinde olmalıdır. Örneğin: string metin=”Karadot”; gibi. Bunlar dışında bu derste de kullanacağımız Vector3 gibi Unity’nin sağladığı değişkenler de bulunmaktadır. Bu tip değişkenler içerisinde 3 tane float değer tutar, x-y-z değerleri olarak. Daha çok pozisyon bilgisini tutmak için kullandığımız bir değişken tipidir. Ayrıca, bileşenler (Component) de birer değişken olarak tanımlanabilir. Bu sayede Rigidbody bileşenimizi bir değişkende tutup, üzerinde istediğimiz işlemi rahatlıkla gerçekleştirebiliriz.

Fizik ile Basit Hareket

Gerekli bilgileri size ilettikten sonra artık kodlama kısmına geçebilir ve küremizin fizik ile basit hareket elde etmesini sağlayabiliriz. Bunun için ilk yapacağımız şey Start fonksiyonun öncesinde rigidbody ve Vector3 değişkenlerimizi tanımlamamız gerekiyor. Ardından Start fonksiyonu içerisinde değişken atamasını yapacağız, yani objemizin üzerindeki Rigidbody bileşenine erişeceğiz. Aşağıdaki kod ile bunu gerçekleştirebiliriz.

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

Evet, rigidbody bileşenine erişmek bu kadar basit. Artık rgb değişkeni üzerinden istediğimiz işlemleri gerçekleştirebiliriz. Ve hareketin yönünü ve büyüklüğünü de hareketDegeri adlı değişken üzerinden sağlayacağız. Tabii ki hareketi kullanıcıdan yani bir kontrolcü aracılığı ile almamız gerekiyor ki, küreyi kontrol eden cidden biz olalım. Bu veriyi alabilmek için Input.GetAxis(); adlı fonksiyondan yararlanacağız. String tipinde bir değişken alan bu fonksiyon, verilen axis ismini alarak o axis ile bağlantılı tuşlara basılıp basılmadığını öğrenebiliriz. Bu fonksiyon -1 ve 1 arasında değerler döndürür. Örneğin, “A” ve “D” tuşları standart olarak “Horizontal” adlı axis için atanmıştır. “A” değerine bastığımızda -1, “D” değerine bastığımızda 1 değeri dönecektir. Bu sayede yatay(horizontal), yanlara doğru hareketler yapabiliriz. Şimdi bu bilgileri kullanarak hareket fonksiyonumuz oluşturalım. FixedUpdate fonsiyonu içerisinde Hareket fonksiyonunu çağırmayı unutmayın. 

   void FixedUpdate () {
        float horizontal = Input.GetAxis ("Horizontal");
        float vertical = Input.GetAxis ("Vertical");

        hareketDegeri = new Vector3 (horizontal, 0, vertical);
        Hareket (hareketDegeri);

    }
    void Hareket (Vector3 hareketDegeri) {
        rgb.velocity = hareketDegeri;
    }

Bu kodları ekledikten sonra, WASD tuşlarını kullanırsanız objeyi hareket ettirebileceğiniz görürsünüz. Ama bir şeyler yanlış gibi, öncelikle çok yavaş düşüyor, değil mi ? Ve kontrol de çok yavaş. Bunları gayet basit halledeceğiz ama nedenlerinden bahsetmek istiyorum öncelikle. Farkettiyseniz, Vector3 atamamızda 0 değeri verdiğimiz bir alan var, bu vector3 içerisindeki y değeri. Yani kooardinat sistemini düşünürsek dikey eksen, yani aşağı yukarı hareket. Biz bunu sürekli sıfırladığımız için hareket aşağı düşüşü sürekli duruyor ve tekrar yerçekimi tarafından biraz çekiliyor. Şayet Update içerisinde yaptıysanız bu fazlasıyla belli olacaktır. Bunu çözmenin yolu kolay, hareketDegeri.y=rgb.velocity.y; komutunu uygularsak her şey normal şekilde çalışacak. Öte yandan, kontrolün yavaş olmasının sebebi de tamamen verdiğimiz horizontal ve vertical değerleriyle alakalı. Daha önce bahsettiğim gibi, -1 ve 1 değeri değer alıyorlar, ki bu velocity değeri için az, hele kütlesi fazla olan karakterler için. Bu yüzden bu iki değer farklı bir sabit değerle, istediğimiz hız ile çarpmamız lazım. Şimdi kodu son hale getirelim ve güzelce küremizi hareket ettirelim.

    Rigidbody rgb;
    Vector3 hareketDegeri;
    float hiz=5;
    void Start () {
        rgb = GetComponent<Rigidbody> ();
    }
    void FixedUpdate () {
        float horizontal = Input.GetAxis ("Horizontal");
        float vertical = Input.GetAxis ("Vertical");

        hareketDegeri = new Vector3 (horizontal*hiz, 0, vertical*hiz);
        hareketDegeri.y=rgb.velocity.y;
        Hareket (hareketDegeri);
    }
    void Hareket (Vector3 hareketDegeri) {
        rgb.velocity = hareketDegeri;
    }

Bununla beraber artık Unity C# Temel Dersi ve Fizik ile Basit Hareket örneğimizi tamamlamış olduk. Fizik işlemleri hakkında biraz daha fazla bilgi edinmek isterseniz Unity – Rigidbody Nedir ? adlı yazımızı okuyabilirsiniz. Bir dahaki dersimizde görüşmek üzere, hoşçakalın.

CEVAP VER

Buraya yorumunuzu ekleyin
Buraya adınızı girin