Unity’de Kamerayı Sarsmak (Shake Camera)
Merhaba, bir önceki yazımızda Unity‘de ışınlanma sistemi yapmıştık.Böylece hedef nesneyi, bir noktadan başka bir noktaya götürebiliyorduk.Bugünkü yazımızda ise, Unity‘de kamerayı nasıl sarsabileceğimizi öğreneceğiz.Projenizde ki senaryoya göre bu mekaniği farklı yerlerde kullanmanız mümkün.Burada yapacağımız şey, sadece kameramızın pozisyonunu sürekli olarak değiştirmek.Böylece arka arkaya farklı pozisyon değerleri verdiğimiz kamera, güzel bir sarsıntı efekti oluşturuyor.Tabi sadece pozisyon değerleri ile oynamayacağım ve içerisine birkaç şey daha katacağım.Şimdi yeni bir proje oluşturalım ve dersimize başlayalım.
Sahnemizi hazırlamaya başlayalım.
Bu mekaniği farklı senaryolarda kullanmanızın mümkün olduğunu söylemiştim.Benim oluşturduğum senaryomda, bir dağın tepesinden düşen bir kaya olacak.Bu kaya zeminle temas ettiğinde, kütlesinin verdiği bir şiddetle kameramızı sarsmaya başlayacak.İşte bu kadar.Bize ilk olarak bir zemin lazım.Bunun için yeni bir Plane nesnesi oluşturuyoruz.Sonra bir Plane nesnesi daha oluşturuyoruz.Bu nesneyi ise, kayamızın yer ile teması sırasında oluşacak darbe izi için kullanacağız.Bu nesneye bir kaplama atıyoruz ve Prefab olarak dönüştürüyoruz.Artık sahnede ki nesneyi silebiliriz.
Daha sonra dağımızı oluşturmak için internette bulduğumuz 3D modellerden yararlanacağız.Aslında bir Cube nesnesi ile de, dağımızı oluşturabilirdik.Maksat kayamızın düşeceği bir yükseklik oluşturmak.Ancak sahnemizin biraz daha güzel görünmesi için modellerden yararlanıyoruz.Dağ için modelimizi bulduktan sonra, Unity’de projemize dahil ediyoruz.Daha sonra Scene penceresinden istediğimiz gibi boyutlandırıyoruz.Şimdi birkaç kaya modeli bulmamız gerekiyor.Bunları sahnemizde çeşitli yerlere konumlandıracağız.Bir tanesini ise, dağımızın üzerinden fırlatmak için kullanacağız.
Kaya modellerini projenize ekledikten sonra istediğimiz gibi boyutlandırıyoruz.Daha sonra bu kayaları sahnemize göre sağa sola konumlandırıyoruz.Şimdi gelelim, dağın üstünden düşecek asıl kayamızı oluşturmaya.Bu nesnemize öncelikle yeni bir etiket oluşturuyoruz ve ekliyoruz.Daha sonra Inspector penceresinden bir Rigidbody bileşeni ekliyoruz.Kayamızın yuvarlanması için fizik unsurlarına sahip olması gerekiyor.Ayrıca bu kaya modeline bir collider ekliyoruz.Bu önemli yoksa katı bir cisim olmayacaktır.Son olarak sahnemizdeki ambiyans için birkaç ışık ekliyoruz.Artık sahnemiz hazır.Son hali bu şekilde görünüyor.
Kodlarımızı yazmaya başlayalım.
Evet öncelikle iki adet C# Script dosyası oluşturuyoruz.Bu script dosyalarından birini, kameramızın pozisyonun değerlerini kontrol etmek için kullanacağız.Diğer script dosyasını ise, zemin ile teması kontrol etmek için kullanacağız.Şimdi ilk dosyamızı editör ile açalım ve kodlarımızı yazmaya başlayalım.
public GameObject kameraNesnesi; public Vector3 eskiKameraPozisyonu; public float sure;
İlk olarak değişkenlerimizi oluşturmakla başlıyoruz.İlk satırda, kamera nesnemizi kontrol etmek için bir değişken oluşturuyoruz.İkinci satırda, kameramızın pozisyon değerlerini saklamak için bir Vector3 değişkeni oluşturuyoruz.Son satırda ise, float türünde bir değişken oluşturuyoruz.Bu değişkende, kameramızın sarsıntı süresini hesaplayacağız.
kameraNesnesi = GameObject.FindWithTag ("MainCamera"); eskiKameraPozisyonu = kameraNesnesi.transform.position; sure = 0;
Şimdi start() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda GameObject değişkenimize, etiketi “MainCamera” olan nesnemizi eşitliyoruz.İkinci satırda değişkenimize, kamera nesnemizin o anki pozisyon değerlerini eşitliyoruz.Son satırda ise, değişkenimizin değerini sıfır “0” olarak belirliyoruz.
public IEnumerator KamerayiSalla(float MaxSure, float MaxSarsinti, float Titresim) { while (sure < MaxSure) { float kameraninXekseni = Random.Range (0f, MaxSarsinti) * Titresim; float kameraninYekseni = Random.Range (0f, MaxSarsinti) * Titresim; kameraNesnesi.transform.position = new Vector3 (eskiKameraPozisyonu.x + kameraninXekseni, eskiKameraPozisyonu.y + kameraninYekseni, eskiKameraPozisyonu.z); sure += Time.deltaTime; yield return null; } kameraNesnesi.transform.position = eskiKameraPozisyonu; }
Evet şimdi IEnumerator metodunu kullanarak yeni bir fonksiyon oluşturuyoruz.Bu fonksiyonda üç adet parametre kullanacağız.Bunlar kameranın sarsılacağı maksimum süre, rastgele belirleyeceğimiz sarsıntıların üst sınırı ve kameranın titreşim şiddeti.İkinci satırda bir while döngüsü oluşturuyoruz.Bu döngüyü belirlediğimiz maksimum süreye ulaşana kadar devam ettireceğiz.Yazdığımız koşulda da bunu görüyoruz.Üçüncü satıra bakacak olursak, kameramızın x ekseni için rastgele değerler belirliyoruz.
Bunu Random fonksiyonu ile yapıyoruz.Ve bu değeri titreşim için oluşturduğumuz değişken ile çarparak, şiddetini belirliyoruz.Dördüncü satırda bu sefer, y ekseni için aynı işlemleri yapıyoruz.Böylelikle her karede farklı bir pozisyon oluşuyor.Beşinci satırda kameramızın pozisyonunu, az önce rastgele elde ettiğimiz değerlere eşitliyoruz.Bunu için o anki x ve y pozisyonları ile yeni pozisyon değerlerini topluyoruz.Ancak ben kameranın z eksenini değiştirmedim.Siz isterseniz z ekseni içinde rastgele değerler oluşturabilirsiniz.
Altıncı satırda, süremiz için oluşturduğumuz değişkenin değerini arttırıyoruz.Bunu Time.deltaTime fonksiyonu ile yapıyoruz.Yedinci satırda ise, bir sonraki karenin gelmesini bekliyoruz ve while döngüsüne devam ediyoruz.Dokuzuncu satırda, kamera nesnemizin sarsıntıdan sonra değişken pozisyon değerlerini, başta oluşturduğumuz ve kameramızın pozisyonlarını sakladığımız değişkene eşitliyoruz.Bu script dosyamızı hazırlamış bulunuyoruz.
Teması kontrol etmek.
Şimdi ikinci script dosyamızı açalım.Bu dosyada, kaya nesnemizin zemin ile temasını kontrol edeceğiz.Bu temasa göre kameramızı sallamaya başlayacağız.Şimdi kodlarımızı yazmaya başlayalım.
kaya KayaScripti; public GameObject TasIzi;
Öncelikle değişkenlerimizi oluşturmakla başlıyoruz.İlk satırda, diğer script dosyasına erişmek için bir değişken oluşturuyoruz.İkinci satırda ise, kaya nesnemizin zemin ile teması sırasında oluşan darbeyi göstermek için bir GameObject değişkeni oluşturuyoruz.Zaten sahnemizi oluştururken bir Prefab nesnesi yapmıştık.
KayaScripti = GameObject.FindWithTag("kaya").GetComponent<kaya>();
Şimdi start() fonksiyonunun içerisine bu kodu yazıyoruz.Diğer script dosyasından veri çekebilmek için önce hangi nesnede tanımlı olduğunu göstermemiz gerekiyor.İşte burada etiketi “kaya” olan nesnenin, script bileşenine erişiyoruz.
void OnCollisionEnter(Collision Tetikleyici) { if (Tetikleyici.gameObject.tag == "kaya") { Instantiate (TasIzi, Tetikleyici.transform.position, TasIzi.transform.rotation); StartCoroutine (KayaScripti.KamerayiSalla(MaxSure: 2f, MaxSarsinti: 0.5f, Titresim: 5f)); } }
Daha sonra yeni bir OnCollisionEnter fonksiyonu oluşturuyoruz.Böylece her iki nesnenin çarpışmasını algılayabileceğiz.İkinci satırda, yeni bir koşul oluşturuyoruz.Eğer zemin ile temas eden nesnenin etiketi “kaya” ise koşulumuz aktif oluyor ve içerisinde yazan kodları çalıştırıyor.Üçüncü satırda, Instantiate fonksiyonu ile yerde oluşacak izi sahnemize ekliyoruz.Parantez içerisinde, Prefab nesnemizi tutan değişken, kayamızın pozisyonu ve Prefab nesnemizin açısı yer alıyor.
Dördüncü satırda ise StartCoroutine fonksiyonu yardımıyla, diğer script dosyamızda oluşturduğumuz “KamerayiSalla” fonksiyonunu çağırıyoruz.Tabi yanına parametrelerini de eklememiz gerekiyor.Yoksa Console penceresinde hata mesajı alırız.Parantez içerisinde manuel olarak bir takım değerler ekledim.İsterseniz bu değerleri, değişkenler yardımı ile de dinamik olarak kontrol edebilirsiniz.Evet bu script dosyamızı da tamamlamış bulunuyoruz.
Şimdi C# Script dosyalarını gerekli nesnelere ekleyelim.Zemin için oluşturduğumuz dosyayı sürükleyerek, Plane nesnemizin üzerine bırakıyoruz.Inspector penceresinde kaya izimiz için bulunan bölüme, Project penceresinde ki Prefab dosyamızı ekliyoruz.Daha sonra diğer script dosyamızı, kaya nesnemizin üzerine sürükleyip bırakıyoruz.Artık projemiz hazır duruma geldi.Evet bu projemizin de sonuna geldik.Bir sonraki yazıda görüşmek üzere…