Unity Rigidbody ile Nesneyi Hareket Ettirmek
Merhaba, bir önceki yazımında bir nesneyi nasıl hareket ettirebileceğimizi göstermiştim ve birlikte uygulamıştık.Diğer yazıda bildiğiniz gibi Translate yöntemini kullanmıştık.Bu dersimizde ise yine aynı konuyu, bu sefer farklı bir yol kullanarak işleyeceğiz.Yine aynı proje üzerinden anlatacağım için, kullanacağım nesnelerde herhangi bir değişiklik olmayacaktır.Eğer bu yazıyı ilk kez okuyorsanız, önce bir önceki yazıda oluşturduğumuz sahneyi hazırlayın ve tekrar bu yazıya geri dönün.Çünkü aynı şeyleri tekrar tekrar anlatıp yazıyı uzatmak istemiyorum.
Arasındaki farklar.
Öncelikle bu yöntemde bir takım farklılıklar mevcut.Biz nesnemizi Rigidbody ile yani bir fizik kuvveti uygulayarak hareket ettirmek istiyorsak, mutlaka nesnemizde Rigidbody bileşininin olması gerekiyor.Aksi taktirde hata alacağız.Hemen ekleyelim.Hareket ettireceğim nesnenin üzerine tıklıyoruz.Sağ taraftaki Inspector penceresinde en alta iniyoruz ve “Add Component” butonunu tıklıyoruz.Açılan pencerede arama kısmını, Rigidbody yazıyoruz ve klavyeden enter tuşu yada farenin sol tuşu ile nesnemize ekliyoruz.Artık nesnemiz üzerinde fizik gerektiren işlemler uygulayabiliriz.Şimdi C# scriptimiz açalım ve kod yazmaya başlayalım.
Fonksiyonların görevleri.
Editöre baktığım zaman diğer dersteki Translate yönteminde kullandığımız kodların olduğunu görüyoruz.Bunları silebilir yada gizleyebilirim.Ben işimi yaramayan kısımları sileceğim fakat nasıl gizlendiğini daha doğrusu projeyi başlattığımız zaman, bu kodların nasıl göz ardı edildiğini de göstereyim.Çok basit, gizlemek istediğimiz kodun başına iki kere “//” yazarsak o satırda bulunan kodların renginin değiştiğini göreceksiniz.İşte bu kadar.O zaman konumuza devam edelim.
Şimdi ben sileceğimi söylemiştim.Editörde sadece Update() fonksiyonu içinde bulunan Translate kodlarını siliyorum.Çünkü bu noktada onlarla bir işim yok.Geri kalan kodlar işimize yarayacağı için duruyor.Artık kodlarımızı yazmaya başlayalım.İlk olarak, nesnemize Rigidbody bileşenini eklemiştik.Bu bileşeni kodlarımızda kullanabilmek için, başlangıçta tanıtmamız gerekiyor.Çok basit bir işlem, hemen tanıtalım.
private Rigidbody fizik;
Start() fonksiyonumdan hemen önce değişkenimi tanımlıyorum.Koda bakacak olursak, daha önce public kullanımını ve hangi amaçla kullanıldığını anlatmıştım.Buradaki private ise tam tersi için kullanılıyor.Yani başka bir script dosyasında ben bu değişkeni kullanamayacağım ve Inspector penceresine baktığımız zaman bu değişkeni göremeyeceğiz.
Bunu public yaparak kullanabilirsiniz ancak şu aşamadaki bir projede gerek yok (Vazgeçtim.Siz public yapın ve projeyi başlatmadan önce ve sonrasındaki değişikliği gözlemleyin.Çünkü birazdan yazacağımız kodlar ile bu değişkeni otomatik dolduracağız.).Daha sonra değişkenimizin bir Rigidbody olduğunu belirtiyoruz ve bir isim yazıyoruz.Şimdi bu değişkeni şu an boş bir biçimde duruyor.Buna Rigidbody bileşenini eklememiz gerekiyor.Bunu yapmak içinde,
fizik = GetComponent<Rigidbody> ();
Start() fonksiyonumuzun içine, bu kodu yazıyoruz.Bu şekilde nesnemizde bulunan Rigidbody bileşenini (buradaki GetComponent kodu kısaca, scriptin eklendiği nesnedeki Rigidbody bileşenini çek demek oluyor.), proje başlatıldığı zaman otomatik olarak çekiyor.Bunu sürükle bırak yolu ile de yapabilirdik fakat projemiz ilerlediği zaman sahnemizde birçok nesne olacaktır.
Bunları bir süre sonra kontrol edemeyeceğiz ve karışıklıklar başlayacaktır.Bu yöntemle üzerimizdeki yükü biraz daha hafiflettiğimizi söyleyebilirim.Şimdi Rigidbody bileşenimiz artık fizik değişkenimize tanımlandığına göre hareket ettirmek için gerekli kodları yazmaya başlayalım.
float NesneninDikeyHareketi = Input.GetAxis ("Vertical"); float NesneninYatayHareketi = Input.GetAxis ("Horizontal");
Update() fonksiyonumuzun içine bu kodları yazıyoruz.Bir önceki yazıdan bu kodlara aşinasınız.Kısaca, iki adet float değişkeni oluşturuyorum.Neden float derseniz hemen açıklayayım.Hem yatay hemde dikey eksen için konuşuyorum.Biz tuşa bastığımız zaman, örnek olarak burada W tuşuna basalım.Dikey bir hareket olduğun için, Input.GetAxis (“Vertical”) kodu 0’dan büyük olacaktır.
Elimizi W tuşundan çekip S tuşuna basarsak ise Input.GetAxis (“Vertical”) kodu bu sefer 0’dan küçük olacaktır.İşte bu aradaki değerleri almak ve projemizin hata vermemesi için float türünde tanımlamamız gerekiyor.Eğer kafanız karıştıysa hiç sorun değil.İleride bu konuya özel bir yazı gelecektir.Kod yazmaya devam edelim.
Vector3 NesneninYeniPozisyonu = new Vector3(NesneninYatayHareketi, 0, NesneninDikeyHareketi);
Evet bu kodumuzda ise, nesnemizin hareket ederken ki pozisyonunu tutuyoruz.Buradaki Vector3 kodu parantez içinde (x, y, z) olarak parametre alıyor.Biz bu projede sadece x ve z eksenleri kullandığımız için y eksenimizi 0 olarak belirttik.Eşittirden sonraki new Vector3 tanımı ise, yeni bir pozisyon belirlediğimiz için kullanıyoruz.Artık nesnemizi hareket ettirecek kodumuzu yapmaya başlayalım.
fizik.AddForce (NesneninYeniPozisyonu*NesneHizi);
Bu kodu inceleyelim.Başta fizik nesnemizi tanımlamıştık.Artık onu kullanabiliyoruz.Burdaki addforce önemli bir kod.Çünkü addforce kodunun türkçesi olarak, kuvvet kelimesini kullanabiliriz.Bunun birde velocity türü var.Tür demek ne kadar doğru bilmiyorum ama bununda türkçesi hız olabilir.İkisi arasındaki farkı örneklendirirsek daha iyi olacak.Tuşa bastığımız zaman addforce yavaşça hızını arttırken, velocity ise direk belirlemiş olduğunuz hıza ulaşıyor.Bun iki kodun kullanımı projeye göre değişiklik gösterebilir.
Biz bu projede ilk yani addforce kodunu kullanacağız.Parantez içinde ise, nesnenin o anki pozisyonu ile nesneye belirlemiş olduğumuz hızı çarparak hareketi elde etmiş oluyoruz.Kodlarımızı yazdık ve projemizi çalıştırmaya hazırız.Hadi nasıl olmuş bakalım.İlk göze çarpan, bir kuvvet oluşturmak için hızımızın yetersiz kaldığıdır.Hızımızı 20 olarak ayarlıyoruz.Daha sonra, istediğimiz yönün tersine hareket ettiğini görüyoruz.Bunu geçen dersimizde nasıl düzelteceğimizi görmüştük.Burada da, aynı işlemi uyguluyoruz.NesneninYatayHareketi, ve NesneninDikeyHareketi kodlarımızın başına “-” işaretini ekliyoruz.
Dikkat etmemiz gerekenler.
Yalnız dikkat etmemiz gereken bir nokta daha var.Biz nesnemizi hareket ettirirken aynı zamanda gitmek istediğimiz yönde takla attığını görüyoruz.Bunu engellemek için, nesnemizin üstüne tıklayalım ve Inspector penceresinde Rigidbody bileşenimizin altındaki Constraints (türkçe olarak, kısıtlamalar diyebiliriz.), sekmesini açıyoruz.Bu bölümde iki tür kısıtlama mevcut.Bunlardan biri position yani hareket edeceğimiz ekseni engellemesi için, diğeride rotation yani o eksendeki dönüşü engellemek için.Bu projede bize dönüşü engellemek lazım olduğundan, Freeze Rotation kısmından x ve z ekseni aktif ediyoruz.Böylelikle x ve z ekseninde bir dönüş gerçekleşmeyecektir.
Artık istediğimiz gibi hareket ediyor.Tuştan elimiz çektiğimizde nesnemizin direk durmadığını farketmişsinizdir.Bu Rigidbody ile sağlanan bir özellik.Nesnemiz hızını belirli bir sürtünme kuvveti ile durduruyor.Kısaca drag özelliği diyebiliriz.Bu konuyu başka bir yazıda anlatırım.Şimdilik dersimiz tamamlanmış oldu.İki yöntem arasındaki farkı da böylelikle anladığınızı sanıyorum.Bir sonraki yazıda görüşmek üzere..