Taramalı tüfekli bir oyun - #Devlog 2
Son blogdan bu yana 21 gün geçmiş! 21 gün! Tabi bu süreçte mojitomu yudumlayıp yatımla Cayman adalarına gezmeye gitmedim.(gözler yaşlı)
Hemen araya sıkıştırayım; Önceki blogu okumadıysanız, şuradan bir göz atmak isteyebilirsiniz.
Özet
Yaklaşık 2 haftalık bir süreç boyunca düşmanların spawn olma sistemleri ile uğraşmak durumunda kaldım, son bir haftadır da diğer sistemleri rayına oturtmaya çalışıyorum. Ancak görünen o ki, düşman spawn sisteminde yaptığım bazı değişiklikler sistemi kararsız hale getirdi. Bu nedenle büyük ihtimalle bu sistemi önümüzdeki günlerde refactor edeceğim.
2.Hafta (ilk blogun kaldığı yerden devam eder)
Oyunun tek mekaniği düşmanları yoketmek. Bunun için de düşmanların tamamen rastgele spawn olması çok mantıksız bir yoldu. Diğer bir yol da, genelde geliştiriciler tarafından tercih edilen "elle girme" yöntemi, hemen yanlış anlamayın, buradaki konsept nasıl bir düzenle spawn olacağının TEK TEK VE EL İLE EDİTÖRDEN yazılması. Bu noktada birçok değişken var.
- Düşmanların tipi
- Düşmanların sayısı(tek seferde kaç tane spawn olacak)
- Spawnlar arasında ne kadar bekleme olacak
- Waveler arasında ne kadar bekleme olacak
- İlerleyen dalgalarda(wavelerde) zorluğun dengeli bir şekilde artması
Özellikle son maddenin altını çizme sebebim, bunun genelde gamedesigner ve testerlar tarafından yapılan uzuun bir süreç olması, çünkü çok ince ayarlamalar ile(finetuning) tüm düşmanlar için ve tüm haritalar için bunun yapılması gerekiyor. Benim ise malum ne o kadar zamanım ne de param olmadığı için her programcının en hakiki dürtüsü olan otomatize etme isteğine uyarak otomatize etmem gerektiğine karar vermem ile sonuçlandı bu süreç.
Geçtiğimiz haftalarda bir paylaşım yaparak spawn algoritmamı paylaşmıştım, çalışma prensibini soran bir arkadaşımıza da bir video ile durumu açıklamıştım. Ancak burada da belirtip videoyu ekleyeyim.
Sistem Sinüs dalgası üzerine dağılım yaparak zorluk seviyelerinin her dalgada artmasını ve otomatik dengelenmesini sağlıyor. Bu sayede dengeli bir rastgelelik ile tüm spawn dalgaları ayarlanabiliyor.
Bu sistemi çözmem yaklaşık 1.5 hafta sürdü. Çünkü düzgün bir spawn algoritması yazmak için iteratif olarak birçok formülizasyon yapmalıydım.
Hafta 3(En azından yarısı)
Algoritmik bir süreç ve kodda birçok iterasyondan sonra
- Pooling sistemi
- Spawn algoritması
- Düşman sürülerinin düzenini kontrol edebileceğiniz bir editör
yazıp çalışır hale getirdim. Sonuç ise gifte(~0MB) gördüğünüz gibi oldu.
Hafta 4
Bu hafta genel olarak, bir takım cilalamalar yapmaya harcandı.
- Düşmanların öyle laps diye spawn olmaması için gökten düşme efekti ekledim.(Ki bu sistemi sapıttırdı, videonun sonlarında görünüyor)
- Silahlara mermi limiti ekledim ve silah seviyelerini gösteren bir arayüz yaptım.
- Sonunda oyuncuya sağlık ve can tamlanması sistemi ekledim.
- Yeni dalga geldiğinde onu gösteren bir arayüz ve arka sistemlerini yaptım.
- Ve biraz da, silah spawn sistemiyle uğraştım. Şu an onunla uğraşmaya devam ediyorum 🙂
When your enemy spawn system trolls you😢 #indiedev #gamedevelopment #madewithunity pic.twitter.com/dqjKS38xKC
— Mert Kirimgeri (@m4ybetrue) July 28, 2019
Buraya kadar okuyup takip ettiğiniz için teşekkür ederim, Önümüzdeki haftalarda görüşmek üzere!
Grafikler çok tatlı, kırmızıları öldürmek daha uzun sürecek değil mi?
Onlar gecici konulmus dusmanlar. Yaratiklari modelleyecegim ve evet daha zor olacak. Bosslarda yolda 😜
Bu düşmanların Spawn olurken sapıtmasının nedeni poolda yeterli düşman kalmaması ve yeni yaratılan düşmanların aktif olma fonksiyonunun çalışmaması mı acaba, yoksa başka bir sorun muydu?
Aktif olma fonksiyonu yoktu hocam daha önceki implementasyonumda, sadece objeyi aktif edip sonra komponent ve değerleri aktif ettikten sonra tek tek aynı loopun içinde sıfırlıyordum. Çok kötü bir kod yazım şekli olduğunu biliyorum, zaten prototip üretmek için öyle yapmıştım.
Şimdiki sefer de ise birden çok sınıfım var ve her düşman artık bir sınıf ile türetiliyor. Bunların base sınıfında da abstract olarak OnWarmUp, OnSpawn ve OnDespawn metodları var. Bu sayede sorun şimdilik çözülmüş gibi duruyor.
Tabi düşmanların gökten spawn olup yere düştükten sonra sekmesi ve sonra hareket etmesi olayını önceden fiziklerle çözüyordum, şimdi bir Tween kütüphanesi kullanıyorum, daha mutluyum. 🙂
Nitekim aynı zamanda animatörde ölme animasyonu çağrıldıktan sonra modellerin base riginde de bir sapıtma oluyordu. Bu üstteki yeni modellerin animasyonunu büyük ihtimal blenderdan yapıp daha dikkatli olacağım böylece o sorunun da çözülmesini umuyorum 🙂
Görünür alan dışında türetilmeleri mümkün değil mi?
Mümkün, ama bir dizayn tercihi diyeyim bu 🙂 Ama duruma göre görünmeyen alanlardan türetmek de aklımda.
@mertkirimgeri; Bir de üretilme zaman aralıkları çok kısa olduğu için trollüyor olabilir mi?
@lterlemez Malesef degil😄 Sistemde bug vardi, yeniden yazdiktan sonra cozuldu gibi duruyor. Modellemeler bitince daha detayli testleri yapinca daha net anlasilacak 🙂
Youtube videonuz da, oyun/yazılım yapmanın o kadar kolay olmadığını; büyüklerimizin ön gördüğü gibi orta eğitimde sadece algoritma vermekle (hele problem çözme konusu da pas geçilerek) olmayacağının, yeri geldiğinde matematik, fizik, kimya (çok güzel bir örnek verilebilir, Oxygen Not Included) vd konuların da gerektiğine çok güzel bir örnek teşkil etmiş.