Unity’de Joystick ile Nesne Hareket Ettirmek

Unity’de Joystick ile Nesne Hareket Ettirmek

5 Mart 2020 2 Yazar: Ahmet Güler

Merhaba, bir önceki yazımızda Unity‘de nesnelere ses eklemeyi öğrenmiştik.Bu dersimizde ise, Unity‘de joystick ile bir nesneyi hareket ettirmeyi öğreneceğiz.Daha önceki yazılarımda, Unity ile joystick yapımını öğrenmiştik.Eğer o derse bakmadıysanız, geriye dönüp bakmanızı tavsiye ederim.Çünkü bu derste yapacaklarımız, o derste öğrendiklerimiz ile bağlantılı olacaktır.Şimdi yeni bir proje oluşturalım ve dersimize başlayalım.

Sahnemizi hazırlamaya başlayalım.

Bu proje az önce belirttiğim gibi, daha önceki joystick yapımı projesinin devamı niteliğinde olacaktır.Bu yüzden arayüz (UI) elemanlarını ben sahnemde oluşturdum.Bu kısmı anlatmayacağım, çünkü bu dersimizin konusu değil ve daha önceki yazıda bu konuyu detaylı bir şekilde anlattım.Şimdi projemizde kullanacağımız senaryoyu inceleyelim.Bir Cube nesnesi ile anlatmayı düşünüyordum.Fakat daha sonra bir vinç modeli üzerinden anlatmaya karar verdim.Bu bir araba da olabilirdi.

Neden vinç derseniz, hareket eksenlerini görmeniz daha net olur diye düşündüm.Geri dönecek olursak senaryomuz, bir vinç modelini joystick ile hareket ettirmek üzerine olacak.Bu arada, siz projenizde bir araba modeli de kullanabilirsiniz.Yada dediğim gibi bir Cube nesnesi de kullanabilirsiniz.Yapacaklarımız aynı olacak.Sadece değişkenleri tanımlarken, isimler ve etiketler gibi küçük farklılıklar olacak.

Şimdi sahnemizi hazırlamaya başlayabiliriz.İlk olarak bir Plane nesnesi oluşturuyoruz.Bu nesne bizim zeminimizi oluşturacak.Daha sonra joystick ile hareket ettirmek istediğimiz nesneyi sahnemize ekliyoruz.Ben bir vinç modeli kullandığım için, hareket ettireceğim bölümleri hiyerarşik olarak düzenlemem gerekiyor.Bunu yaptıktan sonra, modelimi üç “3” parçaya ayırmış bulunuyorum.

İlk parça, vinç modelimin hareketsiz bölümlerini içinde bulunduruyor.İkinci parça, vinç modelimin x ekseninde hareket edecek parçalarını içinde bulunduruyor.Son parça ise, vinç modelimin y ekseninde hareket edecek bölümlerini içinde bulunduruyor.Bunu yapmamın nedeni, parçaları bağımsız bir şekilde kontrol etmek içindir.Daha sonra hareket edecek parçalara yeni etiketleri oluşturuyorum.

Unity-Joystick-ile-Nesne-Hareket-Ettirmek-How-To-Move-Gameobject-With-Joystick-Tutorial

Bu aşamaya kadar tamamen kendi projemde kullandığım modele göre bir düzenleme gerçekleştirdim.Şimdi Unity‘de hali hazır olan nesneler üzerinde bir yol izleyelim.Bir Cube nesnesi oluşturalım.Daha sonra joystick yapımı yazısında oluşturduğumuz script dosyamızın ekli olduğu nesneye yeni bir etiket oluşturalım.Bu önemli çünkü birazdan yazacağımız kodlarda, diğer script dosyasına erişmemiz gerekecek.Referans olarak da, etiketi kullanacağız.İşte bu kadar.Mantığı tamamen aynıdır.Şimdi kodlarımızı yazmaya başlayabiliriz.

Kodlarımızı yazmaya başlayalım.

İlk dersimizde oluşturduğumuz script dosyamızı editör ile açıyoruz.Bu dosyaya bir kaç kod ekleyeceğiz.

public float XeksenidekiHareket() {
   return KoordinatXYZ.x;
}
public float ZeksenidekiHareket() {
   return KoordinatXYZ.z;
}

Evet joystick için daha önce oluşturduğumuz script dosyamıza bu kodları yazıyoruz.Burada iki yeni float fonksiyonu oluşturuyoruz.Bunlardan biri joystick butonumuzun, x ekseninde ki hareketlerini döndürürken, diğer fonksiyonumuz ise, z eksenindeki hareketlerini döndürecektir.

Böylece buradan aldığımız değerler doğrultusunda nesnemize hareket kazandırabileceğiz.Şimdi bu script dosyamız ile artık bir işimiz kalmadı.Hareket edecek nesnemiz için yeni bir C# Script dosyası oluşturuyoruz.Bu dosyayı da editör ile açalım ve kodlarımızı yazmaya başlayalım.

public joystick JoystickScripti;
public GameObject VincGovdesi;
public GameObject VincKolu;
public float VincHizi;

İlk olarak kullanacağımız değişkenleri oluşturmakla başlıyoruz.İlk satırda, diğer script dosyamıza ulaşmak için bir değişken tanımlıyoruz.İkinci satırda ve üçüncü satırlarda GameObject değişkenleri oluşturuyoruz.Bu değişkenler ile, hareket ettireceğimiz nesnenin farklı bölümlerini bağımsız şekilde kontrol edebileceğiz.Son satırda ise, float türünde bir değişken oluşturuyoruz.Bu değişken ile de, hareket ettireceğimiz nesnenin hızını kontrol edeceğiz.

JoystickScripti = GameObject.FindWithTag("joystick").GetComponent<joystick>();
VincGovdesi = GameObject.FindWithTag ("vinc_govde");
VincKolu = GameObject.FindWithTag ("vinc_kol");
VincHizi = 1f;

Şimdi start() fonksiyonumuzun içerisine bu kodları yazıyoruz.İlk satırda değişkenimize, etiketi “joystick” olan nesnemizin joystick bileşenini tanımlıyoruz.Burada ilk derse bakanlar hatırlayacaklardır.Biz bu joystick script dosyamızı, Hiyerarchy penceresinde Canvas nesnemize eklemiştik.Bu Canvas nesnemize daha sonra yeni bir etiket verdik.Böylece diğer script dosyası ile bir bağlantı oluşturduk.

İkinci satırda değişkenimize, etiketi “vinc_govde” olan nesnemizi tanımlıyoruz.Üçüncü satırda ise değişkenimize, etiketi “vinc_kol” olan nesnemizi tanımlıyoruz.Son satırda ise, değişkenimize bir değer veriyoruz.Bu değişken bizim nesnemizin hareket hızını belirleyeceği için çok yüksek vermenizi tavsiye etmem.

Bağımsız eksen hareketleri oluşturalım.

Vector3 VincGovdeKontrolu() {
   Vector3 joystickGovdeHareketi = Vector3.zero;
   joystickGovdeHareketi.z = JoystickScripti.XeksenidekiHareket ();
   if (joystickGovdeHareketi.magnitude > 1) {
      joystickGovdeHareketi.Normalize ();
   }
   return joystickGovdeHareketi;
}

Evet şimdi yeni bir Vector3 fonksiyonu oluşturuyoruz.Bu fonksiyon ile, nesnemizin z eksenindeki hareketi kontrol edeceğiz.İkinci satırda, bir Vector3 değişkeni oluşturuyoruz.Bu değişkenin koordinat değerlerini sınırlıyoruz.Bunu “Vector3.zero” kodu ile yapıyoruz.İkinci satırda, sıfırlanmış olduğumuz bu değişkenimizin z eksenindeki değerini, diğer script dosyamızdaki “XeksenidekiHareket()” fonksiyonumuzun değerine eşitliyoruz.

Burada neden z eksenini, x eksenine eşitliyoruz diyebilirsiniz.Bu tamamen benim projemde ki, nesnelerin ve kameranın yerleşiminden kaynaklanıyor.Üçüncü satırda, yeni bir koşul oluşturuyoruz.Eğer Vector3 değişkenimizin uzunluğu, birden “1” büyükse, koşulumuz doğru oluyor.

Bu uzunluk değerini, magnitude fonksiyonu ile kontrol ediyoruz.Dördüncü satırda ise, Vector3 değişkenimizin normalleştiriyoruz.Yani yönünü koruyoruz fakat uzunluğunu bire “1” eşitliyoruz.Bunu yapmak içinde, Normalize fonksiyonunu kullanıyoruz.Altıncı satırda ise, bu değişkenimizin aldığı değeri döndürüyoruz.

Vector3 VincKolKontrolu() {
   Vector3 joystickKolHareketi = Vector3.zero;
   joystickKolHareketi.y = JoystickScripti.ZeksenidekiHareket ();
   if (joystickKolHareketi.magnitude > 1) {
      joystickKolHareketi.Normalize ();
   }
   return joystickKolHareketi;
}

Evet şimdi yeni bir Vector3 fonksiyonu oluşturuyoruz.Bu fonksiyonumuzda ise, nesnemizin y eksenindeki hareketini kontrol edeceğiz.Biraz önce oluşturduğumuz fonksiyon ile aynı kodları içeriyor.Aralarındaki fark, birinde z ekseni için bir hareket oluştururken diğerinde y ekseni için bir hareket oluşturuyoruz.Böylece joystick butonumuz ile yapacağımız hareketlerde, farklı eksenleri kontrol edebiliyoruz.

Geriye dönecek olursak üçüncü satırda, Vector3 değişkenimizin y ekseni için diğer script dosyamızda bulunan, “ZeksenidekiHareket()” fonksiyonunu tanımladık.Yine az önce de söylediğim gibi, sahnemde ki yerleşim nedeni ile y eksenindeki hareket için z eksenini tanımladım.

Vector3 VincGovdeHareketi = VincGovdeKontrolu();
VincGovdesi.transform.Translate(VincGovdeHareketi * VincHizi * Time.deltaTime);
Vector3 VincKolHareketi = VincKolKontrolu();
VincKolu.transform.Translate(VincKolHareketi * VincHizi * Time.deltaTime);

Şimdi yazdığımız bu fonksiyonlardaki değerleri, hareket ettireceğimiz nesneye aktarmamız gerekiyor.Bunun için yukarıdaki kodları, update() fonksiyonumuzun içerisine yazıyoruz.İlk satırda yeni bir Vector3 değişkeni oluşturuyoruz.Bu değişken ile, sahnemizde bulunan nesnenin iki farklı bölümünü kontrol edeceğiz.Ben sahnemde bir vinç modeli kullandığım için, bu modelin gövde kısmı için bir değişken oluşturdum.

Daha sonra bu değişkenimize oluşturduğumuz fonksiyonu tanımlıyoruz.Bu fonksiyon ile z ekseninde bir hareket sağlıyorduk.İkinci satırda, Translate fonksiyonu yardımı ile ilgili bölümde z ekseninde bir hareket oluşturuyoruz.Bunu yaparken, hız için oluşturduğumuz değişken ile, Time.deltaTime fonksiyonunu çarpıyoruz.Böylece her karede aynı hızı sağlıyoruz.

Üçüncü satırda ise, bir Vector3 değişkeni daha oluşturuyoruz.Bu değişkenimize ise, y ekseni için oluşturduğumuz fonksiyonu tanımlıyoruz.Son satırda, yine Translate fonksiyonu yardımı ile nesnemizin hareket edeceği diğer parçasını da hazırlamış bulunuyoruz.Evet script dosyamız hazır.

Evet şimdi oluşturmuş olduğumuz script dosyasını hareket ettireceğimiz nesnemizin üzerine sürükleyip bırakıyoruz.Bu arada projemde kullanmış olduğum etiketleri kendinize göre düzenlemeyi unutmayın.Bu projeyi bir Cube nesnesi ile de anlatabilirdim.Fakat biraz farklılaştırmak istedim.Siz aynı kodları bir kaç farklılaştırma ile hatasız bir şekilde kullanabilirsiniz.Evet bir sonraki yazıda görüşmek üzere…

Unity-Joystick-ile-Nesne-Hareket-Ettirmek-How-To-Move-Gameobject-With-Joystick-Tutorial