
Unity’de Araba Tekerini Döndürmek (WheelCollider)
Merhaba, bir önceki yazımızda Unity‘de gece gündüz döngüsü yapmıştık.Böylelikle projelerinizde kullanabileceğiniz dinamik bir ışık kontrolünüz olmuş oluyordu.Bu projemizde ise daha önceki yazılarımda değinmiş olduğum, WheelCollider kullanımını bir model üzerinde uygulayacağız.Daha detaylı bilgi isteyenler önceki yazılarıma bakabilirler.Şimdi yeni bir proje oluşturalım ve yazımıza başlayalım.
Sahnemizin oluşturulması.
Bu projemizde kullanacağımız senaryo aslında belli.Bir araç modelimiz olacak ve bu modelin tekerleklerine uygulayacağımız bir takım işlemler sonucunda, araçlarda olduğu gibi hareket edecekler.Şimdi ilk olarak, ben garaja benzer bir mekan oluşturacağım.Eğer siz direk tekerler üzerindeki işlemlere geçmek istiyorsanız bu aşamaları atlayabilirsiniz.Şimdi, bir Plane nesnesi oluşturuyoruz.Bu nesne bizim zeminimizi oluşturacak.Daha sonra bir Cube nesnesi oluşturuyoruz.
Bu nesneden birkaç kopya oluşturuyoruz.Çünkü bu Cube nesnesi ile duvarlarımızı oluşturacağız.Scene penceresinde gerekli pozisyon ayarlamalarını yaptıktan sonra, yeni bir Cube nesnesi daha oluşturuyoruz.Bu projede aracımızı yol üzerinde hareket ettirmeyeceğiz.Amacımız sadece tekerleri hareket ettirmek.Bu yüzden, sahnemize eklemiş olduğumuz bu Cube nesnelerini kaldıraç olarak kullanacağız.Araç modelimizin tekerleklerini havada tutacak biçimde boyutlandırıyoruz.Sonra bu nesneden üç adet daha kopyalıyoruz.
Artık araç modelimizi sahnemize ekleyebiliriz.İnternetten bulduğumuz herhangi bir modeli, sahnemize ekliyoruz ve tam kaldıraçların üzerine konumlandırıyoruz.Şimdi WheelCollider kullanabilmemiz için, nesnemizin üzerinde Rigidbody bileşeninin olması gerekiyor.Bu önemli bir detay, aksi durumda yanlış eksende duran bir collider göreceksiniz.Rigidbody bileşenini araç modelimizin parent yani ebeveyn nesnesine ekliyoruz.Daha sonra, bir BoxCollider bileşeni ekliyoruz.Burası da önemli, çünkü katı bir cisim olması gerekiyor.Yoksa modelimizin içinden başka nesneler geçebilir.Evet sahnemiz hazır.Şimdi tekerlerimizi ayarlamaya geçelim.
Araba tekerlerine wheel collider eklenmesi.
Şimdi bir boş nesne oluşturuyoruz.Bunu Hierarchy penceresinde sağ tıklayarak, Create Empty seçimi ile yapabilirsiniz.Daha sonra bu nesneye bir isim veriyoruz.Bu nesne içerisinde dört tekerimiz için, dört adet boş nesne daha oluşturuyoruz.Bu nesnelerin her birine Inspector penceresinden WheelCollider bileşenini ekliyoruz.Daha sonra her bir teker için bu collider nesnelerini ayarlıyoruz.
Bir nevi kalıbına sokuyoruz.Bunu yaparken çemberimizin yarıçapını ayarlamak için WheelCollider bileşeninin içinde bulunan ayarlardan, “Radius” bölümü ile oynayabilirsiniz.Burada bir ipucu vereyim.Eğer ilk önce bir tarafın tekerlerini ayarlarsanız, diğer tarafa bu iki nesneyi kopyalayarak aynı hizada ve ölçüde dört collider nesneniz olmuş olur.
Örneğin önce sağ taraftaki ön ve arka tekerleri yapıp, daha sonra bu iki nesneyi kopyalayarak sol taraftaki tekerlere göre hizalandırabilirsiniz.Ayrıca WheelCollider bileşeninde bulunan diğer ayarlar ile oynayarak daha gerçekçi bir süspansiyon ve teker simule edebilirsiniz.Bu ayarların ne işe yaradıklarını önceki yazılarıma bakarak bulabilirsiniz.Şimdi devam edelim.
Tekerlerimiz için kullanacağımız kodları yazalım.
İlk olarak yeni bir C# Script dosyası oluşturuyoruz.Daha sonra bu script dosyasını sürükleyerek, araç modelimizin ana nesnesinin (ebeveyninin) üzerine bırakıyoruz.Şimdi editör ile açarak kodlarımızı yazmaya başlayalım.
public Transform OnSagTeker, ArkaSagTeker, OnSolTeker, ArkaSolTeker; public WheelCollider OnSagCollider, ArkaSagCollider, OnSolCollider, ArkaSolCollider; public float Tork = 1000f; public float MaxTekerAcisi = 35f;
Evet şimdi kullanacağımız değişkenleri oluşturalım.İlk satırda dört tetkerimizin pozisyonlarını tutmak için, bir Transform değişkeni oluşturuyoruz.İkinci satırda, bu sefer WheelCollider bileşeni eklediğimiz nesneleri kontrol edebilmek için bir değişken oluşturuyoruz.Üçüncü satırda, araç nesnemizin hızını kontrol edebilmek için float türünde bir değişken oluşturuyoruz.Bu değişkeni sadece araç tekerlerimizi hareket ettirmek için oluşturduk.Çünkü aracımız yerden yüksekte olduğu için biz kontrol etmeyeceğiz.Son satırda ise, ön tekerlerin dönüş açısını sınırlandırmak için, bir değişken oluşturuyoruz.
OnSagTeker = GameObject.Find ("OnSagTeker").transform; ArkaSagTeker = GameObject.Find ("ArkaSagTeker").transform; OnSolTeker = GameObject.Find ("OnSolTeker").transform; ArkaSolTeker = GameObject.Find ("ArkaSolTeker").transform; OnSagCollider = GameObject.Find ("OnSagCol").GetComponent<WheelCollider> (); ArkaSagCollider = GameObject.Find ("ArkaSagCol").GetComponent<WheelCollider> (); OnSolCollider = GameObject.Find ("OnSolCol").GetComponent<WheelCollider> (); ArkaSolCollider = GameObject.Find ("ArkaSolCol").GetComponent<WheelCollider> ();
Şimdi ise start() fonksiyonunun içerisine bu kodları yazıyoruz.Bu kodlar ile, kısaca nesneleri yerlerine otomatik bir şekilde eklemiş oluyoruz.İlk dört satırda dört tekerimizi ismine göre buluyoruz ve transform değerlerini, değişkenlerimize eşitliyoruz.Yine aynı şekilde altı ve dokuzuncu satırlar arasında, bu sefer oluşturduğumuz WheelCollider nesnelerini buluyoruz ve WheelCollider bileşenlerini oluşturmuş olduğumuz değişkenlerimize sırasıyla tanımlıyoruz.Bunu yapmak yerine, nesneleri sürükle bırak ile de yerlerine ekleyebilirsiniz.Ancak bu yöntem bana daha kolay geliyor.
float TekerinIleriGeriHareketi = Tork * Time.deltaTime; ArkaSagCollider.motorTorque = TekerinIleriGeriHareketi; ArkaSolCollider.motorTorque = TekerinIleriGeriHareketi;
Update() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda, yeni bir float türünde değişken oluşturuyoruz.Bu değişkende torkumuzu hesaplayacağız.Tabi aracın arka tekerlerini biz kontrol etmeyeceğimiz için, sadece Time.deltaTime fonksiyonu ile çarparak bırakıyoruz.İkinci ve üçüncü satırlarda, arka sağ ve sol tekerlerimizin collider değişkenlerini, motorTorque fonksiyonunu kullanarak döndürüyoruz.Bu dönüş hızını, ilk satırdaki değişkenimizden alarak ayarlıyoruz.
float TekerinSagaSolaHareketi = Input.GetAxis("Horizontal") * MaxTekerAcisi; OnSagCollider.steerAngle = TekerinSagaSolaHareketi; OnSolCollider.steerAngle = TekerinSagaSolaHareketi;
Kodlarımızı yazmaya devam ediyoruz.İlk satırda, float türünde bir değişken oluşturuyoruz.Bu değişken ile ön tekerlerin açısını kontrol edeceğiz.Bunu yapmak için GetAxis fonksiyonu ile yatay eksendeki hareketi alarak, belirlediğimiz maksimum teker açısı ile çarpıyoruz.Böylelikle, artı yada eksi olarak belirlediğimiz açıya geldiğinde tekerler dönmeye kesecektir.İkinci ve üçüncü satırlarda ise, steerAngle fonksiyonu ile tekerlerimizin collider nesnelerini döndürüyoruz.
OnSagTeker.Rotate (OnSagCollider.rpm/60*360*Time.deltaTime,0,0); OnSolTeker.Rotate (OnSolCollider.rpm/60*360*Time.deltaTime,0,0); ArkaSagTeker.Rotate (ArkaSagCollider.rpm/60*360*Time.deltaTime,0,0); ArkaSolTeker.Rotate (ArkaSolCollider.rpm/60*360*Time.deltaTime,0,0);
Bu yere kadar sadece tekerlerimiz için belirlediğimiz collider nesneleri dönüyordu.Şimdi ise, araç modelimizde bulunan tekerleri döndürmeye başlayalım.Dört satırda aynı işlevi yerine getirdiği için sadece birini açıklayacağım.İlk satıra bakacak olursak, Rotate fonksiyonu ile ön sağ tarafta bulunan teker nesnemizi döndürüyoruz.Bunu yaparken parantez içinde neler olup bittiğine bir bakalım.
İlk olarak, ön sağ teker için oluşturduğumuz collider nesnesi için dakikadaki tur sayısını hesaplıyoruz.Buradaki rpm, saniyedeki devir sayısını temsil ediyor.Altmış “60” sayısı saniyeyi belirliyor.Çarpmış olduğumuz üçyüzaltmış “360” ise dereceyi temsil ediyor.Daha sonra bunu Time.deltaTime fonksiyonu ile çarparak, her karede aynı hızı elde etmiş oluyoruz.Tabi bu x ekseni için geçerli.Diğer eksenler ile işimiz olmadığı için, sıfır “0” yapıyoruz.
OnSagTeker.localEulerAngles = new Vector3(OnSagTeker.localEulerAngles.x, OnSagCollider.steerAngle - OnSagTeker.localEulerAngles.z, OnSagTeker.localEulerAngles.z); OnSolTeker.localEulerAngles = new Vector3(OnSolTeker.localEulerAngles.x, OnSolCollider.steerAngle - OnSolTeker.localEulerAngles.z, OnSolTeker.localEulerAngles.z);
Arka tekerlerimiz artık dönmeye hazır.Ön tekerlerimizin hareket etmesine geçebiliriz.Yine burada bulunan iki satırda aynı işlevi yerine getirdiği için, ben bir tanesinin üzerinden anlatacağım.İlk satıra bakarsak eğer, localEulerAngles fonksiyonunu kullanıyoruz.Yeni bir Vector3 oluşturuyoruz.Parantez içerisinde ise, ön sağ tekerimizin x eksenindeki açısını alıyoruz.
Daha sonra ön sağ tekerin collider nesnesinin açısından, ön sağ tekerin z eksenindeki açısını çıkartıyoruz.Son olarak da, ön sağ tekerin z eksenindeki açısını yazıyoruz.Aynı işlemi ikinci satırda, diğer teker içinde yapıyoruz.Y ekseni için neden z ekseninde hesaplama yaptığımızı sorabilirsiniz.Çünkü tekerlerin açısını z ekseninde belirliyoruz.Evet script dosyamızı hazırladık.
Evet bu projemizin de sonuna geldik.Projeyi başlattığımız zaman arka tekerlerin dönmeye başladığını göreceksiniz.Ön tekerleri ise, sağ-sol yada a ve d tuşları ile kontrol edebilirsiniz.Bir sonraki derste görüşmek üzere…
hocam The variable OnSagCollider of tekerDondurme has not been assigned hatası alıyorum nasıl düzeltebilirim?
oyun çalışıyor ama bu hata devamlı tetikleniyor
Merhaba, bu hata genelde ilgili bölüme herhangi bir nesne ataması yapılmadığı zaman ortaya çıkıyor.Sizin durumunuzda, “OnSagCollider” için gameObject adını tekrar kontrol etmenizi öneririm.Çünkü yazıda nesneye adı ile erişim sağlıyoruz.