Unity Karakter Hareket Ettirmek İçin Yöntemler ve Farkları

Unity Karakter Hareket Ettirmek İçin Yöntemler ve Farkları

Unity Karakter Hareket Sistemi Bütün Yöntemler

 Merhaba arkadaşlar bu yazımda sizlere Unity de bulunan karakterleri ve nesneleri hareket ettirmenize sağlayan komutları anlatacağım.

Hangi komutu ne gibi durumlarda kullanmalıyız gibi bir kaç ufak detayını da anlatmaya çalışacağım, iyi okumalar.

Input Manager

Unity Input Manager

Input Manager kullanıcının girdilerini bize veren algılama sistemidir, klavye, oyun kumandası gibi araçların hepsine teker teker kod yazarak algılamamız yerine Input Manager kullanarak daha kolay bir şekilde algılamamız bizim için daha verimlidir.

Input Manager her projeye otomatik olarak dahil olur ama üzerinde değişiklik yapmak isterseniz Unity içinden Edit > Project Settings > Input Manager kısmından dilediğiniz gibi düzenlemeler yapabilirsiniz.

Yönlerin Anlanması

İlk olarak bütün komutlara geçmeden önce sizlere 2 adet yöntem ile nasıl kullanıcıdan hangi yöne gittiğimizi bulabileceğimizi anlatacağım.

1) Klavye Tuşlarını Kontrol Etmek

Benim hiç tavsiye etmediğim yöntemlerden birisi olan yoldur ve if koşulları kullanılarak klavyeden basılan tuş anlaşıldıktan sonra yapılması gereken işlem / komut çalıştırılır.

        if(Input.GetKey(KeyCode.A)){
            komut
        }
        if(Input.GetKey(KeyCode.D)){
            komut
        }
        if(Input.GetKey(KeyCode.W)){
  			komut 
        }
        if(Input.GetKey(KeyCode.S)){
            komut
        }

Yukarıdaki komut ile hangi tuşa basıldığında hangi yöne gideceği belli olduğu için if kısmından sonra hemen yön kodlarını yazabiliriz ve karakterimiz o yöne doğru harekete geçer.

float hiz = 10;
        if(Input.GetKey(KeyCode.A)){
            transform.Translate(hiz * Time.deltaTime,0,0);
        }
        if(Input.GetKey(KeyCode.D)){
            transform.Translate(-hiz * Time.deltaTime,0,0);
        }
        if(Input.GetKey(KeyCode.W)){
            transform.Translate(0,0,hiz* Time.deltaTime);
            
        }
        if(Input.GetKey(KeyCode.S)){
            transform.Translate(0,0,-hiz* Time.deltaTime);

        }

Yukarıdaki işlem bana göre biraz fazla gereksiz kod satırı bulundurduğu için gereksiz bir yöntem olarak düşündüğüm bir yöntemdir.

2) Input Manager Kullanmak

Gerçekten kullanışlı bir yöntemdir ve oldukça az satır komut ile oldukça verim alabildiğimiz yazım biçimidir.

Bir adet Vector3 değişkeni tanımlanır ve içerisine Input Managerden gelen veriler yerleştirilir, Input manager eğer tanımlı tuşa basıldığını görürse +1 ve -1 gibi değerler alarak yönü belirtir size de sadece bu değeri hız ile çarparak karakterinizi hareketlendirmek kalır.

 Vector3 hareketYonleri;
        hareketYonleri = new Vector3(Input.GetAxis("Horizontal"), 0 , Input.GetAxis("Vertical"));
        transform.Translate(hareketYonleri.x * hiz * Time.deltaTime, 0, hareketYonleri.z * hiz * Time.deltaTime);

public hiz olarak bir değişken belirledim ve bu hız değişkenini daha sonrasında sahnemde değiştirerek karakterim için uygun olan hız değerini bulabiliriz.

Input Managerden gelen tuş bilgisine göre Vector3 değişkenindeki x ve z değerleri ile oynuyor +1 veya -1 almalarını sağlıyor buna göre de hız ile çarpınca hareket elde etmiş oluyoruz.

Horizontal yatay (sağ ve sol yön tuşları, a ve d harf tuşları ile kontrol edilir.) yönü temsil etmektedir.. 

Vertical dikey (dikey ve düşey yön tuşları, w ve s harf tuşları ile kontrol edilir.) yönü temsil etmektedir.

Hareket Ettirmek İçin Yöntemler

Aşağıdaki hareket yöntemlerini kullanırken yukarıdaki hareket yönünü anlamak için metotlardan Input Manageri kullanarak anlatacağım.
AddForce ve Velocity yöntemi için karakterimizde "Rigidbody" componenti ekli olması gerekmektedir.

Translate Yöntemi İle Hareketlendirmek

Karakterimizin o anki konumuna ekleme yaparak karakterin ilerlemesini sağlayan yöntemdir.
vektör 3 olarak hareket hızı belirlenir ve fonksiyon çağırılır.

 Vector3 hareketYonleri;
        hareketYonleri = new Vector3(Input.GetAxis("Horizontal"), 0 , Input.GetAxis("Vertical"));
        transform.Translate(hareketYonleri.x * hiz * Time.deltaTime, 0, hareketYonleri.z * hiz * Time.deltaTime);

Bu yöntem sürekli olarak pozisyonu güncellediğinden ötürü nesnelerin birbirinin içinden geçmesi gibi sorunlar ile karşılaşırsınız bu yüzden bunu sabit hareketi olan ve diğer nesneler ile temasta bulunmayan objeler ile kullanmak en doğru yöntem olacaktır, eğer bu yöntemi illaki kullanmak istiyorsanız nesneler ile olan çarpışma durumlarını kontrol etmeniz gerekecektir.

Position Kullanarak Hareketlendirmek

Translate ile aynı yöntemdir buradaki tek farklı yön karakterin mevcut konumunu da bizim eklememiz gerekiyor.
  Vector3 hareketYonleri;
        hareketYonleri = new Vector3(Input.GetAxis("Horizontal"), 0 , Input.GetAxis("Vertical"));
        transform.position = new Vector3(transform.position.x + hareketYonleri.x, transform.position.y , transform.position.z + hareketYonleri.z);

Translate ile aynı sorunlar bu yöntemde de bulunmaktadır.

AddForce Kullanarak Hareketlendirmek

Karaktere sürekli bir tork eklediğimiz yöntem gibi düşünebilirsiniz, Karakteri hareket ettirmek için kullanılabilir ama genel olarak çarpışma gibi durumlarda kullanılması gerekir.
Bu yöntemi  bir topa vurduğunuzda olan hareket gibi düşünebilirsiniz vurduğunuz ilk an hızlanır sonrasında hızını kaybederek yavaşlamaya başlar.
Tabi siz sürekli topa vurduğunuzu (Tuşa basılı tutmak) düşünürsek top belli bir zamandan sonra delirerek uçacaktır ve kontrolü zor olacaktır.

  Vector3 hareketYonleri;
        hareketYonleri = new Vector3(Input.GetAxis("Horizontal") * hiz * Time.deltaTime, 0 , Input.GetAxis("Vertical") * hiz * Time.deltaTime);
        karakterRB.AddForce(hareketYonleri, ForceMode.Impulse);

Genel olarak bu yöntemde nesnelerin içinden geçmek gibi sorun ile karşı karşıya kalmayız ama duvarın dibindeki bir karaktere sürekli olarak AddForce metodu uygularsanız bir noktadan sonra duvarın içinden geçeceğinden emin olabilirsiniz.

Bu arada 4 adet ForceMode a sahiptir AddForce modu bunları sizlere açıklamam gerekir ise;

Force : Cismin kütlesini kullanarak sürekli bir kuvvet uygular.
Acceleration : Cismin kütlesi göz ardı edilerek sürekli kuvvet uygulanır.
Impulse : Cismin kütlesi göz önünde bulundurularak anlık kuvvet uygulanır.
VelocityChange : Cismin kütlesi göz ardı edilerek anlık kuvvet uygulanır.

Velocity Kullanarak Hareketlendirmek

Genel olarak oyunlarda karakterleri zıplatmak ve hareketlendirmek için en çok kullandığımız yöntem Velocity dir.
Karakter istediğimiz şekilde hareket eder ve bir nesne ile karşılaştığı zaman genellikle içinden geçmez, tabi bunun istisna durumları yok değil.
Hareket hızını çok yüksek tutarsanız Velocity ile de nesnelerin içinden geçmek mümkündür.

        Vector3 hareketYonleri;
        hareketYonleri = new Vector3(Input.GetAxis("Horizontal") * hiz, 0 , Input.GetAxis("Vertical") * hiz);
        karakterRB.velocity = hareketYonleri;

Genel olarak karakterimizi hareketlendirmek için Velocity kullanırız.

Özet

Şimdi burada ne kadar çok işlem var hangisi ne için kullanacağız diye sorabiliyor ve aklınız karışmış olabilir bu yüzden bunları sizin için birazcık daha açıklayayım.

Translate ve position yöntemi genel olarak sabit ve karakter olmayan nesneleri hareketlendirmek için kullanılır.
AddForce genel olarak bir çarpışma sonucu savrulan nesneler veya ok, mermi gibi anlık bir hareket hızı ile başlayan ve daha sonrasında yavaşlayarak hareket eden nesneleri hareketlendirmek için kullanılır.
Velocity genel olarak kullanıcılar tarafından hareket ettirilen nesneler için kullanılır..