
Unity’de Tank Yapımı 1 (Kamera & Hareket)
Merhaba, bir önceki yazımızda Unity‘de bir silaha geri tepme mekaniği kazandırmıştık.Böylece yapmış olduğumuz projelerde daha gerçekçi vuruş hissi verebiliyorduk.Bugünkü dersimizde bir tank yapacağız.Daha doğrusu bir tank üzerinde bulunan mekaniklerin bir kısımını yapacağız.Tüm mekanikleri tek bir yazıda anlatmayı düşünmüyorum.Çünkü yazı çok uzayabilir.Bu yüzden iki parça halinde yayımlayacağım.Evet şimdi yeni bir proje oluşturalım ve dersimize başlayalım.
Sahnemizin hazırlanması.
Öncelikle bir Plane nesnesi sahnemize ekliyoruz.Bu Plane nesnesi bizim zeminimizi oluşturacak.Daha sonra internetten bulduğumuz bir tank modelini projemize dahil ediyoruz.Bunu Unity‘de bulunan hazır nesnelerden de yapabilirdik.Ama ben sahnemin daha iyi durması açısından bir model kullanmayı tercih ettim.Şimdi projemize eklediğimiz tank nesnemizi sahnemize ekliyoruz.Burada tank nesnemizin boyutunu istediğimiz gibi ayarlıyoruz.Şimdi kullandığımız modelde dikkat etmemiz gereken iki nokta var.Birinci nokta, tank modelimizin kule yanı kafa kısmının ayrı modellenmiş olması.
İkincisi ise yine, tank modelimizin ana silahının ayrı modellenmiş olması.Burada ayrı modellemeden kastettiğim, farklı Component’lerden oluşmasıdır. Böylece parça parça müdahale edebiliriz.Bu iki noktaya dikkat çekmemin sebebi ise, bu projede yazacağımız kodlar ile tankımızın bazı bölümlerini bağımsız olarak kontrol edeceğiz.Eğer tek parçadan oluşan bir model kullanıyorsak, istediğimiz gibi kontrol edemeyeceğiz.Şimdi Hierarchy penceresinde tank modelimizin parçalarını anlayabileceğimiz şekilde düzenleyelim.Aşağıdaki resme bakarsanız, daha iyi anlayacağınızı umuyorum.
Gördüğünüz gibi, kullandığım tank modelini genel olarak üç “3” kısma ayırdım.Bunlar “TankPaneti”, “KuleHalkasi” ve “TankAnaSilahi” bölümleridir.Ayrıca tüm bu bölümleri kendi aralarında hiyerarşik bir düzene soktum.Resimde görebileceğiniz gibi “TopCikisi” ve “TankKamerasi” nesneleri, “TankAnaSilahi” nesnesinin çocuk (child) nesnesi konumundadır.Bu arada takımızı istediğimiz bir noktadan takip etmek için, “TankKamerasi” adında boş bir nesne oluşturuyoruz.Bunların projedeki önemini kodlarımızı yazmaya başladığımızda daha iyi anlayacaksınız.Şimdi devam edelim.Takımızda yapacağımız mekaniklerden biri ateş etme olacak.
Bunun için bir mermiye ihtiyacımız var.Sahnemize yeni bir Sphere nesnesi ekliyoruz.Daha sonra bu küre nesnemize, Inspector penceresinden Rigidbody bileşenini ekliyoruz.Böylece mermi olarak kullanacağımız nesnemize fizik elemanlarını eklemiş olduk.Daha sonra bu mermimizi tekrar tekrar kullanabilmek için Prefab nesnesine dönüştürmemiz gerekiyor.Bunun için mermi nesnemizi sürükleyerek, Project penceresine bırakıyoruz.Evet Prefab olarak kullanacağımız nesnemiz hazır.Artık sahnemizden mermi nesnemizi silebiliriz.Sahnemizde kullanacağımız tüm nesneleri hazırladık.Şimdi kod yazma kısmına geçebiliriz.
Kodlarımızı yazmaya başlayalım.
Evet bu projede tek bir C# Script dosyası kullanacağımızı yazımın başında söylemiştim.Bu yüzden tankımız üzerinde oluşturacağımız mekanikleri iki yazıda anlatmayı uygun gördüm.Böylece tek bir bütün yazıya göre daha kısa olacağından detayları es geçmeden anlatabileceğim.Şimdi bir C# Script dosyası oluşturuyoruz.Daha sonra bu script dosyamızı editör yardımı ile açalım ve kod yazmaya başlayalım.
public Camera Kamera; public Transform TankKamerasi; public GameObject TankPaleti; public GameObject TankKulesi; public GameObject TankAnaSilahi; public GameObject TankTopuCikisi; public GameObject TankTopu; public float TankHizi;
İlk olarak kullanacağımız değişkenleri oluşturmakla başlıyoruz.İlk satırda, Camera değişkenimizi oluşturuyoruz.Bu değişken ile kullanacağımız kamerayı kontrol edebileceğiz.İkinci satırda, bir Transform değişkeni oluşturuyoruz.Bu değişken ile de, kameramızın hangi konumdan tankımızı takip edeceğini kontrol edeceğiz.Üçüncü satırdan yedinci satıra kadar, GameObject değişkenleri oluşturuyoruz.Bu değişkenler tank modelimizin farklı terlerini kontrol edebilmek adına önem arz ediyor.Üçüncü satırdaki değişkenimizi, tankımızın hareket mekaniği için kullanacağız.
Dördüncü satırdaki değişkenimiz ile, tank modelimizin kafa yani kule kısmını kontrol edeceğiz.Beşinci satırdaki değişken ile, tank modelimizin ana silahını kontrol edeceğiz.Altıncı satırdaki değişken ile, ateş mekaniğinde kullanacağımız mermimizin, klonlanma pozisyonunu kontrol edeceğiz.Yedinci satırda bulunan değişkende, ateş mekaniğinde oluşacak mermi Prefab nesnesini kontrol edeceğiz.Son satırda ise float türünde bir değişken oluşturuyoruz.Bu değişken ile de, tankımızın hızını kontrol edeceğiz.
Kamera = Camera.main; Kamera.transform.SetParent(TankKamerasi); Kamera.transform.localPosition = new Vector3(TankKamerasi.transform.position.x, TankKamerasi.transform.position.y, -5.4f); Kamera.transform.localRotation = Quaternion.Euler(TankKamerasi.transform.rotation.x, TankKamerasi.transform.rotation.y, TankKamerasi.transform.rotation.z); TankHizi = 1f;
Şimdi start() fonksiyonumuzun içerisine bu kodları yazıyoruz.İlk satırda değişkenimize, projemizde bulunan ana kamerayı (camera.main) eşitliyoruz.İkinci satırda, kamera değişkenimizin ebeveyn (parent) nesnesini değiştiriyoruz.Daha doğrusu bir ebeveyn atıyoruz.Bunu yapmak için, SetParent fonksiyonundan yardım alıyoruz.Üçüncü satırda kamera değişkenimizin, position değerlerini değiştiriyoruz.Yeni bir Vector3 değişkeni oluşturuyoruz.
Daha sonra x ve y eksenlerine, kameranın konumu için oluşturduğumuz “TankKamerasi” değişkenimizin ilgili eksendeki position değerlerine eşitliyoruz.Ben z ekseni için kendime göre bir ayar yaptım.Siz isterseniz bu eksendeki değeri de, oluşturduğumuz değişkenin değerine eşitleyebilirsiniz.Dördüncü satırda ise, kamera değişkenimizin rotation değerlerini değiştiriyoruz.Yeni değerleri oluşturmak için, Quaternion kodundan yararlanıyoruz.
Yine bir önceki satırda olduğu gibi, kamera nesnemizin geleceği konumu belirlemek için oluşturduğumuz değişkenin rotation değerlerini çekiyoruz.Kameramızın takip pozisyonu ve açısını tamamen oluşturduğumuz nesneye göre belirledik.Bu nesnenin durduğu konumu, kameramız referans alıyor ve tankımızı takip ediyor.Eğer pozisyon ve açılarında değişiklik yapmak isterseniz, ilgili nesnenin konumunu değiştirebilirsiniz.Geri dönecek olursak son satırda, tankımızın hızı için oluşturduğumuz değişkenimize bir değer veriyoruz.
Tankımızı harekete geçirelim.
Evet kameramız artık, istediğimiz açıdan tankımızı takip edecektir.Şimdi, tankımızı hareket ettirmeye geçelim.
void TankHareketi () { TankPaleti.transform.Translate (Input.GetAxis("Vertical")* Vector3.forward * TankHizi * Time.deltaTime); TankPaleti.transform.Rotate(0f, Input.GetAxis ("Horizontal") * TankHizi, 0f); }
Bunun için yeni bir fonksiyon oluşturuyoruz.Bu fonksiyonumuzun içerisinde, tankımızın hareket mekanikleri bulunacak.İkinci satırda, takımızın paleti için oluşturduğumuz değişkeni kullanıyoruz.Bu değişkenimizde tanımlı bulunan nesneyi, Translate fonksiyonu ile harekete geçiriyoruz.Buradaki hareket, sadece ileri ve geri yönde gerçekleşiyor.Bunu yapmak için, “Input.GetAxis(“Vertical”)” kodundan yararlanıyoruz.Daha sonra hareket yönünü belirliyoruz.Bunun içinde, “Vector3.forward” kodunu kullanıyoruz.
Son olarak ise, hareket hızımız için oluşturduğumuz değişkeni ekliyoruz ve her karede aynı hızı vermek için, Time.deltaTime fonksiyonu ile çarpıyoruz.Artık ileri ve geri yönde hareket edebiliyoruz.İkinci satıra gelecek olursak değişkenimizde tanımlı nesnemizi sağa ve sola döndürmek için, Rotate fonksiyonundan yararlanıyoruz.Bu fonksiyonun aldığı parametrelere bakalım.
İlk satırda x ekseninde bir dönüş olmayacağı için değerini sıfır “0” olarak belirliyoruz.İkinci satırda yani y ekseninde sağa ve sola dönüş işlemini gerçekleştireceğiz.Bunu yapmak için, “Input.GetAxis (“Horizontal”)” kodunu yazıyoruz ve tankımızın hızı için oluşturduğumuz değişken ile çarpıyoruz.Daha sonra z ekseninde herhangi bir dönüş olmayacağı içinde, değerini sıfır “0” olarak belirliyoruz.
TankHareketi ();
Tankımızın hareket mekaniklerini oluşturduk.Yazdığımız bu hareket mekaniği fonksiyonunu kullanabilmek için bu kodu update() fonksiyonumuzun içerisine yazıyoruz.Artık tankımızı harekete geçirebiliriz.İlk bölümde yazacağımız kodları tamamladık.Script dosyamızı hazırlamış bulunmaktayız.
Evet tank yapımı projemizin ilk aşamasını tamamladık.Şimdi oluşturduğumuz bu C# Script dosyamızı, tankımızın Hierarchy penceresindeki ebeveyn yani parent nesnesinin üzerine sürükleyip bırakıyoruz.Daha sonra Inspector penceresinde, script dosyamızda oluşturduğumuz değişkenleri dolduruyoruz.Burada kamera hariç diğer bölümlere ne eklenmesi gerektiği isimlerinde anlaşılıyor diye düşünüyorum.Evet bir sonraki yazıda görüşmek üzere…