
Unity’de Hareketli Platform Yapımı
Merhaba, bir önceki dersimizde Unity‘de ara sahne (cutscene) yapımını öğrenmiştik.Bu dersimizde ise, Unity ile hareketli platformlar oluşturacağız.Bu tür mekanikleri projenizde engel oluşturmak, bir noktaya ulaşmak gibi amaçlar ile kullanabilirsiniz.Şimdi yeni bir proje oluşturalım ve dersimize başlayalım.
Sahnemizi oluşturma süreci.
Bu projede kullanacağımız senaryoyu anlatayım.İki bina arasına bir platform kuracağız.Bu platform üzerine ekleyeceğimiz bir nesneyi iki nokta arasında hareket ettireceğiz.Evet şimdi ilk nesnemizi sahnemize ekleyerek başlayalım.Bir Plane nesnesi oluşturuyoruz.Bu bizim zeminimizi oluşturacak.Daha sonra internetten bulduğumuz bir bina modelini projemize dahil ediyoruz.Yine internetten bulacağımız, bir vinç modelini projemize aynı şekilde ekliyoruz.
Bu vinç modelini, bina modelimizin üzerine konumlandırıyoruz.Tabi bu arada her iki modeli gerektiği gibi boyutlandırıyoruz.Şimdi bu iki modelden birer kopya daha alarak, diğer modelimizin tam karşısına gelecek şekilde pozisyonunu ayarlıyoruz.Şimdi bir Cube nesnesi oluşturalım.Bu nesnemizi, iki bina arasında konumlandıracağız.Ancak önce boyutlarını ayarlamamız gerekiyor.Hareketli platformumuz, bu nesne üzerinde hareket ediyormuş gibi görüneceği için, her iki binaya da temas edecek şekilde boyut veriyoruz.
Şimdi bu nesneden bir kopya daha alıyoruz ve tam karşısına gelecek şekilde bir ray sistemi oluşturuyoruz.Daha sonra yeni bir Cube nesnesi daha oluşturuyoruz.Bu nesneyi platform üzerinde hareket ettireceğiz.Pozisyon ve boyut ayarlamalarını, az önce oluşturduğumuz raylı sistemin üzerine oturacak şekilde yapıyoruz.Son olarak, bu nesnemizin hareket noktalarını oluşturmamız gerekiyor.Bunun için boş bir nesne kullanmanız yeterli olacaktır.
Ancak konumlarını daha iyi anlamanız için Uniy‘de bulunan nesneleri kullanabilirsiniz.Ben Cube nesnesinden yararlanacağım.Raylı sistemin her iki bitiş noktasına da, birer Cube nesnesi ekliyorum.Daha sonra yeni etiketler oluşturuyoruz ve nesnelerimize ekliyoruz.Bu nesnelerin pozisyon değerlerine göre, nesnemizi hareket ettireceğiz.Artık sahnemiz hazır.Benim sahnemin son hali bu şekildedir.
Kod yazmaya başlayalım.
Evet öncelikle bir C# Script dosyası oluşturuyoruz.Bu dosyaya yeni bir isim veriyoruz ve sürükleyerek hareket edecek nesnemizin üzerine bırakıyoruz.Artık bu dosyamızı editör ile açarak kod yazmaya başlayabiliriz.
public Transform HareketEdecekNesne; public Vector3 BirinciNokta; public Vector3 IkinciNokta; public float Hiz; public float Bosluk; public float BeklemeSuresi; public bool HareketAktif;
İlk olarak bize lazım olacak değişkenlerimizi oluşturmakla başlıyoruz.İlk satırda, bir Transform değişkeni oluşturuyoruz.Bu değişken bizim hareket etmesini istediğimiz nesnenin pozisyon değerlerini tutacak.İkinci ve üçüncü satırlarda, Vector3 değişkenleri oluşturuyoruz.
Bu değişkenlerde, hedef noktaların pozisyon değerlerini tutacak.Dört, beş ve altıncı satırlarda, float türünde değişkenler oluşturuyoruz.Bu değişkenler ile nesnemizin hızını, noktalar arasında bekleme süresini ve arasındaki mesafeyi ayarlayacağız.Son satırda ise, bool türünde bir değişken oluşturuyoruz.Bu değişken ile de nesnemizin hareketini kontrol edeceğiz.
HareketEdecekNesne = gameObject.transform; BirinciNokta = GameObject.FindWithTag ("nokta1").transform.position; IkinciNokta = GameObject.FindWithTag ("nokta2").transform.position; Hiz = 2f; Bosluk = 0.5f; BeklemeSuresi = 1f; HareketAktif = true;
Şimdi start() fonksiyonumuzun içerisine bu kodları yazıyoruz.İlk satırda, oluşturduğumuz değişkenimize nesnemizin pozisyon değerlerini atıyoruz.İkinci ve üçüncü satırlarda, etiketi “nokta1” ve “nokta2” olan nesnelerimizin pozisyon değerlerini Vector3 değişkenlerimize eşitliyoruz.Dördüncü, beşinci ve altıncı satırlarda değişkenlerimize değerlerini atıyoruz.Bu değerleri istediğiniz gibi ayarlayabilirsiniz.Son satırda ise, bool değişkenimizin değerini true olarak belirliyoruz.
Hedefler arasındaki mesafeyi hesaplayalım.
IEnumerator HareketeBasla(Transform Nesne, Vector3 HedefPozisyon, float NesneHizi) { float sure = Time.time; Vector3 BaslangicPozisyonu = Nesne.position; float HedeflerArasindakiUzunluk = Vector3.Distance(BaslangicPozisyonu, HedefPozisyon); Vector3 HedeflerArasiBoslukBirak = (BaslangicPozisyonu - HedefPozisyon).normalized * Bosluk; HedefPozisyon = HedeflerArasiBoslukBirak + HedefPozisyon; if (BaslangicPozisyonu == HedefPozisyon) { yield break; } }
Şimdi IEnumerator metodu ile yeni bir fonksiyon oluşturuyoruz.Bu fonksiyon içerisinde üç adet parametre kullanacağız.Bu parametreler nesnemizin transform özelliklerini, hedef noktaların pozisyonlarını ve nesne hızımızı içerecektir.İkinci satırda, float türünde bir değişken oluşturuyoruz.Bu değişkende Time.time fonksiyonu ile, hareketin başladığı zamanı not alıyoruz.Üçüncü satırda, yeni bir Vector3 değişkeni oluşturuyoruz.Bu değişkene, nesnemizin transform değerlerini eşitleyeceğiz.
Dördüncü satırda, float türünde bir değişken oluşturuyoruz.Bu değişkene, Distance fonksiyonu ile bulduğumuz değeri eşitliyoruz.Bu değer, hareket edecek nesnemizin o anki pozisyonu ile hedef pozisyon arasındaki uzaklığı içeriyor.Beşinci satırda, bu sefer bir Vector3 değişkeni oluşturuyoruz.Bu değişkende, nesnemizin başlangıç pozisyonu ile hedef pozisyonu arasındaki uzaklığı normalleştiriyoruz.
Yani normalized fonksiyonu ile, uzunluğunu bire eşitliyoruz.Daha sonra bu değeri, diğer değişkenimiz ile çarpıyoruz.Altıncı satırda değişkenimizi, az önce bulduğumuz değer ile topluyoruz.Bu bize hareket eden platform ile hareket noktası arasında belirli bir boşluk bırakacaktır.Yedinci satırda yeni bir koşul oluşturuyoruz.Eğer nesnemizin pozisyonu ile hedef noktanın pozisyonu aynı ise, koşuldan çıkıyoruz.
while (HareketAktif) { float HesaplananSure = (Time.time - sure) * NesneHizi; float AktifSure = HesaplananSure / HedeflerArasindakiUzunluk; Nesne.position = Vector3.Lerp(BaslangicPozisyonu, HedefPozisyon, AktifSure); if (AktifSure >= BeklemeSuresi) { yield break; } yield return null; }
Aynı fonksiyondan devam ediyoruz.Şimdi bir while döngüsü oluşturuyoruz.Bu döngüde eğer bool değişkenimiz true değerine sahipse, kodlarımız çalışmaya başlıyor.İkinci satırda değişkenize, hesapladığımız süreyi eşitliyoruz.Üçüncü satırda ise, hedef ile nesne arasındaki uzaklığı hesaplıyoruz.Bunun için, az önce bulduğumuz değeri aradaki mesafeye bölüyoruz.
Dördüncü satırda hareketli nesnemizin pozisyonunu, Lerp fonksiyonu ile hedefe eşitliyoruz.Beşinci satırda, yeni bir koşul oluşturuyoruz.Eğer aktif süre bekleme süresine eşit veya ondan büyükse, koşuldan çıkıyoruz.Altıncı satırda ise, gelecek olan kareyi bekliyoruz ve döngümüze devam ediyoruz.
Platformumuzu harekete geçirelim.
IEnumerator NoktalarArasindaHareket(Transform Nesne, Vector3 ilkNokta, Vector3 ikinciNokta) { while (HareketAktif) { yield return HareketeBasla(Nesne, ilkNokta, Hiz); yield return HareketeBasla(Nesne, ikinciNokta, Hiz); } }
Yeni bir fonksiyon oluşturuyoruz.Bu fonksiyonda da, IEnumerator metodunu kullanıyoruz.Aslında burada yaptığımız şey, hedef noktaya varana kadar kodumuzu bekletmek.Bu yüzden Coroutine fonksiyonlarından yararlanıyoruz.Şimdi bu fonksiyonumuz içinde parametreler oluşturuyoruz.Bu parametreler, Transform ve Vector3 özelliklerini barındıracaklar.
İkinci satırda, yeni bir while döngüsü oluşturuyoruz.Eğer bool değişkenimizin değeri true ise, koşulumuz doğru oluyor.Üçüncü ve dördüncü satırlarda, bir önceki fonksiyonumuzu çağırıyoruz.Ancak bunların hedef noktalarını ayrı ayrı belirliyoruz.Burada yaptığımız işlem ise, önce ilk noktaya git.Hedefe vardığın zaman ise, kareyi bekle ve döngüye devam et.Bu da, ikinci noktaya git demek oluyor.
StartCoroutine(NoktalarArasindaHareket(HareketEdecekNesne, BirinciNokta, IkinciNokta));
Fonksiyonlarımızı oluşturduk.Bunları çalıştırmak için, bu kodu update() fonksiyonumuzun içerisine yazıyoruz.Burada, StartCoroutine fonksiyonundan yararlanıyoruz.Aksi takdirde kodumuz çalışmayacaktır.Burada dikkat etmemiz gereken şey, fonksiyonumuzu parametreleri ile kullanmak.Bu parametreler ise, hareket edecek nesnemizin pozisyonu, ilk hareket noktasının pozisyonu ve ikinci hareket noktasının pozisyonudur.Hareket hızını, bir önceki fonksiyonumuzda tanımladığımız için burada gerek yoktur.Yani ilk fonksiyon içerisinde hedefler arasındaki uzaklığı hesapladık.İkinci fonksiyonumuzda ise, eldeki değerler ile nesnemizi harekete geçirdik.Evet script dosyamız hazır duruma geldi.
Evet bu projemizin de sonuna geldik.Script üzerindeki değişkenleri Inspector penceresinden değiştirerek, istediğiniz özelliklerde bir platform oluşturabilirsiniz.Bir sonraki derste görüşmek üzere…