Unity ile Rastgele Hareket Yapmak
Merhaba, bir önceki dersimizde Unity ile Collision ve Trigger fonksiyonlarının nasıl kullanıldığını ve ne işe yaradıklarını öğrenmiştik.Bu dersimizde ise yine hareket mekaniği üzerine bir proje yapacağız.Ancak bu sefer hareket ettireceğimiz nesne bizim kontrolümüzde olmayıp, kendi seçtiği yönde hareket edecek.Tabi hedef noktalarını yine biz belirleyeceğiz.Vakit kaybetmeden projemizde kullanacağımız nesnelerini sahneye eklemeye başlayalım.
Nesnelerin projeye dahil edilmesi.
Öncelikle bir adet Plane ve üç adet Cube nesnesine ihtiyacımız var.Eğer diğer yazılarımı okuduysanız, bunları nasıl oluşturacağımızı biliyorsunuz.Yine bilmeyenler için, Hierarchy penceresinde sağ tıklayarak sırasıyla, Create > Plane ve Create > Cube seçimiyle oluşturabilirsiniz.Daha sonra istediğimiz boyutlara getiriyoruz.Bu tamamen sizin kullanım senaryonuza kalmış.İstediğiniz gibi düzenleyebilirsiniz.Şimdi bu nesneleri daha iyi ayırt edebilmek için renk vermemiz gerekiyor.
Bunun içinde dört adet Material dosyasını, Project penceresinden oluşturuyoruz.Bunlara istediğimiz renkleri verdikten sonra, oluşturmuş olduğumuz nesnelerin üzerine sürükle/bırak yöntemi ile ekliyoruz.Son olarak, hareket etmesini istediğimiz nesneni üzerine tıklayarak sağ taraftaki Inspector penceresinde en alta inerek, Add Component butonundan Rigidbody bileşenini ekliyoruz.Aslında Rigidbody için ayrı bir kod yazmayacağız ama fizik öğeleride olması açısından ben ekledim.Sahnemiz hazır.
Sahneyi hareketlendirmeye hazırız.
Öncelikle Project penceresinden, bir tane C# Script dosyası (Create > C# Script) oluşturuyoruz.Daha sonra editör ile açıyoruz.İlk olarak kullanacağımız değişkenleri tanımlayarak başlayalım.
public Transform[] yon; public Transform secilenYon; public bool hareketEt; public float hareketHizi; public float durmaMesafesi;
Evet değişkenlerimiz bunlar.Sırasıyla gidecek olursak, ilk satırda bir Transform değişkeni oluşturdum.Bu bizim gideceğimiz hedeflerin pozisyonlarını tuttacaktır.Yanlız bunu birden fazla hedefin pozisyonunu içinde tutacak şekilde ayarlamak için liste haline getirmemiz gerekiyor.Onuda sonuna koyduğumuz “[]” işareti ile yapıyoruz.İkinci satıra geçtiğimizde, hareket edecek nesnemizin seçtiği yönü görmemiz açısından bir tane Transform tanımlıyorum.Böylelikle birden fazla hedef içinden hangisini seçtiğini ve herhangi bir hatada tespit için bize kolaylık olacaktır.
Üçüncü satırımızda bir bool yani doğru/yanlış değişkeni oluşturuyorum.Bunu yön seçimi yaptıktan sonra hedefine gelmeden başka bir yöne gitmesin diye tanımlıyoruz.Aksi taktirde her saniye (Update() fonksiyonunda yer alacağı için) farklı bir yöne gitmek isteyecektir.Dördüncü satırda float değişkeni ile nesnemizin hareket hızını belirlerken, son satırda nesnemiz ile hedef arasındaki mesafeyi belirliyoruz.Böylece hedefe belirli bir mesafe kala tekrar yön seçimi yapacak ve o yöne harekete başlayacaktır.
Başlangıç koşullarının oluşturulması.
Artık değişkenlerimiz hazır.Şimdi bunları projemiz başladıktan sonra gerekli ayarlamaları yapması için Start() fonksiyonunda tanımlayalım.
yon = new Transform[2]; for (int i = 0; i < yon.Length; i++) { yon[i] = GameObject.Find(i+1+".Nokta").transform; }
Öncelikle kaç tane hedef noktamızın olduğunu belirliyoruz ve bunu listemize tanımlıyoruz.Bu senaryoda iki hedef olduğu için köşeli parantez içerisine “2” yazıyoruz.Daha sonra bir döngü oluşturuyoruz ve her bir liste elemanımızın içeriğini, hedeflerimizin transformuna eşitliyoruz.Döngüler biraz kafa karıştırıcı olabilir.Bunun için ayrı bir yazı yazacağım.Şimdi bu döngüyü açıklayalım.Bu bir for döngüsüdür ve parantez içindeki koşul sağlanana kadar çalışmaya devam eder.Döngü içerinde ise, “yon” değişkenimizin elemanlarını bulduğumuz nesne isimlerinin transformuna eşitliyoruz.
Kalabalık listelerde isimden bulmak yerine etiketten yani tag ile bulmak daha doğru ve hızlı olacaktır.Biz burada isimden buluyoruz.Parantez içi kafanızı karıştırmış olabilir.Aslında i, sıfırdan başladığı için ve bizim hedef adlarımız “0” içermediği için “+1″ ekliyoruz ve birden başlamasını söylüyoruz.Daha sonra +”.Nokta” ise, benim isimlendirmede kullanmış olduğum bir format.Yani döngü çalıştığında “1.Nokta”, “2.Nokta” şeklinde nesne isimlerimizi bulacaktır.Bunu farklı şekillerde de yapabilirdik ama bunu seçtiğim için, böyle bir yol izledik.Artık projemiz başladığında yon listemiz otomatik olarak oluşturulacaktır.Devam edelim.
if(hareketEt == false){ secilenYon = yon[Random.Range(0,yon.Length)]; hareketEt = true; }
Burada ise bir koşul belirliyorum ve eğer “hareketEt” bool değişkenimiz false ise, bunları yap diyoruz.İf koşulunu yani “hareketEt == false” olarak değilde daha kısaltarak “!hareketEt” şeklinde de yazabiliriz.Ben daha açık olması açısından bu şeklide yazdım.Koşul doğru ise, yon listemizde bulunan hedeflerden rastgele bir tanesi secilenYon değişkenine eşitlenecektir.
Buradaki rastgele seçimini, Random.Range ile yapıyoruz.Parantez içinde 0 ila belirlediğimiz sayı arasında bir seçim yapıyor.Biz 0-2 aralığını belirledik.Bunuda listemizin uzunluğunu alarak dinamik bir şekilde yazdık.Son olarak, hareketEt değişkenimizi true yapıyoruz.Şimdi Update() fonksiyonuna geçebiliriz.
Nereye gideceğim?
if(hareketEt == true) { transform.position = Vector3.MoveTowards(transform.position, secilenYon.position, hareketHizi * Time.deltaTime); }
Yine bir koşul oluşturuyoruz.Eğer hareketEt, true ise nesnemizin pozisyonunu rastgele seçilen hedef noktasının pozisyonuna eşitliyoruz.Bunu Vector3.MoveTowards fonksiyonu ile yapıyoruz.İçerisindeki parametreleri inceleyelim.Nesnenin pozisyonu, secilenYon değişkeninin pozisyonu, belirlediğimiz hareket hızı ve bu hızı kare hızları farklılıklarına karşı çarptığımız Time.deltaTime kodu.Son olarak, hedef ile mesafemizi bulmak ve kontrol etmek için kodumuzu yazıyoruz.
Araya mesafe koymak.
if(Vector3.Distance(transform.position, secilenYon.position) < durmaMesafesi){ hareketEt = false; Debug.Log (secilenYon.transform.name + "'ya geldim.Şimdi diğerine gidiyorum!"); if(hareketEt == false) { secilenYon = yon[Random.Range(0,yon.Length)]; hareketEt = true; } }
Son koşulumuzda, Distance fonksiyonu önemli bir yer tutuyor.Çünkü bu fonksiyon sayesinde iki nesnenin arsındaki mesafeyi ölçebiliyoruz.Parantez içerisinde, nesnenin pozisyonu ile secilenYon değişkenimizin pozisyonu daha önce belirlediğimiz durmaMesafesi‘den küçükse koşul çalıştırılıyor.Gerçekleştirilen işlemler ise, hareketEt değişkenini false yap.Daha sonra Console Penceresine gittiğimiz yön hakkında mesaj yaz.
Tekrar bir koşul yazıyoruz ve bu sefer az önce değiştirmiş olduğumuz hareketEt gerçekten false ise, secilenYon değişkenini tekrar rastgele seç ve hareketEt değişkenini true yap.Böylece yeni hedef belirleniyor ve hareketEt değişkeni true olduğu için nesnemizin hareket koşulu sağlanmış oluyor.Böylelikle bir döngü halinde çalışmaya devam ediyor.C# scriptimizin son hali bu şekildedir.Şimdi script dosyamızı hareket edecek nesnenin üzerine sürükle/bırak yapalım.Daha sonra hızını ve mesafesini belirleyelim ve çalıştıralım.
Evet bu dersimizde rastgele hareket mekanizması oluşturduk.Bunu farklı şekillerde de yapmak mümkündür.Sadece istediğiniz yöntemi belirlemeniz ve uygulamaya koymanız gerekiyor.Yine bu projede yazdığım kodlara farklı fonksiyonlar ekleyebilir veya gereksiz gördüğünüz kısımları çıkartarak kullanabilirsiniz.Bir başka yazıda görüşmek üzere…
benden calışmadı kod ları tam yazdım
Hangi satır yada satırlarda hata aldınız? Ve konsolda yazan hata mesajı nedir?
kodlarım tam yazıyorum ama unity pencersinde ne yapacağımı bilmiyorum
Sahneyi hazırlarken bir yeri eksik yapıyor yada atlıyor olabilirsiniz.Adımları takip ederek baştan sahneyi oluşturmanızı öneririm.