Unity’de Nesneye Yol Takibi Yaptırmak (Follow Path)

Unity’de Nesneye Yol Takibi Yaptırmak (Follow Path)

13 Şubat 2020 0 Yazar: Ahmet Güler

Merhaba, bir önceki yazımızda Unity‘de küçük harita yapmıştık.Bu minimap ile, projemizde bulunan haritayı iki boyutlu olarak görebiliyorduk.Bugünkü projemizde ise, Unity ile bir nesneye noktasal takip yaptıracağız.Vakit kaybetmeden yeni bir proje oluşturalım ve dersimize başlayalım.

Sahnemizde kullanacağımız nesneleri belirleyelim.

Bu projede kullanacağımız senaryo şu şekilde olacak.Bir zemin üzerine rastgele yerleştirilmiş nesnelerimiz olacak.Bu nesnelerden bir liste oluşturup, takip edecek nesnemize ekleyeceğiz.Daha sonra nesnemiz, bu noktalara tek tek ilerleyecek.Böylelikle istediğimiz pozisyonlara nesnemiz hareket edecektir.Ben temel mekaniğin dışında birkaç şey daha ekledim.Birazdan değinirim.

Şimdi ilk olarak yeni bir Plane nesnesi oluşturuyoruz.Bu nesne bizim zeminimizi oluşturacaktır.Hareket alanını geniş tutmak için, bu nesnenin x ve z ekseninin boyutlarını büyütüyoruz.Şimdi hareket noktalarımızı oluşturabiliriz.Bunun için tavsiyem boş nesne (Create Empty seçeneğinde oluşturabilirsiniz.) kullanmanız.Ancak ben daha iyi anlaşılması için noktaları, Sphere nesnesinden oluşturacağım.

İstediğimiz kadar nokta oluşturabiliriz.Ben 14 tane oluşturdum.Eğer benim yaptığım gibi Sphere nesnesi kullandıysanız o zaman, bu küre nesnelerimizin Inspector penceresinden collider bileşenlerini siliyoruz.Bunu yapmamızın nedeni, her hangi bir çarpışma hatasına yer vermememiz içindir.Daha sonra bu nesnelerimiz için yeni bir etiket oluşturuyoruz.Bu etiketi her bir noktamıza veriyoruz.

Unity-Nesneye-Yol-Takibi-Yaptırmak-How-to-make-object-follow-path

Şimdi noktaları takip edecek nesneyi sahnemize ekleyelim.Burada her hangi bir nesne kullanabilirsiniz.Ben bir model kullanmayı tercih ettim.Seçiminiz fark etmeksizin, aynı adımları uygulayacağız.İlk olarak hareket edecek nesnemize, bir Rigidbody bileşeni ekliyoruz.Daha sonra bu nesnemizin “isKinematic” özelliğini aktif ediyoruz.Ben dışarıdan bir model kullandığım için, bir collider bileşeni yoktu.O yüzden ayrı olarak ekledim.

Siz Unity‘de ki hazır nesneleri kullanıyorsanız tekrar eklemenize gerek yoktur.Şimdi bu nesnemiz içinde yeni bir etiket oluşturuyoruz ve ekliyoruz.Evet noktaları takip edecek nesnemiz hazır.Projenin boş olmaması için, hareket edeceğimiz noktalar üzerine tetikleyici ile yok edeceğimiz nesneler yerleştirdim.Bu ekstra bir özellik.Bunu yapmak yada yapmamak tamamen sizin tercihinize kalmış.

İnternetten noktalar üzerine yerleştirmek için bir elma modeli buldum.Bu modeli istediğimiz boyutlarda ayarladıktan sonra, yeni bir etiket oluşturuyoruz ve ekliyoruz.Daha sonra bu nesneye bir Rigidbody bileşeni ekliyoruz.Son olarak tetikleyici kodlarımızın çalışması için bir collider bileşeni ekliyoruz.Artık Prefab olarak kullanıma hazır.Bunun için nesnemizi tutup, Project penceresine sürüklüyoruz.Daha sonra sahnemizden bu nesneyi silmeyi unutmuyoruz.Evet sahnemiz hazır duruma geldi.Son hali bu şekildedir.

Unity-Nesneye-Yol-Takibi-Yaptırmak-How-to-make-object-follow-path

Noktasal takip için kodlarımızı yazmaya başlayalım.

İlk olarak yeni bir C# Script dosyası oluşturuyoruz.Bu dosyamıza yeni bir isim verdikten sonra sürükleyerek, noktaları takip edecek nesnemizin üzerine bırakıyoruz.Şimdi dosyamızı editör ile açalım ve kod yazmaya başlayalım.

public List<Transform> GidilecekNoktalar = new List<Transform>();
public Transform HedefNokta;
public GameObject Elma;
public int GuncelNokta; 
public float Hiz;

Projemizde kullanacağımız değişkenleri oluşturmakla başlıyoruz.İlk satırda yeni bir liste oluşturuyoruz.Bu liste tüm noktalarımızın, Transform değerlerini tutacak.İkinci satırda, yeni bir Transform değişkeni oluşturuyoruz.Bu değişkenimizde ise, gidilecek noktanın pozisyon değerlerini tutacağız.Üçüncü satırda, bir GameObject değişkeni oluşturuyoruz.Bu değişkende, tetikleyici ile yok edilecek nesnemizi bulunduracağız.

Dördüncü satırda, int (integer) türünde bir değişken oluşturuyoruz.Bu değişken ile, listede ki hangi noktanın pozisyon değerlerini çekeceğimizi kontrol edeceğiz.Son satırda ise, float türünde bir değişken oluşturuyoruz.Bu değişken hareket edecek nesnemizin hızını belirleyecek.

foreach (GameObject TumNoktalar in GameObject.FindGameObjectsWithTag("nokta")) { 
   Instantiate (Elma, TumNoktalar.transform.position, Elma.transform.rotation); 
}

Şimdi start() fonksiyonumuzun içerisine bu kodları yazıyoruz.Yeni bir foreach döngüsü oluşturuyoruz.Bu döngüde, etiketi “nokta” olan tüm nesneleri buluyoruz.İkinci satırda Instantiate fonksiyonu yardımıyla Prefab nesnemizi, tüm noktalara sırasıyla klonluyoruz.Bunun için nesnemizin pozisyon değerini, oluşturduğumuz noktaların değerlerine eşitliyoruz.Rotasyon değerlerini ise, nesnemizin kendi değerleri olacak şekilde ayarlıyoruz.

HedefNokta = GidilecekNoktalar[GuncelNokta];
GuncelNokta = 0; 
Hiz = 4f;

Yine start() fonksiyonundan devam ediyoruz.İlk satırda değişkenimize, oluşturduğumuz listeden bir elemanın pozisyon değerlerini eşitiyoruz.Bu başlangıç için, ilk elemanın değeri olacaktır.İkinci satıra bakacak olursak, değişkenimize sıfır “0” değerini veriyoruz.Bu listemizin ilk sıradan başlamasını sağlıyor.Son satırda ise, hareket edecek nesnemizin hızını belirliyoruz.

Nesnemize hareket etmesi için bir nokta gösterelim.

transform.position = Vector3.MoveTowards(transform.position, HedefNokta.position, Hiz * Time.deltaTime);
transform.LookAt (HedefNokta);

Evet, şimdi update() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda, nesnemizin pozisyonunu listeden seçilen noktanın pozisyonuna eşitliyoruz.Tabi hareketi yumuşatmak için, MoveTowards fonksiyonunu kullanıyoruz.Nesnemizin hızının her karede eşit olması içinde, Time.deltaTime fonksiyonu ile çarpıyoruz.İkinci satırda hareket edecek nesnemizin yönüne, gideceği noktaya çeviriyoruz.Bunu LookAt fonksiyonu ile yapıyoruz.Böylece, daha güzel bir hareket mekaniği oluşuyor.

if(transform.position == HedefNokta.position) {
   if (GuncelNokta >= GidilecekNoktalar.Count - 1) { 
      GuncelNokta = 0; 
   } else {
      GuncelNokta++;
   }
}

Update() fonksiyondan devam ediyoruz.İlk satırda yeni bir koşul oluşturuyoruz.Eğer nesnemizin pozisyonu hareket ettiğimiz noktanın pozisyonuna eşit ise, koşulumuz doğru oluyor.İkinci satırda tekrar yeni bir koşul oluşturuyoruz.Bu koşulda ise, eğer gidilecek noktanın listedeki sırası, listenin toplam eleman sayısından büyük yada eşit ise koşulumuz doğru oluyor.Bu durumda, listedeki son noktaya gelmiş bulunuyoruz.

Koşulun sonunda yer alan “-1” ise, listemiz birden “1” değilde sıfırdan “0” başladığı için koşulumuzu bir eksiltiyoruz.Yoksa hata alırız.Üçüncü satırda, değişkenimizin değerini sıfıra eşitliyoruz.Böylelikle nesnemiz sürekli olarak hareket edecektir.Tabi bu koşul doğru değilse ne yapacağız.Else tarafına bakacak olursak, listemizdeki noktalar henüz tamamlanmadıysa, değişkenimizi bir “1” arttırarak devam ediyoruz.

HedefNokta = GidilecekNoktalar[GuncelNokta];

Evet sıradaki hedef noktamızı oluşturduk.Bu noktaya nesnemizi yönlendirmek için koşulumuzun devamına yukarıdaki kodu yazıyoruz.Bu kod ile nesnemiz için yeni bir pozisyon değeri atanıyor.Böylece o pozisyona doğru harekete geçiyor.

Çarpışmada oluşacak olayları belirleyelim.

void OnTriggerEnter(Collider Kontrol) {
   if (Kontrol.gameObject.tag == "elma") {
      Destroy (Kontrol.gameObject);
   }
}

Şimdi yeni bir tetikleyici fonksiyonu oluşturuyoruz.Bu projede tetikleyici için, OnTriggerEnter fonksiyonunu kullanacağız.İkinci satırda yeni bir koşul oluşturuyoruz.Eğer çarptığımız nesnenin etiketi “elma” ise koşulumuz doğru oluyor.Üçüncü satırda ise, çarptığımız bu nesneyi sahnemizden siliyoruz.Bunu Destroy fonksiyonu ile gerçekleştiriyoruz.Evet script dosyamız hazır duruma geldi.

Evet projemizin sonuna geldik.Yapmamız gereken son bir şey kaldı.Oluşturduğumuz noktaların hepsini seçip, listemizde gerekli yere ekliyoruz.Artık projemizi çalıştırmaya hazırız.Bu projemizin de sonuna geldik.Bir sonraki yazıda görüşmek üzere…

Unity-Nesneye-Yol-Takibi-Yaptırmak-How-to-make-object-follow-path