Unity 2D Karakter & Obje Hareket Sistemi (Transform Translate)


Merhaba arkadaşlar bu yazımda sizlere Unity ile 2 boyutlu bir oyun yaparken karakteri veya objeleri nasıl hareket ettirebileceğimizden bahsedeceğim, ardından da nasıl tuşlar ile bu hareketleri gerçekleştirilebileceğinden bahsedeceğim hadi lafı uzatmadan gelin yazımıza geçelim.


Objeleri Nasıl Hareket Ettirebiliriz ?

Aslında bunu anlatmadan önce ufak bir açıklamada bulunayım Unity de karakteri hareket ettirebilmek için çok fazla yöntem bulunuyor ama bu yazıda Translate komu ile hareket ettirmeyi açıkayacağım ilerleyen zamanlarda farklı komutlar ile de hareket ettirmeyi anlatacağım ve bunlar arasındaki farklardan da bahsedeceğim.

Burada kullacağımız komut "transform.Translate(x,y,z);" bu ne demek oluyor Translate komutu ile karakterimizin konumunu değiştirebiliyoruz. Translate ile geçerli evrensel konumu üzerinden hesaplamalar yapmamıza olanak sağlanıyor, böylelikle hatalar ile daha az karşılaşmış oluyoruz.

komutu kullanmadan önce bilmemiz gerekenler;

  • x,y ve z eksenlerinin nereler olduğunu bilmemiz gerekiyor.(X sağ ve sol , Y dikey ve düşey, Z ise derinlik.)
  • Time.DeltaTime ne işe yarar ? bunu bilmemiz gerekiyor çünkü kullandığımız komutta bunu kullanıyoruz ve bir şeyleri tam bilmeden eksik bilerek anlamanız, mantığını kavramanız zorlaşabilir.

Şimdi bir script oluşturun ve adını "karakter_hareket" yapın.


İçerisinde bir fonksiyon oluşturun ve fonksiyonun adını da "karakterHareket" yapın.


Şimdi artık burada kodlarımızı yazacağız. İlk olarak bir hareket hızı belirleyelim float olarak

float hareket_hizi = 5f;

olarak belirliyorum hareket hızımı.
Şimdi bu hareket komutunun sadece scriptin bulunduğu objede çalışmasını istediğim için this komutu ile hareket komutumu yazacağım.

this.transform.Translate(0,0,0);

Şeklinde komutumuzu yazıyoruz artık yapmamız gereken tek şey 0,0,0 ları hareket etmesini istediğimiz yön doğrultusunda hareket hızı ile değiştirmek ve Time.DeltaTime ile çarpmak olacaktır.

Not : Time.DeltaTime ile çarpma sebebimiz bilgisayar kassa ve takılsa bile sabit oranda hareket etmesini ve eşit yol almasını sağlamak.

Sağa hareket etmesini istiyorsak.

this.transform.Translate(hareket_hizi * Time.deltaTime,0,0);


x ekseninde sürekli sağ tarafa doğru ilerlemesini sağlıyoruz, saniyede 5 birim sağa doğru gidiyor tarzında düşünebilirsiniz, eğer sola gitmesini isteseydiniz yapmanız gereken tek şey "hareket_hizi" kısmını - yapmak olacaktır.

this.transform.Translate(-(hareket_hizi * Time.deltaTime),0,0);


Sağa ve sola bu şekilde hareket ettirebilirsiniz tabi bu fonkiyonu herhangi bir upload fonksiyonunun içinde çağırmayı unutmamanız gerekiyor.

Objeyi sabit olarak sola hareket ettirmek için yazdığımız kodun bütün kodları

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

public class karakter_hareket : MonoBehaviour
{

    void Update()
    {
        karakterHareket();
    }

    void karakterHareket()
    {
        float hareket_hizi = 5f;
        this.transform.Translate(-(hareket_hizi * Time.deltaTime),0,0);
    }
}


Tıklanan Butonlara Göre Objeyi Hareket Ettirme

Bir objeyi nasıl sabit olarak hareket ettirebileceğimizi öğrendik şimdi gelin bunu biraz daha değiştirip nasıl kullanıcının istediği yöne göre hareket ettirebileceğimizden bahsedelim.

Nasıl yapcağımızdan biraz bahsedeyim, aslında yapacağımız şey çok basit..
İlk olarak gitmesini istediğimiz yönler için kodları yazacağız ve ardından da if ve else kullanarak bu kodları kullanıcının tıkladığı butonlara göre hareket ettireceğiz.

Kullanıcın tıkladığı butonu algılamak için Input.GetKey, GetKeyDown, GetKeyUp gibi komutlar kullanıyoruz ve kullanıcının tıkladığı butonu istediğimiz butona eşitleyip komutu çalıştırıyoruz.
Biz basılı kaldığı süre boyunca çalışmasını istediğimiz için GetKey kullanacağız.

GetKey : Basılı kaldığı sürece çalışır. (Sürekli)
GetKeyDown : Basıldığı zaman çalışır. (1 kere)
GetKeyUp : Klavye tuşundan parmak çekildiği zaman çalışır. (1 kere)

Şimdi genel olarak kodda bulunan komutların hangisinin ne işe yaradığından bahsettiğimize göre kodlarımızı atabiliriz.

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

public class karakter_hareket : MonoBehaviour
{

    void Update()
    {
        karakterHareket();
    }

    void karakterHareket()
    {
        float hareket_hizi = 5f;

        if (Input.GetKey(KeyCode.A))
        {
            // A tuşuna tıklandığı zaman yapılacak işlemler.
            this.transform.Translate(-(hareket_hizi * Time.deltaTime),0,0);
            // Karakterin sola doğru gitmesini sağladık.
        }else if (Input.GetKey(KeyCode.D))
        {
                // D tuşuna tıklandığı zaman yapılacak işlemler.
                this.transform.Translate(hareket_hizi * Time.deltaTime, 0, 0);
                // Karakterin sağa doğru gitmesini sağladık.
        }
        else if (Input.GetKey(KeyCode.W))
        {
            // W tuşuna tıklandığı zaman yapılacak işlemler.
            this.transform.Translate(0, hareket_hizi * Time.deltaTime, 0);
            // Karakterin yukarı doğru gitmesini sağladık.
        }
        else if (Input.GetKey(KeyCode.S))
        {
            // S tuşuna tıklandığı zaman yapılacak işlemler.
            this.transform.Translate(0, -(hareket_hizi * Time.deltaTime), 0);
            // Karakterin aşağı doğru gitmesini sağladık.
        }
    }
}


Burada en önemli nokta x y ve z eksenlerini karıştırmamanız ve onlar doğrultusunda hareket komutlarını kullanabiliyor olmanız.