
Unity’de Kamera Hareketini Sınırlandırmak
Merhaba, bir önceki yazımızda Unity‘de nesneleri parçalamayı öğrenmiştik.Böylelikle projelerimize daha çok dinamik kazandırmamız mümkün oluyor.Bugünkü yazımızda ise, projelerimizde kullandığımız kameraların açılarını nasıl sınırlandırabileceğimizi öğreneceğiz.Bu birçok yerde işimize yarayan bir fonksiyon.Çünkü her yerde kameramızın 360 derece hareket etmesini istemeyiz.Lafı uzatmadan yeni bir proje açalım ve dersimize başlayalım.
Projemizde kullanacağımız senaryonun belirlenmesi.
Evet bu proje için, bir insan modeli oluşturacağız.Oluşturduğumuz bu modelin kafasına, projemizde bulunan “Main.Camera” nesnesini çocuk olarak atayacağız.Önceki yazılarımda ebeveyn-çocuk ilişkisini anlatmıştım.Daha sonra bu kafayı, kameramızın hareketine göre hareket ettireceğiz.Tabi bu hareketi de fare ile sağlayacağız.Sahnemize nesnelerimizi eklemeye başlayalım.Öncelikle birazdan oluşturacağımız insan modelini ben kaba taslak bir biçimde oluşturdum.
Siz büyük ihtimal kendi projenizde zaten hazırda bulunan bir nesnenin kamera hareketini kontrol edeceğiniz için bu kısımlara çokta dikkat etmenize gerek yok.Sıfırdan yapacaklar için devam ediyoruz.İlk olarak, Hierarchy penceresinde sağ tıklıyoruz ve Create Empty seçimini yapıyoruz.Bu boş nesnemiz bizim insan modelimizi oluşturacak bütün nesnelerin ebeveyn nesnesi olacaktır.Daha sonra bu nesnemize sağ tıklıyoruz ve 3D Object > Cube seçimini yapıyoruz.Bu küp nesnelerinden yedi tane oluşturuyoruz.Bunların her biri insan modelimizin çeşitli yerlerini oluşturacaktır.
Bunları Scene penceresinden istediğimiz gibi şekillendirebilirsiniz.Daha sonra bu vücudumuza bir tane kafa ekliyoruz.Bunu ebeveyn nesnemize sağ tıkladıktan sonra sırasıyla, 3D Object > Sphere seçimi ile yapıyoruz.Bu küre bizim kafamızı temsil edecek.Bu küre nesnemizi seçiyoruz ve yeni bir etiket vermek için Inspector penceresinden tag bölümüne tıklıyoruz.Daha sonra aşağıda bulunan “add tag” butonuna basıyoruz ve yeni bir etiket ekliyoruz.Daha sonra bu etiketi kafa nesnemize veriyoruz.
Ben kafa hariç diğer kısımlar için material dosyası kullandım.Kafa kısmında kameramız olacağı için nereye baktığımızı daha iyi gösterebilmek adına bir yüz kaplaması kullandım.Ayriyeten kafa nesnesine gözlük ve şapkada yaptım.Dediğim gibi bizim için sadece kafa kısmı önemli.Gerisi sizin hayal gücünüze kalmış.Son olarak da bir Plane nesnesi ekledim ve bir kaplama ekledim.Bu insan nesnemizin üzerinde duracağı zemini oluşturacak.Şimdi sahnemiz hazır durumda.
Kamera açısını sınırlandıralım.
Öncelikle Project penceresinden yeni bir C# Script dosyası oluşturuyoruz.Daha sonra bu dosyamıza yeni bir isim veriyoruz ve sürükleyip insan yani ebeveyn nesnemizin üzerine bırakıyoruz.Daha sonra editör ile açıyoruz.
public Camera Kamera; public GameObject Kafa; public float FareHassasiyeti = 50f; public float KameraninXSiniri = 20f; public float KameraninYSiniri = 20f; public float FareninXEkseni; public float FareninYEkseni;
Evet ilk olarak projemizde kullanacağımız değişkenleri yazıyoruz.İlk satırda kamera nesnemize erişmek için değişkenimizi yazdık.Daha sonra bir GameObject tanımlıyoruz.Bu değişkenimize, kameramızın geleceği nesnemizi ekleyeceğiz.Üçüncü satırda, fare hareketimizin hızını ayarlamak için float türünde bir değişken oluşturuyoruz.Yine aynı şekilde, bu sefer kamera açılarını sınırlandırmak için değişkenlerimizi oluşturuyoruz.Altı ve yedinci satırlarda ise, projemizi başlattığımızda farenin o anki x ve y eksenini öğrenmek için değişkenleri oluşturuyoruz.
Kamera = Camera.main; Kafa = GameObject.FindWithTag ("kafa"); Kamera.transform.parent = GameObject.FindWithTag ("kafa").transform; Kamera.transform.position = GameObject.FindWithTag ("kafa").transform.position; Kamera.transform.rotation = GameObject.FindWithTag ("kafa").transform.rotation; Cursor.lockState = CursorLockMode.Locked;
Şimdi start() fonksiyonumuzun içerisine bu kodları yazıyoruz.İlk satırda kamera değişkenimizi, ana kameramıza eşitliyoruz.İkinci satırda “Kafa” değişkenimizi, etiketi “kafa” olan nesneye eşitliyoruz.Bunu sağlamak için, FindWithTag fonksiyonundan yaralanıyoruz.Üçüncü satırda kamera nesnemizi, etiketi “kafa” olan nesnenin çocuk (child) konuma getiriyoruz.Yani etiketi “kafa” olan nesne ebeveyn (parent) görevi görecek.Dördüncü satırda ise kamera nesnemizin pozisyon değerini, ebeveyni olan nesne ile eşitliyoruz.
Aynı şekilde beşinci satırda kamera nesnemizin rotasyon değerlerini, ebeveyni olan nesne ile eşitliyoruz.Son satıra baktığımızda ise fare imlecimizi, ekranımızın ortasına kilitliyoruz.Fare imlecimiz standart olarak görünmez konumda oluyor.Eğer fare imlecini kilitlemek istemiyorsanız bu kodu silebilirsiniz.Yada “CursorLockMode.Confined” olarak yazarsanız, fare imleciniz kilitlenmeyecektir.
FareninXEkseni -= Input.GetAxis("Mouse Y") * FareHassasiyeti * Time.deltaTime; FareninYEkseni += Input.GetAxis("Mouse X") * FareHassasiyeti * Time.deltaTime; FareninXEkseni = Mathf.Clamp(FareninXEkseni, -KameraninXSiniri, KameraninYSiniri); FareninYEkseni = Mathf.Clamp(FareninYEkseni, -KameraninXSiniri, KameraninYSiniri); Kamera.transform.localRotation = Quaternion.Euler(FareninXEkseni, FareninYEkseni, 0); Kafa.transform.localRotation = Quaternion.Euler(FareninXEkseni, FareninYEkseni, 0);
Şimdi update() fonksiyonumuzun içerisine bu kodları yazıyoruz.İlk satıra baktığımızda faremizin y eksenini “FareHassasiyeti ” değişkeni ile çarpıp, kare hızını eşitlemek için Time.deltaTime fonksiyonu ile tekrar çarptık.Daha sonra faremizin x eksenine eşitledik.Eşittirin başında bulunan eksi “-” işaretini ise, fare hareketi sırasında kameramızın doğru eksene dönmesi için ekliyoruz.İkinci satırda yine ilk satırda yaptıklarımızı yapıyoruz.
Ancak bu sefer faremizin x ekseni ile işlem yapıp, bunu faremizin y eksenine eşitliyoruz.Ve daha sonra kameramızın doğru eksende hareketini sağlamak için eşittirin başına artı “+” işaretini koyuyoruz.Üçüncü ve dördüncü satırlar bizim asıl işimizi yapacak fonksiyonları barındırıyor.Mathf.Clamp fonksiyonu, script dosyasını eklediğimiz nesnenin açısını vereceğimiz iki değer arasına hapsediyor.Örneğin minimum değeriniz sıfır “0” ve maksimum değerinizde elli “50” olsun.
Artık bu iki değer arasında hareketinin sınırlandırılmış oluyor.Bu fonksiyon üç parametre alıyor.İki parametresini az önce değindik.Üçüncü parametresi ise, hapsedilecek değeri alıyor.Mesela biz bu projede kameramızın hareketinin sınırlandırmak için faremizin x ve y eksenlerini hapsedeceğiz.Beşinci ve altıncı satırlarda ise, kamera ve kafa hareketlerini sağlayacak fonksiyonlar bulunuyor.Her iki nesnemize de localRotation fonksiyonunu kullanıyoruz.Bunun yerine rotation‘da kullanabilirdik.
Aralarındaki fark, eğer kullanacağımız nesneler çocuk (child) konumunda değilse yani bir ebeveynleri yoksa rotation fonksiyonunu kullanmak doğru olur.Ancak bu projede her iki nesnede çocuk (child) konumunda yer aldıkları için, localRotation fonksiyonunu kullanıyoruz.Yani burada aldığımız rotasyon dünyaya göre değil, ekli olduğumuz ebeveyn nesnesine göre hesaplanır.Son olarak da, Quaternion.Euler fonksiyonu ile nesnelerimizi x ve y eksenlerinde aldığı değerlere göre döndürüyoruz.Evet kodlarımızı tamamladık.
Bir projemizin de sonuna geldik.Bu yazımızda kamera hareketini sınırlandırmayı öğrendik.Kamera hareketimizin sınırlarını, “KameraninXSiniri” ve “KameraninYSiniri” değişkenlerindeki değerler ile oynayarak ayarlayabilirsiniz.Bir sonraki yazıda görüşmek üzere…