Unity’de Basit Karakter Kontrolü Yapımı
Merhaba, bir önceki yazımızda Unity‘de bir alan içerisinde ve rastgele pozisyonlarda nesne klonlamayı öğrenmiştik.Bugünkü yazımızda ise, Unity ile basit oyuncu hareketi yapacağız.Burada basitlikten kastettiğim, karakterimizin temel yürüme mekanikleri, zıplama mekaniği ve fare ile kamera kontrolünden oluşacaktır.Bu nedenle birazdan yazacağımız kodları gayet basit ve anlaşılır tutmaya çalıştım.Lafı uzatmadan yeni bir proje oluşturalım ve yazımıza başlayalım.
Sahnemizde kullanacağımız nesneleri ekleyelim.
Bu projedeki senaryo aslında gayet basit.Unity‘de bulunan nesnelerden basit bir oyuncu oluşturacağız.Daha sonra bu oyuncuyu hareket ettireceğiz.İşte bu kadar.Şimdi nesnelerimizi sahnemize eklemeye başlayalım.İlk olarak, bir Plane nesnesi ekliyoruz.Bu nesne üzerinde hareket edeceğimiz zemini oluşturacak.Daha sonra boş bir nesne ekliyoruz.Bunu Hierarchy penceresinde sağ tıklayarak, Create Empty seçeneğinden ekleyebilirsiniz.
Bu nesne içerisinde oyuncumuzu oluşturacağız.Oyuncumuz için tek bir Cube nesnesi yeterli olacaktır.Ancak ben biraz daha özelleştirerek, ekstra birkaç nesne daha ekledim.Siz bunları yapmak zorunda değilsiniz.Bende yapacağım diyorsanız o zaman oyuncumuzun burnu hariç diğer her şeyini, Cube nesnesi ile yaptım.Burnunu ise, Capsule nesnesinden yaptım.Siz kendi hayalgücünüze göre oyuncunuzu şekillendirirsiniz.
Oyuncumuzu oluşturduktan sonra, ebeveyn yani ana nesnesine Rigidbody bileşenini ekliyoruz.Sonra bu nesnemiz için yeni bir etiket oluşturuyoruz ve nesnemize bu etiketi ekliyoruz.Evet şimdi, birkaç material dosyası oluşturuyoruz ve oyuncumuzu oluşturan çeşitli nesnelere bu material dosyalarını atıyoruz.Artık sahnemiz hazır konuma geldi.Son hali bu şekilde olmuş oluyor.
Oyuncumuzun mekaniklerini oluşturalım.
Evet şimdi iki adet C# Script dosyasına ihtiyacımız var.Birincisi oyuncu nesnemizin hareket ve zıplama mekaniklerini kontrol edecek.İkincisi ise, fare ile kamera kontrolünü gerçekleştirecek.Aslında tüm mekanikleri tek bir script dosyası altında toplamak mümkün ancak kodların daha anlaşılır olması için, iki script dosyasına ayırmak istedim.Şimdi oluşturmuş olduğumuz ilk script dosyasını editör ile açalım ve kodlarımızı yazmaya başlayalım.
public float HareketHizi; public float ZiplamaKuvveti; private Rigidbody fizik;
İlk olarak kullanacağımız değişkenleri tanımlamakla başlıyoruz.İlk satırda float türünde bir değişken oluşturuyoruz.Bu değişken ile karakterimizin hareket hızını kontrol edeceğiz.İkinci satırda yine bir float değişkeni görüyoruz.Bu değişken ile de, karakterimizin zıplama kuvvetini belirleyeceğiz.Son satırda ise, Rigidbody bileşenini kontrol etmek için bir değişken oluşturuyoruz.
HareketHizi = 5f; ZiplamaKuvveti = 5f; fizik = GetComponent<Rigidbody> ();
Start() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda hareket hızımızı tutan değişkene, bir değer atıyoruz.İkinci satırda, karakterimizin zıplama kuvvetini belirleyen değişkenimize bir değer atıyoruz.Son satırda ise, Rigidbody bileşenini oluşturduğumuz değişkene tanımlıyoruz.
void HareketKontrolu () { transform.Translate (Input.GetAxis("Vertical")*Vector3.forward*HareketHizi*Time.deltaTime); transform.Translate (Input.GetAxis("Horizontal")*Vector3.right*HareketHizi*Time.deltaTime); }
Şimdi yeni bir fonksiyon oluşturuyoruz.Bu fonksiyon içerisinde, oyuncumuzun hareket mekaniğini oluşturacağız.İkinci satırda Translate fonksiyonunu kullanarak, dikey eksende hareketini sağlıyoruz.Bunu yaparken, hareket hızımız için oluşturduğumuz değişken ile Time.deltaTime fonksiyonunu çarpıyoruz.İkinci satırda da, aynı işlemleri yapıyoruz.Aralarında ki farklılık ise, oyuncu nesnemizi bu sefer yatay eksen üzerinde hareket ettirmemiz.Aslında bu hareket mekaniğini fizik unsurlarından yararlanarak da yapabilirdik.Bu projede ben bu yolu seçtim.Siz projenize göre alternatif yollar uygulayabilirsiniz.
void ZiplamaKontrolu () { if (Input.GetKeyDown(KeyCode.Space)) { fizik.AddForce(Vector3.up * ZiplamaKuvveti, ForceMode.Impulse); } }
Sonra bir fonksiyon daha oluşturuyoruz.Bu fonksiyonda ise, oyuncu nesnemizin zıplama mekaniğini yapacağız.İkinci satırda yeni bir koşul oluşturuyoruz.Eğer klavyeden “space” tuşuna basılırsa, koşulumuz doğru oluyor ve içerisindeki kodları çalıştırıyor.Üçüncü satırda, AddForce fonksiyonundan yardım alıyoruz.Bu fonksiyon ile oyuncumuza, belirlediğimiz yönde bir kuvvet uyguluyoruz.Burada, yukarı yönde ve değişkenimizde bulunan değer doğrultusunda bir kuvvet oluşuyor.
void Update () { HareketKontrolu (); ZiplamaKontrolu (); }
Son olarak update() fonksiyonunun içerisine bu kodları yazıyoruz.Az önce oluşturduğumuz fonksiyonları, buraya yazıyoruz.Bu şekilde oluşturduğumuz mekanikler aktif hale geliyor.Evet bu script dosyamız hazır hale geldi.
Bakış açımızı ayarlayalım.
Şimdi ikinci script dosyasına geçiyoruz.Bu dosyada kamera kontrolünü sağlayacağımızı söylemiştim.O zaman başlayalım.
public Camera Kamera; public GameObject Oyuncu; public float KameraninMinXSiniri; public float KameraninMaxXSiniri; public float FareHassasiyeti; private float FareninXEkseni; private float FareninYEkseni;
Evet ilk olarak değişkenlerimizi oluşturmakla başlıyoruz.İlk satırda kamera (main.camera) nesnemizi kontrol edebilmek için bir Camera değişkeni oluşturuyoruz.İkinci satırda, oyuncu nesnemiz için GameObject nesnesi oluşturuyoruz.Üçüncü ve dördüncü satırlarda, float türünde değişkenler oluşturuyoruz.Bu değişkenlerde, kameramızın x eksenindeki minimum ve maksimum açılarını ayarlayacağız.
Burada y ekseni için her hangi bir değişken oluşturmadım.Çünkü y ekseninde bir sınırlama olması gerektiğini düşünmüyorum.İsterseniz siz ekleyebilirsiniz.Beşinci satırda, kameramızın hareket hızı için bir değişken oluşturuyoruz.Böylelikle daha yumuşak bir geçiş oluşturabiliriz.Altıncı ve yedinci satırlarda, faremizin x ve y ekseni için float türünde değişkenler oluşturuyoruz.
Kamera = Camera.main; Oyuncu = GameObject.FindWithTag ("oyuncu"); Kamera.transform.parent = Oyuncu.transform; Kamera.transform.position = Oyuncu.transform.position; Kamera.transform.rotation = Oyuncu.transform.rotation; KameraninMinXSiniri = -60f; KameraninMaxXSiniri = 60f; FareHassasiyeti = 50f; FareninXEkseni = 0f; FareninYEkseni = 0f; Cursor.lockState = CursorLockMode.Locked;
Şimdi start() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda, kullanacağımız kamera nesnesini değişkenimize tanımlıyoruz.İkinci satırda, etiketi “oyuncu” olan nesneyi değişkenimize tanımlıyoruz.Üçüncü satırda kamera nesnemizi, oyuncu nesnemizin çocuğu haline getiriyoruz.Yani oyuncu nesnemiz parent ve kamera nesnemizde child olmuş oluyor.
Dördüncü satırda kamera nesnemizin pozisyonunu, oyuncu nesnemizin pozisyonu ile aynı değerlere getiriyoruz.Beşinci satırda ise kamera nesnemizin rotasyon değerlerini, oyuncu nesnesinin değerlerine eşitliyoruz.Yedinci satırda, değişkenimize değer atıyoruz.Bu eski yönde alabileceği minimun değer olacak.Sekizinci satırda ise, artı yönde alabileceği maksimum değeri belirliyoruz.
Dokuzuncu satırda, faremizin hassasiyetini belirlemek için bir değer veriyoruz.Bu değeri ne kadar aşağıda tutarsanız, kamera hareketiniz o kadar yavaş olacaktır.Onuncu ve onbirinci satırlarda, değişkenlerimizin değerlerini sıfır “0” olarak belirliyoruz.Çünkü bu değerler sabit kalmayacak.Başlangıç için sıfırdan başlatıyoruz.Son satırda ise, fare imlecimizi kilitliyoruz.
FareninYEkseni += Input.GetAxis ("Mouse X") * FareHassasiyeti * Time.deltaTime; FareninXEkseni += Input.GetAxis ("Mouse Y") * FareHassasiyeti * Time.deltaTime; FareninXEkseni = Mathf.Clamp (FareninXEkseni, KameraninMinXSiniri, KameraninMaxXSiniri); Kamera.transform.rotation = Quaternion.Euler (-FareninXEkseni, FareninYEkseni, 0); transform.rotation = Quaternion.Euler (0, FareninYEkseni, 0);
Evet şimdi de, update() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda, faremizin y eksenindeki hareketini değişkenimize tanımlıyoruz.İkinci satırda, bu sefer faremizin y eksenindeki hareketini değişkenimize tanımlıyoruz.Üçüncü satırda, az önce elde ettiğimiz faremizin x eksenindeki hareketini kısıtlamak için Mathf.Clamp fonksiyonundan yararlanıyoruz.
Bu fonksiyonun görevi, belirttiğimiz değişkenin değerini sınırlandırmaktır.Yani, minumum ve maksimum değerler arasında faremizin x eksenini kontrol ediyoruz.Bu da, görüş açımızı sınırlandırmaya yarıyor.Dördüncü satırda, Kamera nesnemizin açısını Quaternion.Euler fonksiyonu ile kontrol ediyoruz.Bu fonksiyon üç parametreye sahip.Bunlar x, y ve z eksenlerindeki değerlerdir.
Bize bu projede kamera nesnemiz için sadece, x ve y eksenleri lazım.Son satırda ise, oyuncu nesnemizin rotasyonunu ayarlıyoruz.Yani faremizin hareketi ile hem kamera açımız hemde kontrol ettiğimiz nesnenin açısı değişiyor.Ancak burada önemli bir nokta var.Oyuncu nesnemizin sadece y ekseninde dönmesini istediğimiz için, diğer iki eksenin değerini sıfır “0” olarak belirliyoruz.Evet bu script dosyamızda tamamlanmış oluyor.
Son olarak her iki C# Script dosyamızı sürükleyerek, kontrol edeceğimiz oyuncunun ana nesnesinin (ebeveyn) üzerine bırakıyoruz.Evet bu projemizin de sonuna geldik.Bir sonraki yazıda görüşmek üzere…