Unity’de Kamera Takibi Nasıl Yapılır?

Unity’de Kamera Takibi Nasıl Yapılır?

1 Şubat 2020 0 Yazar: Ahmet Güler

Merhaba, bir önceki yazımızda Unity ile hareketli arkaplan yapımını öğrenmiştik.Bu sayede, istediğimiz bir nesnenin kaplamasını dinamik olarak değiştirebiliyorduk.Bügünkü dersimizde ise, istediğimiz bir nesneyi kamera ile takip ettireceğiz.Vakit kaybetmeden dersimize başlayalım.Öncelikle yeni bir proje oluşturuyoruz.

Sahneye gerekli nesnelerin eklenmesi.

Bugünkü projemizin senaryosuna bakalım.Bir yolumuz olacak ve bir nesne bu yol üzerinde hareket edecek.Bu nesneyi bir kamera ile takip edeceğiz.Yalnız bu sefer hareket edecek nesneyi, Unity‘de hazır bulunan nesnelerden kullanmak yerine bir model kullanacağım.İlk olarak sahnemize bir Plane nesnesi ekleyerek başlayalım.Bu nesne bizim yolumuzu oluşturacak.Daha sonra bu Plane nesnesinin z eksenindeki Scale değerini arttırıyoruz.Bu değer, uzun bir yol oluşturacak şekilde olmalıdır.

Sonra bu nesneye bir kaplama ekliyoruz.İnternetten istediğiniz bir kaplamayı kullanabilirsiniz.Şimdi yine internetten bulabilecğiniz bir araç modelini indiriyoruz.Eğer Unity‘de bulunan hazır nesneleri kullanmak isterseniz hiç sorun olmaz.Bu araç modeli yerine, bir Cube nesnesi de kullanabilirsiniz.Model kullanmak isteyenler için, bulduğunuz modelin .fbx uzantılı halinin olmasına dikkat ediniz.Bu modeli sürükleyerek Project penceresine bırakıyoruz.

Inspector penceresinde yapmamız gereken bir iki ayar bulunuyor.Bunlara şu an için girmeyeceğim.Project penceresine eklediğimiz bu modeli sürükleyerek, Hierarchy penceresine yada doğrudan Scene penceresine bırakıyoruz.Sonra yeni bir etiket oluşturarak hareket edecek nesnemize bu etiketi ekliyoruz.Sahnemizde durması gereken pozisyonları ayarladıktan sonra artık kod yazmaya hazırız.Sahnemizin son hali bu şekildedir.

unity-kamera-takibi-yapmak-camera-fallow

Kameramıza takip edebileceği bir hedef verelim.

Evet, öncelikle iki adet script dosyası oluşturacağız.Birinci dosyamıza, kameramızın hedef nesneyi takip edebilmesi için gerekli kodları yazacağız.İkinci dosyamızda ise, hedef nesnenin hareket edebilmesi için gerekli kodlar bulunacak.Şimdi Project penceresinde iki adet C# Script dosyası oluşturalım ve ilk script dosyamızı editör ile açarak kod yazmaya başlayalım.

public Transform TakipNesnesi;
public float TakipHizi;
public Vector3 Kamera;

İlk olarak, kamera takibinde kullanacağımız değişkenleri oluşturmakla başlayalım.Birinci satırda, kamera ile takip edeceğimiz nesnenin pozisyonunu öğrenmek için bir Transform değişkeni oluşturuyoruz.İkinci satırda, kameramızın hızını ayarlamak için float türünde bir değişken oluşturuyoruz.Son satırda ise, bir Vector3 değişkeni oluşturuyoruz.Bu değişken ile dinamik olarak kameramızı x, y ve z eksenlerinde hareket ettirebileceğiz.

TakipNesnesi = GameObject.FindWithTag ("arac").transform;
TakipHizi = 0.5f;
Kamera = new Vector3 (0, 2f, -5.5f);

Şimdi start() fonksiyonunun içerisine bu kodları yazalım.İlk satırda değişkenimize, etiketi “arac” olan nesnenin pozisyonunu eşitliyoruz.İkinci satırda, kameramızın takip hızını kontrol edeceğimiz değişkene bir değer veriyoruz.Son satırda ise kameramızın pozisyonunu kontrol edeceğimiz Vector3 değişkenine, yeni bir pozisyon değeri veriyoruz.Bu değerleri ben kendi sahneme göre ayarladım.Siz projeniz başladığında, kameranızın hangi pozisyonda durmasını istiyorsanız o değerleri verin.

Vector3 ReferansHiz = Vector3.zero;
Vector3 AradakiMesafe = TakipNesnesi.position + Kamera;
Vector3 KameraPozisyonu = Vector3.SmoothDamp (transform.position, AradakiMesafe, ref ReferansHiz, TakipHizi * Time.deltaTime);
transform.position = KameraPozisyonu;
transform.LookAt (TakipNesnesi);

Şimdi LateUpdate() fonksiyonunun içerisine bu kodları yazıyoruz.Bu projede kamera için update() fonksiyonunu kullanmayacağız.Nedeni ise LateUpdate fonksiyonunun, update fonksiyonundan sonra çalışması ve hareketli nesnelerde hareket gerçekleştikten sonra kameranın takip etmesinin daha doğru ve kullanışlı olmasıdır.Şimdi ilk satırda, yeni bir Vector3 değişkeni oluşturuyoruz.Bu değişkenin değerini Vector3.zero olarak belirliyoruz.Yani  “new Vector3 (0,0,0)” olarak da açıklayabiliriz.

İkinci satırda tekrar bir Vector3 değişkeni oluşturuyoruz.Bu değişken ise, takip edeceğimiz nesne ile kamera nesnemizin pozisyon değerlerini toplayarak aradaki mesafeyi hesaplayacak ve içerisinde tutacak.Üçüncü satırda kullanacağımız Vector3 değişkeni ise asıl işi yapacak fonksiyonu içerisinde tutuyor.Bu fonksiyon, SmoothDamp fonksiyonudur.Hareketli bir nesnenin takip edilmesinde gayet yumuşak ve başarılı geçişler yaptığı için bu fonksiyonu kullanacağız.Bu fonksiyon toplamda altı “6” adet parametre alıyor.

Biz bu projede dört “4” tanesini kullanacağız.Bu parametreler nesnenin pozisyonu, nesne ile kamera arasındaki mesafeyi hesapladığımız değer, referans değeri ve takip hızı.Dördüncü satıra baktığımızda, nesnenin pozisyonunu (kameradan bahsediyorum.) az önce belirlediğimiz yeni pozisyona eşitliyoruz.Son satırda ise LookAt fonksiyonunu kullanarak, kamera nesnemizin sürekli olarak hedef nesneye doğru bakmasını sağlıyoruz.Böylelikle sürekli değiştirdiğimiz eksen değerleri sonucunda, kamera nesnemiz hep hedef nesneye doğru bakacaktır.Evet bu script dosyamızı hazırladık.

Sahnemizde bulunan araç modelimizi harekete geçirelim.

Şimdi sıra, ikinci script dosyamıza gerekli kodları yazmaya geldi.Bu dosyada tek bir kod bulunacak.Bu kodda projemizi başlattığımız zaman, araç nesnemizi sürekli hareket ettirecek.Böylelikle kameramız hedef nesneyi takip ederken dinamik olarak açısını değiştirebileceğiz ve bir hata olup olmadığını kontrol edebileceğiz.

public float AracHizi;

İlk olarak float türünde bir değişken oluşturuyoruz.Bu değişken ile aracımızın hızını istediğimiz gibi belirleyebileceğiz.

AracHizi = 5f;

Daha sonra start() fonksiyonunun içerisinde, oluşturmuş olduğumuz bu değişkene bir değer veriyoruz.

transform.Translate (Vector3.forward * AracHizi * Time.deltaTime);

Son olarak da, update() fonksiyonunun içerisine bu kodu yazıyoruz.Aracımızı hareket ettirmek için Translate fonksiyonundan yararlanıyoruz.Böylelikle istediğimiz bir doğrultuda aracımızı oluşturan nesneyi hareket ettirebiliyoruz.Tabi bunu yaparken, araç hızımızı belirleyen değişken ile Time.deltaTime fonksiyonunu çarpıyoruz.Bu sayede her karede aynı hızda gidecek olan bir nesnemiz oluyor.Evet bu script dosyamız da artık hazır duruma geldi.

Evet şimdi yazmış olduğumuz bu iki script dosyasını kullanacağımız nesnelerin üzerine sürükleyip bırakalım.Kamera için yazmış olduğumuz dosyayı, ana kamera (main.camera) nesnemize ekliyoruz.Hareket için yazmış olduğumuz script dosyasınıda, hareket etmesini istediğimiz ve kameramızın takip edeceği nesneye ekliyoruz.Böylelikle bir projemizin daha sonuna geldik.Bir sonraki yazıda görüşmek üzere…

unity-kamera-takibi-yapmak-camera-fallow