Merhaba, bu yazıda Unity’de bulunan farklı özellikteki hareket yöntemlerinden bahsedeceğiz. İlk olarak Transform sınıfı kullanarak başlayalım.
Transform ile hareket
Transform yöntemi kare başına belli bir hareket içerir. Fizik sistemini yok sayar. Amacı objeyi her karede verilen birim kadar ışınlamaktır. Tabii bunu pratikte uygularsanız göze hiç ışınlanma gibi gelmeyeceğini görebilirsiniz.
Transform.position
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
transform.position += new Vector3(0, 0, 1);
}
}
Burada her W tuşuna bastığımızda objenin z ekseninde 1 birim ilerlemesini istiyoruz. Vector değerlerini değiştirerek farklı doğrultular elde edebilirsiniz. Ama burda bir sorun var gibi ? Hareket göz açıp kapayana kadar ve sert bir şekilde gerçekleşiyor. Bunu nasıl yumuşatabiliriz ? Cevap altta .)
void Update()
{
if (Input.GetKey(KeyCode.W))
{
transform.position += new Vector3(0, 0, 1)*Time.deltaTime;
}
}
Burada GetKeyDown’u GetKey olarak değiştirdim ki tuşa basılı tuttuğumuzda çalışsın.
İlk örnekten tek farkı sonunda Time.deltaTime eklemek oldu. Eğer time.deltaTime ne demek bilmiyorsanız sizi bu adrese alalım. Bu şekilde hep eşit miktarda ve pozisyon işlemini zamana atadığımız için daha yumuşak bir hareket sağlayacağız.
Eğer hareket hızı istediğiniz gibi değilse kod sonuna / veya * speed diyerek farklı bir değişkenle çarpıp istediğiniz sonucu elde edebilirsiniz.
void Update()
{
if (Input.GetKey(KeyCode.W))
{
transform.position += new Vector3(0, 0, 1)*Time.deltaTime*speed;
}
}
Transform.Translate
Translate yönteminin position’dan farkı harekete objenin yerel eksenini dikkate almasıdır. Örneğin y açısı 45 derece olan bir obje düşünelim. Bu objede alttaki kodu yazarsanız açılı olduğu yönün forward tayinini yapıp o doğrultuda hareket edecektir.
if (Input.GetKey(KeyCode.A))
{
transform.Translate(Vector3.forward*Time.deltaTime);
}
Eğer harekete kendi durumunu katmasın istiyorsanız Translate fonksiyonunun sizin için üçüncü bir parametresi var.
transform.Translate(Vector3.forward*Time.deltaTime,Space.World);
transform.Translate(Vector3.forward*Time.deltaTime,Space.Self);
Üçüncü parametreye Space.World verirseniz dünya düzlemine göre hareket edip kendi local durumunu yok sayar, eğer Space.Self verirseniz hareket işlemlerine kendi yerel eksenini göz önünde bulundurarak devam eder. Üçüncü parametreyi vermezseniz kendisi otomatik Space.Self olarak atar. Daha iyi anlaşılması için bir görsel bırakıyorum.


Rigidbody İle Hareket
Rigidbody ile hareket fizik sistemini devreye sokar. Nesnenin katı gövdesini hareket ettirir. Daha doğal hareketler sağlanır. Cisime hareket uygulamayı kestiğinizde aynı gerçek dünyadaki gibi sürtünme vb. kuvvetlerin etkisine girerek yavaş yavaş hareketi durur. Hareket aşamasında pek çok parametreye dahil olabilirsiniz. Son olarak Transform hareketine göre çok daha sorunsuz ve eğer fiziksel etkileşime sahip bir obje ise çok daha performanslıdır. Aşağıdaki görselde ms değerlerinin karşılaştırılmasını görüyorsunuz

Rigidbody.AddForce
Bir cisme kuvvet vermek için kullanılır. Arabanın gaz pedalına basmak gibi düşünebilirsiniz. Yavaşça harekete başlayıp hızlanır ve yumuşak şekilde yavaşlayarak harekete son verir. Bunu silah mermilerinde, particle’larda veya yıkılacak olan bir binada kullanabilirsiniz.
private void AddForce()
{
m_Rigidbody.AddForce(Vector3.up * Time.deltaTime);
}
Rigidbody.Velocity
Objeye sürekli aynı hızı ekleyerek öteler, fiziksel etkileşimlere izin verir ve adeta bir objeyi iple çekermiş hissiyatı verir. Örneğin sahnenizde bir küp objesini bu şekilde hareket ettirmeyi deneyin ve nasıl tepetaklak hareket ettiğini görün.
void Update()
{
Vector3 m_Input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
rigidbody.velocity = m_Input * speed;
}
Rigidbody.MovePositions
Velocity ile yuvarlanarak hareket etmesi haricinde diğer özellikleri benzer denilebilir. Daha pürüzsüz bir hareket sağlar. Burada farklı olarak objenin kendi pozisyonu + input dedik buna dikkat edelim.
void Update()
{
Vector3 input = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
rigidbody.MovePosition(transform.position + input * Time.deltaTime * speed);
}