
Unity’de Kamera Açısı Değiştirmek (Transform.parent)
Merhaba, bir önceki yazımda Unity ile kamp ateşi yapmıştık.Bu kamp ateşini yaparken yine daha önceki yazılarımda değindiğim, parçacık sistemini kullanmıştık.Şimdi ise, kamera açılarını değiştirmeyi öğreneceğimiz bir proje yapacağız.Bu projede sadece bir kamera (main.camera) olacak ve bu kamerayı istediğimiz koordinatlara götürerek, farklı bir açı elde etmiş olacağız.Detaylara geçmeden önce yeni bir proje oluşturalım ve sahnemizi yapmaya başlayalım.
Sahnemize gerekli nesnelerin eklenmesi.
İlk olarak bu proje için oluşturduğum senaryoyu anlatayım.Ortada bir kutu nesnemiz olacak.Dört köşede ise direkler olacak.Bu direklerin üzerinde kameralar (kamera görünümlü nesneler) olacak.Biz ise yazacağımız kodlar ile ana kameramızı (main.camera) bu direklerdeki kamera pozisyonlarına taşıyacağız.Böylelikle farklı açılardan tek bir kamera ile görüntü alacağız.Şimdi, sahnemize bir Plane nesnesi ekliyoruz.Daha sonra üç tane Cube nesnesi ekliyoruz.
Bunlardan iki tanesi ile direk yapacağız.Geriye kalanla ise kamera yapacağız.Daha sonra bir tanede Cylinder ekliyoruz.Bu silindir nesnesi, kamera ile direği birbirine bağlayan aparat olacak.Bu nesnelerimizi gerekli şekillere soktuktan sonra, birbirlerinin alt nesnesi olacak şekilde ayarlıyoruz.Aşağıdaki resime bakarsak daha iyi anlaşılacaktır.Daha sonra bir Cube nesnesi daha oluşturuyoruz.Bu bizim sandığımız olacak ve sahnemizin ortasında yer alacak.Böylelikle kamera açımızın değiştiğini daha iyi anlayabileceğiz.Sonra bir etiket oluşturmamız gerekiyor.
Kamera nesnelerine yeni bir etiket vermek.
Bunun için herhangi bir nesnemizi seçiyoruz ve Inspector penceresinde bulunan “Tag” bölümüne tıklıyoruz.Açılan pencerede en altta bulunan “Add Tag” butonuna basıyoruz.Daha sonra artı “+” simgesine basarak yeni bir etiket isimi giriyoruz ve onaylıyoruz.Artık etiketimizi oluşturduk.Şimdi ise bu etiketi gerekli nesnelerimize ekleyelim.Bize bu projede kamera yaptığımız nesneler gerekiyor.
Bu yüzden sadece bu nesnelere etiketi ekliyoruz.Eklemek içinde yine aynı “Tag” bölümüne tıklıyoruz ve açılan pencereden az önce oluşturduğumuz etiketi seçiyoruz.Ben sahneme bir ışık daha ekledim.Bunu siz eklemeyebilirsiniz, şart değil.Son olarak material dosyaları oluşturuyoruz ve nesnelerimize ekliyoruz.Bu aşama sizin tercihinize kalmış.Ben projenin daha iyi anlaşılması için eklenmesi taraftarıyım.
Kameramıza açı vermek.
Evet, şimdi kod yazmaya geldik.Yen bir C# script dosyası oluşturuyoruz.Bunun için Project penceresinde sağ tıklayarak sırasıyla, Create > C# Script seçimini yapıyoruz.Daha sonra editörümüzde açıyoruz.
public Camera Kamera; public GameObject[] kameralariBul; public int sayi;
İlk olarak değişkenlerimizi oluşturmakla başlıyoruz.Kamera nesnemizi istediğimiz koordinata taşımak için önce tanımlamamız gerekiyor.İkinci satırda bir liste yapısı görüyorsunuz.GameObject sonuna eklediğimiz “[]” köşeli parantezler ile bunun bir liste olduğunu belirtiyoruz.Birden fazla kamera nesnemiz olduğu için bu yolu tercih ediyoruz.Üçüncü satırda ise, int türünde bir değişken oluşturuyoruz.Bu değişkeni, kameralar arasında geçiş yapabilmek için index görevinde kullanacağız.Birazdan daha iyi anlayacaksınız.
Kamera = Camera.main; kameralariBul = GameObject.FindGameObjectsWithTag("kameralar"); sayi = 4;
Evet şimdi, start() fonksiyonumuzun içine bu kodları yazıyoruz.İlk satırda kamera değişkenimizi sahnemizde bulunan kameraya eşitliyoruz.Daha sonra ikinci satırda, tüm kamera nesnelerimizi bulmak için FindGameObjectsWithTag fonksiyonundan yararlanıyoruz.Bu fonksiyon sayesinde, aynı etikete sahip tüm nesneleri bulabiliyoruz.Böylelikle “kameralar” etiketine sahip nesneleri kameralariBul listesine eklemiş oluyoruz.Son satırda ise, int türündeki değişkenimizi dört “4” olarak belirliyoruz.Bu projede dört tane kamera olacağı için bu sayıyı dört olarak belirledik.
if (Input.GetKeyUp(KeyCode.W) && sayi != 0) { sayi--; Kamera.transform.parent = kameralariBul [sayi].transform; Kamera.transform.position = kameralariBul [sayi].transform.position; Kamera.transform.rotation = kameralariBul [sayi].transform.rotation; Debug.Log (Kamera.transform.parent.name + " AKTiF!"); }
Şimdi gelelim update() fonksiyonunda kullanacağımız kodları yazmaya.İlk olarak bir koşul belirlememiz lazım.Bu koşul ile sahnemizdeki kameranın açısını değiştirebileceğiz.Ben burada, klavyeden “W” tuşuna basılıp bırakıldığında ve sayımız sıfıra “0” eşit olmadığında çalışmasını istedim.Koşulumuz gerçekleştiğinde ise, sayı değişkenimiz bir “1” azalıyor.Daha sonra üçüncü satıra gelelim.Bu satır oldukça önemli.Çünkü kameramızı kameralariBul listesindeki ilgili elemanın çocuk nesnesi yapıyoruz.
Daha önceki yazılarımda, ebeveyn-çocuk ilişkisini anlatmıştım.Kısaca değinirsek, transform.parent kodu ile sahnemizde ki istediğimiz bir nesnenin alt nesnesi yapabiliyoruz.Eşitliğin karşısına bakarsak, parantez içindeki “[sayi]” değişkeni bizim hangi kamera nesnemizin çocuğu olacağını belirliyor.Örneğin kameralariBul [2] dersek, listede yer alan ikinci eleman hangi kamera nesnesi ise o nesnenin alt elemanı yapıyor.Dördüncü satırda kameramızın konumunu, ebeveyn olan nesnenin konumu ile eşleştiriyoruz.
Böylelikle kameramız farklı bir konumdan bakıyor.Beşinci satırda, kameramızın açısını ayarlıyoruz.Eğer kameranızın açısı istediğiniz gibi olmazsa, yeniden ayarlamak için “Kamera.transform.localEulerAngles = new Vector3(x pozisyonu, y pozisyonu, z pozisyonu);” bu kodu kullanabilirsiniz.Altıncı satırda, hangi kameranın kullanıldığını anlamak için Console penceresine bir uyarı yazdırıyoruz.Evet buraya kadar koşulumuz doğru ise çalışacak kodları gördük.Şimdi koşul tutmaz ise yapılacaklara bakalım.
else { if (sayi == 0) { sayi = 4; } }
Eğer koşulumuz yanlışsa, önce sayı değişkenimizi kontrol ediyoruz.Yeni bir koşul oluşturuyoruz.Eğer sayı değişkenimiz sıfıra “0” eşitse, o zaman sayı değişkenimizi dörde “4” eşitliyoruz.Böylelikle tekrar baştaki kameraya dönebiliyor ve o açıdan bakabiliyoruz.
Evet bu projemizinde sonuna geldik.Bu projede önemli nokta, transform.parent koduydu.Bu kod sayesinde ebeveyn-çocuk ilişkisini oluşturabiliyoruz.Ve bununla da kalmıyor, projenizde ki pek çok soruna çözüm bulabiliyorsunuz.Bir sonraki yazıda görüşmek üzere…