Zombi Oyunu

Unity oyun motoru ile bir hafta süre içerisinde yaptığım bilgisayar oyunu. Oyun basitçe zombileri öldürüp hayatta kalma teması üzerine kurulu tps (third person shooter) tarzı bir oyun.


İndirme Linki / Download Link:

İndir “Zombie Game” ZombieGame.rar – 21 defa indirildi – 44 MB


Yakın zaman önce blender oyun motorundan unity oyun motoruna geçiş yaptım. Neden Unity oyun motoruna geçtiğimi başka bir yazımda paylaşırım belki. İki oyun motorunun da kıyas edilebilecek birçok özelliği var. Ancak blender oyun motorunun bana göre en büyük eksisi mobil platformlar için oyun geliştiremiyor olmamız, Unity ye geçmemin en büyük sebebi olarak bunu söyleyebilirim. Neyse konuya döneyim.

Oyun Fikri

Bu oyun fikri nereden çıktı. Unity ye geçtikten sonra bu oyun motorunu öğrenmek için araştırmalar yapmaya başladım. Youtube üzerinden birçok ders videosu izledim, kendim de öğrendiklerimi denemeye çalıştım ve takıldığım yerlerde de sıkça google da forumlarda, unity nin kendi dökümanlarında araştırmalar yaptım. Bir akrabam unity de mobil oyun geliştirme hakkında bir bootcamp (Kodluyoruz Bootcamp) ten bahsetmişti bana bende katılmak için başvuru yaptım. Online olarak bir yazılı sınava ve ardından sözlü mülakata tabi tutuldum ve ardından bootcamp e katılmaya hak kazandım 🙂

Bootcamp esnasında bize unity de interface kullanımı hakkında bir ders verildi. Dersin ardından da basitçe mermi, elma toplayabileceğimiz ve kapı açabileceğimiz bir senaryo için interface kullanarak bir yapı oluşturmamız istendi. Bunları sadece basitçe butonlara basarak yapmamız yeterliydi. Ayrıca isteğe bağlı olarak animasyon konusunda da araştırma yapmamız istendi. Ben bu ödevlerden yola çıkarak daha önce gördüklerimi de pekiştirmek adına bir oyun yapmaya karar verdim. Ödev için belirlenen süre bir haftaydı yani benimde bu oyunu bir hafta içinde yapmam gerekiyordu.

Karakterler ve Animasyonlar

Karakter ve animasyon yapımı ile uğraşarak vakit kaybedemezdim çünkü yapmam gereken diğer şeylerde düşünülünce yetişmeyeceği açıktı. Bende Mixamo dan faydalandım. Açıkçası animasyon yapımı konusunda da yetenekli değilim 🙂 Oyunda kullanacağım karakterler ve animasyonları buldum. Bunları Unity ye nasıl import edebileceğimle ilgili kısa bir araştırmanın ardından karakterlerim ve animasyonlar tamamdı.

Daha sonra karakterin hareket kodlarını ve hareketlere bağlı olarak oynatılacak animasyonları tetikleyecek sistemi oluşturmaya başladım. Açıkçası burası biraz zamanımı aldı. Animasyonlar arasında geçiş yapmak sandığımdan biraz daha karmaşık bir işlemmiş. Çünkü bir animasyon bitmeden bir başka animasyona geçmek gerekebiliyor veya daha zoru bir animasyon devam ederken başka bir animasyonunda oynatılması gerekebiliyor. Örneğin yürürken veya koşarken ateş etmek gibi. Bu durumda hem yürüme animasyonunu hem de ateş etme animasyonunu aynı anda oynatmak gerekiyor. Aslında animasyon konusunda hala tam anlamıyla yeterli seviyeye gelebildiğim söylenemez bu konuda biraz daha vakit harcamak gerekiyor.

Ateş Etme

Karakterin ateş etmesi için direk kameranın orta noktasından bir ışın gönderip, ışının çarptığı obje eğer düşman karakter ise ona hasar atacak bir kod yazabilirdim ancak ben işi biraz zorlaştırdım. Şöyle ki karakterin nişan alma, durma, yürüme ve koşma durumlarına göre ve aynı zamanda hedeften uzaklığa göre rastgele mermi yolu oluşturmak istedim. Bu durumda her atış hedefi kesin vurmayacak eğer nişan alınmış ise hedefi vurmak daha garanti olacaktı.

Bunu yapabilmek için şöyle bir yol izledim: Öncelikle karakterin durumuna göre çap katsayısı belirleyen bir kod yazdım bu kod ile karakter koşuyorsa büyük bir katsayı duruyorsa küçük bir katsayı hesaplanıyor ayrıca mousenin sağ butonuna basılı tutulunca da bu katsayı belli bir değere kadar azalıyor aynı zamanda hedef imlecide bu katsayıya göre küçülüyor veya büyüyor.

Daha sonra kameranın orta noktasından bir ışın gönderiyorum ve bu ışın çarptığı nokta ile kamera arasındaki mesafeyi ölçüyorum. Mesafe ile hareket durumuna göre belirlenen katsayıyı çarpıyorum ve bir çap değeri elde ediyorum.

Elde ettiğim bu çap değeri maksimum değerleri olacak şekilde bir vektör oluşturuyorum. Oluşturduğum vektörü ilk ışın vektörü ile topluyorum. Şimdi merminin ulaşacağı konum belirlenmiş oldu. Bu konuma kameranın orta noktasından ikinci bir ışın gönderiyorum ve ikinci ışının çarptığı objeyi belirliyorum.

Düşman Karakterin Fizik Yapısı

Düşman karaktere mesh collider ekleyerek kısa sürede düşmanın fiziğini oluşturabileceğimi sanıyordum ancak yanılmışım. Maalesef Unity düşman karakterin 3d modeline uygun bir şekilde mesh collider oluşturamadı. Diğer basit collider larda karaktere tam oturmadığı için karaktere dahil olmayan bir yere ateş edildiğinde karaktere hasar verebiliyor veya karaktere dahil olan bir yere ateş ettiğimde karaktere hasar veremeyebiliyordum. Bu sorunu çözmek için biraz araştırma yaptım ancak aradığımı bulamadım bende farklı şeyler denemeye başladım. Karakterin kemiklerine basit colliderlardan ekleme fikri geldi aklıma denedim ve istediğimden daha iyi bir sonuç elde ettim şöyle ki bu sayede karakterin neresine hasar attığımı da bilebiliyordum ve hasar atılan bölgeye göre farklı animasyonlar oynatabilir ve düşman karakterin canını bu bölgelere göre farklı oranlarda azaltabilirdim artık 🙂

Düşmana Hasar Atmak

Ateş etme başlığı altında nasıl hedef seçtiğimi anlattım. Ancak seçilen hedef karakter değil onun bir child ı olduğu için öncelikle düşman health kodunun bağlı olduğu ana objeye ulaşmam gerekiyordu. Bu işlem için gameObject.transform.Parent kullanılamaz çünkü ana obje hedef objenin ilk parenti olmayabilir. Hedef objenin ana objenin kaçıncı çocuğu olduğu bilinmediğinden bu kodu birkaç defa tekrarlamak şeklinde bir yöntemde izlenemezdi. Neyse ki ilk parenti bulmak için bir kod varmış 🙂 HedefObje.transform.root komutu. Ana objeye ulatıktan sonra gerisi kolay zaten ancak ben burada da hazır öğrenmeye çalışıyorken interface kullanayım dedim bu bağlamda eğer hedef obje düşmansa hasar atılmasını değilse ne olduğuna bağlı olarak farklı işlemler yapabilmenin önünü açmış oldum. Örneğin patlayıcı bir objeye ateş edildiğimde patlamasını sağlayabilir veya bir cama ateş ettiğimde kırılmasını sağlayabilirim…

Mekan Tasarımı

Zaman kısıtlı olduğu için bu aşamada da hazır model kullanmayı düşündüm ancak internetteki hazır modellerde genellikle hangi lisansa tabi olduğuna dair son derece yetersiz bilgi var ve ben lisansının ne olduğundan emin olamadığım bir modeli kullanmak istemedim. Bende kolları sıvadım kendi modellerimi yapayım dedim. Verilen ödevde kapı açmada olduğu için evin içine de girilebilir olsun istedim. Buna uygun olarak içine girilebilir ölçülü bir tek katlı ev modelledim, kaplama koordinatlarını çıkardım bazı basit dokuları oluşturdum, dokuları bake yaptım ve ev hazır 🙂

Hazırladığım ev modelinden beş tane kopyalayıp, daha önce sitemde yayımladığım ağaçlardan ve internette hazır bulduğum bir araba modelini de ciddi anlamda editleyerek bir sahne oluşturdum. Gerekli materyal atamalarını yapım fizik için gerekli basit modelleri de oluşturarak fbx formatında mekanı export ettim.

Diğer İşler

Yukarıda bahsettiklerimden başkaca bazı görsel efektler ekledim, kan efekti, ateş efekti vs. Son derece basit bir arayüz hazırladım. Sesleri https://freesound.org/ sitesinden buldum. Son derece güzel bir site ses efekti arayanlar için en iyisi diyebilirim. Objeler için materyalleri hazırladım ve ekledim. vs.

Sonuç

Bir hafta gibi çokta uzun olmayan bir sürede bu yaptığım oyun beni mutlu etti diyebilirim. Bu sürenin tamamını oyunu yapmaya harcamadığım da düşünüldüğünde ortaya çıkan sonuç yeterli seviyede diyebilirim. Oyunda hala bazı buglar var kayıt esnasında bir ara mermi sayısı -1 olmuştu 🙂 Ayrıca mermi için eklediğim efekt de tam hedef noktaya gitmiyor. Bazen de animasyonlar karışıyor geri yürüme animasyonu çalışırken ileri gidebiliyoruz 🙂 Tüm bu sorunlarda çözülebilir elbet ancak hedef bir haftada yapmak olduğu için bu projeyi bu seviyede sonlandırıyorum.

Oyun hakkında yorumlarınızı bekliyorum…

Bir cevap yazın