Unity’de Nesneyi Fare ile Hareket Ettirmek

Unity’de Nesneyi Fare ile Hareket Ettirmek

30 Ocak 2020 0 Yazar: Ahmet Güler

Merhaba bir önceki yazımızda, Unity‘de nasıl diğer bölüme geçeceğimizi öğrenmiştik.Böylelikle bir tetikleyici sayesinde diğer sahnenin yüklenmesini gerçekleştirebiliyorduk.Şimdiki yazımızda ise, fare ile bir nesneyi nasıl hareket ettireceğimizi öğreneceğiz.Evet şimdi yeni bir proje oluşturalım ve dersimize başlayalım.

Sahnenin hazırlık süreci.

Öncelikle bu projedeki senaryoyu bir inceleyelim.Senaryomuzda bir yarış pisti ve bir yarış arabası olacak.Fare ile tıkladığımız bir pozisyona, nesnemiz hareket edecek ve hedef noktaya geldiği zaman duracak.Eğer farenin ilgili tuşuna basılı tutarsak, nesnemiz sürekli fare imlecini takip edecektir.Şimdi kullanacağımız nesneleri sahnemize eklemeye başlayalım.İlk olarak bir Plane nesnesi oluşturuyoruz.Bu nesne bizim yarış pistimizi oluşturacak.Daha sonra bu Plane nesnemize bir kaplama veriyoruz.İnternette birçok çeşidini bulabilirsiniz.Daha sonra bir Plane nesnesi daha ekliyoruz.Bu nesneyi ise yarış arabası olarak kullanacağız.

Daha sonra bu nesneye de, internetten bir kaplama buluyoruz ve ekliyoruz.Seçim yaparken, .png uzantılı olanları seçerseniz daha iyi olacaktır.Bu iki nesneyi, Scene penceresindeki araçları kullanarak istediğimiz ölçülere getiriyoruz.Yarış arabası için aslında 3D bir model seçimi yapacaktım.Ancak daha sonra bu projenin odağından uzaklaşmamak için Plane nesnesi ile yapmaya karar verdim.Ben sahnemde ayriyeten birkaç ışık nesnesi de kulladım.Bunlar ekstra şeyler olduğu için burayı geçiyorum.Evet sahnemiz şu an hazır duruma geldi.Son hali bu şekildedir.

unity-fare-ile-nesne-haret-ettirmek-object-with-mouse-movement

Bize lazım olacak kodları yazalım.

Şimdi yeni bir C# Script dosyası oluşturuyoruz ve yeni bir isim veriyoruz.Sonra bu script dosyasını sürükleyerek yarış arabası olacak nesnemizin üzerine bırakıyoruz.Artık kod yazmaya hazırız.Dosyamızı editör ile açalım ve kodlarımızı yazmaya başlayalım.

public float Hiz = 5f;
public Vector3 HedefPozisyonu;
public bool HareketSerbestMi;

İlk olarak bu projede kullanacağımız değişkenleri oluşturmakla başlıyoruz.İlk satırda, hareket edecek nesnemizin hızını belirlemek için bir değişken oluşturuyoruz.İkinci satırda, nesnemizin son pozisyonunu kaydetmek için bir Vector3 değişkeni oluşturuyoruz.Bu sayede fare ile yeni bir koordinata tıkladığımız zaman, nesnemiz en son kaldığı pozisyonu baz alarak hareket edecektir.Son satırda ise, nesnemizin bu hareketini durdurmak için bool türünde bir değişken oluşturuyoruz.

Hiz = 5f;
HedefPozisyonu = transform.position;
HareketSerbestMi = false;

Şimdi start() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda, hız için oluşturmuş olduğumuz değişkeni bir değere eşitliyoruz.İkinci satırda değişkenimize, o anki pozisyonumuzu eşitliyoruz.Böylelikle projeyi başlattığımız zaman, hangi koordinatlardan hedefe gideceğini hesaplayabilecek.Son satırda ise, bool türündeki değişkenimizi başlangıçta false olacak şekilde ayarlıyoruz.

void KonumuBulveDonustur() {
   Plane Yuzey = new Plane(Vector3.up, transform.position);
   Ray isinGonder = Camera.main.ScreenPointToRay(Input.mousePosition);
   float Mesafe;
   if (Yuzey.Raycast (isinGonder, out Mesafe)) {
      HedefPozisyonu = isinGonder.GetPoint (Mesafe);
   }
   HareketSerbestMi = true;
}

Evet şimdi yeni bir fonksiyon oluşturuyoruz.Bu fonksiyonun görevi, fare ile tıkladığımız pozisyonu dünya koordinatlarına çevirmek ve nesnemize gitmesi gereken pozisyonu iletmek.İkinci satıra baktığımızda, yen bir Plane oluşturuyoruz.Bu Plane nesnesinin görevi, fare imleci ile bastığımız noktayı doğru iletebilmek.Üçüncü satırda, yeni bir ışın oluşturuyoruz.ScreenPointToRay fonksiyonu ile ana kameramızın ortasından geçen bir ışın oluşturur.Bu ışını fare ile kontrol etmek için parantez içerisinde, Input.mousePosition kodunu yazıyoruz.

Böylelikle fare ile tıkladığımız yere bir ışın oluşturabileceğiz.Dördüncü satırda, yeni bir float türünde değişken oluşturuyoruz.Bu değişken ile gideceğimiz noktayı hesaplamakta kullanacağız.Beşinci satırda bir koşul oluşturuyoruz.Bu koşulda Raycast kullanıyoruz.Parametre olarak, göndermiş olduğumuz ışını ve mesafeyi bulmak için değişkeni kullanıyoruz.

Tabi bunu yaparkende, GetPoint fonksiyonundan yararlanıyoruz.Şöyle ki altıncı satırda bulunan Vector3 değişkenimize, hesaplamış olduğumuz yeni koordinatları eşitleyeceğiz.İşte bu dönüştürme işlemini, GetPoint fonksiyonu ile sağlıyoruz.Sekizinci satırda ise nesnemizin hareket etmesi için, değişkenimizin değerini true olarak değiştiriyoruz.

void NesneyiHareketeGecir() {
   transform.LookAt(HedefPozisyonu);
   transform.position = Vector3.MoveTowards(transform.position, HedefPozisyonu, Hiz * Time.deltaTime);
   if (transform.position == HedefPozisyonu) {
      HareketSerbestMi = false;
   }
   Debug.DrawLine (transform.position, HedefPozisyonu, Color.red);
}

Daha sonra yeni bir fonksiyon daha oluşturuyoruz.Bu fonksiyonda ise az önce elde ettiğimiz koordinatları kullanarak, nesnemizi hedefe doğru harekete geçireceğiz.İkinci satırda daha önceki yazılarımda kullanmadığım bir fonksiyon kullanacağız.LookAt fonksiyonu sayesinde, fare ile tıkladığımız pozisyona doğru nesnemizi döndürebileceğiz.Gerçekten çok kullanılan ve bir o kadar da kullanımı kolay bir fonksiyon.Üçüncü satırda, nesnemizi hedef yönde harekete geçiriyoruz.

Tabi bunu yaparken, MoveTowards fonksiyonundan yararlanıyoruz.Bu fonksiyon iki nokta arasındaki mesafeyi hesaplıyor ve nesnemizi harekete geçiriyor.Parantez içerisinde ki, parametrelere baktığımız zaman nesnemizin pozisyonu, hareket edeceğimiz pozisyon ve hareket hızımız bulunuyor.Tabi bu hız değişkenimizi, Time.deltaTime fonksiyonu ile çarparak her karede eşit şekilde hareket etmesini sağlıyoruz.Dördüncü satırda yeni bir koşul oluşturuyoruz.

Eğer nesnemizin pozisyonu ile gitmiş olduğumuz hedefin pozisyonu eşitse, koşulumuz doğru oluyor ve içerisindeki kodları çalıştırıyor.Beşinci satırda, bool türündeki değişkenimizi false değerine eşitliyoruz.Böylelikle nesnemiz hedef noktaya ulaştığı taktirde hareket etmeyi kesiyor.Yedinci satırda ise fare ile tıklamış olduğumuz pozisyonları görebilmek için, DrawLine fonksiyonundan yararlanıyoruz.Böylelikle Scene penceresinde, fare ile tıkladığımız pozisyon ve nesne arasında kırmızı bir ışın oluşturuyoruz.

if(Input.GetMouseButton(0)) {
   KonumuBulveDonustur();
}
if(HareketSerbestMi) {
   NesneyiHareketeGecir();
}

Son olarak yazmış olduğumuz bu fonksiyonların çalışması için, update() fonksiyonu içerisine bu kodları yazıyoruz.İlk koşulumuzda eğer farenin sol tuşuna basılırsa, içerisinde bulunan fonksiyonu çalıştırıyor.İkinci koşulumuzda ise bool türündeki değişkenimiz true değerine sahipse, içerisinde bulunan fonksiyonu çalıştırıyor.Özetleyecek olursak, farenin sol tuşu ile tıkladığımız zaman konum hesabı yapıyoruz ve bool türündeki değişkenimizi true yapıyoruz.Bu sayede ikinci koşulumuz doğru olmuş oluyor ve diğer fonksiyonumuzu çalıştırıyor.Böylelikle bir hareket elde ediyoruz.Evet script dosyamızı hazırladık.

Evet bu projemizin de sonuna geldik.Böylece faremiz ile tıkladığımız pozisyona, bir ışın göndererek nesnemizi hedef pozisyona taşımış olduk.Eğer farenin sol butonuna basılı tutarsak, nesnemiz sürekli olarak hedef noktaya hareket edecektir.Bir sonraki yazıda görüşmek üzere…