Cumbus Wars: Bir Web Oyununu Unity'de Baştan Yazmak
Cumbus Wars bir tarayıcı oyunu olarak başladı: Three.js ile çizilen küçük bir savaş alanı, birbirine WebRTC ile bağlanan oyuncular, Redis’te tutulan skorlar. Arkadaşlarla bir akşam oynamak için yeterliydi. Telefonda ise hep bir şeyler eksikti. Dokunmatik kontroller sonradan eklenmiş gibi duruyordu, zayıf telefonlar zorlanıyordu ve tarayıcı oyunu bir türlü “uygulama” hissi vermiyordu.
Bu yüzden ikinci sürümü Unity’de, telefon için baştan yazdım. Kendime koyduğum kural basitti: web sürümünü unut, bu başka bir proje. Eski koddan yalnızca sayıları aldım: silahın hasarı, tankın canı, kalenin fiyatı, haritaların arazi fonksiyonları. Geri kalan her şey yeni.

Oyun ne
Herkesin herkese karşı olduğu hızlı bir savaş. Bir maç 10 dakika sürüyor ya da biri 30 öldürmeye ulaşınca bitiyor. Bitince kazanan ve sıralama ekranı geliyor, 12 saniye sonra yeni maç başlıyor.
Herkes tüfekle ve sıfır parayla başlıyor. Para üç yerden geliyor: sahaya düşen paraları toplayarak, oyuncu vurarak (kafadan vurmak daha çok kazandırıyor) ve bot vurarak. Kazandığın parayla üç şey yapabiliyorsun:
- Silah almak: tabanca, pompalı ya da keskin nişancı tüfeği. Aldığın silah ölünce de elinde kalıyor; yeni maçta herkes yine tüfeğe dönüyor.
- Tanka binmek: haritada bir tane var. Topu bir askeri tek atışta düşürüyor; tüfekle vurulursa uzun süre dayanıyor ama yenilmez değil.
- Kale kurmak: durduğun yere bir kale çıkıyor ve komutan oluyorsun. Artık yürüyüp ateş edemiyorsun ama kendi askerlerini basıp savaşa yolluyorsun. Onların öldürdükleri sana yazılıyor. Kale yıkılırsa ordun da gidiyor.
Bu üçünün arasındaki seçim oyunun asıl kararı: parayı silaha mı yatıracaksın, yoksa bir süreliğine savaşın dışına çıkıp bir ordu mu kuracaksın?
Beş harita, biri sadece bu sürümde
Cephe, Çöl Kasabası, Karlı Vadi ve Gece Limanı web sürümünden geldi. Aynı arazi fonksiyonları ve aynı tohumla yerleştirilen nesnelerle birebir taşındılar.
Beşincisi Eski Şehir yalnızca bu sürümde var ve en çok uğraştığım harita oldu. Bir ila üç katlı ev blokları, aralarında dar sokaklar, tankın sığamadığı iki metrelik ara geçitler, ortada çeşmeli bir meydan. Park etmiş arabalar, kum torbaları ve pazar tezgâhları siper oluyor. Tank yalnızca ana caddede rahat dolaşıyor, kale de yalnızca açık yerlere kurulabiliyor.
Yukarıdan bakan bir oyunda ev dolu bir harita kendi sorununu getiriyor: kamera ile asker arasına bir ev girince askeri göremiyorsun. Çözüm, araya giren evin saniyenin beşte birinde yarı saydam olması ve asker uzaklaşınca geri gelmesi.

Telefonda nişan almak
Telefonda bir nişancı oyununun en zor kısmı kontroller. Sol yarıda hareket çubuğu, sağ yarıda nişan var; sağ altta büyük, kırmızı bir ateş düğmesi. Nişan almak ve etrafa bakmak hiçbir zaman ateş etmiyor. Bunu bilerek ayırdım, çünkü bakarken yanlışlıkla ateş etmek telefonda en sinir bozucu şey.
İki görünüm var: yukarıdan bakış ve birinci şahıs. Birinci şahısta isteğe bağlı bir nişan yardımı var. Nişangâh bir düşmana yaklaşınca bakış biraz yavaşlıyor, düşmanın hareketini kısmen takip ediyor ve ateş ederken hafifçe gövdeye çekiliyor. Kilitlemiyor; yalnızca parmağın kaba hareketini biraz düzeltiyor. Bilgisayarda ise WASD, fare ve sol tık var. Oyun hangi cihazda olduğunu kendisi anlıyor ve kontrolleri ona göre seçiyor.

Telefon ve tarayıcı aynı maçta
Ağ tarafında Unity’nin Netcode’unu, Relay ve Lobby servisleriyle kullandım. Maçı kuran oyuncunun cihazı aynı zamanda sunucu: vuruşlara, para dağıtımına ve satışlara o karar veriyor. Hızlı oyun seni açık bir maça saniyeler içinde sokuyor. İstersen oda kurup kodunu ya da davet bağlantısını paylaşabiliyorsun.
Unity’nin web sürümü de aynı odalara WebSocket üzerinden bağlanıyor. Böylece telefondaki, tabletteki ve tarayıcıdaki oyuncular, hiçbiri farkında olmadan aynı maçta buluşuyor. İnternet yoksa aynı Wi-Fi’daki cihazlarla ya da botlara karşı tek başına oynanabiliyor.
İki şeye özellikle önem verdim:
- Kurucu oyundan çıkınca maç bitmiyor. Oturum maçı kalan oyunculardan birine devrediyor. Yeni kurucu botları ve tankı yeniden kuruyor, herkes ona bağlanıyor.
- Bağlantın koparsa aynı odaya geri dönüyorsun. Oyun “Bağlantı koptu, yeniden bağlanılıyor…” diyor ve seni otomatik olarak aynı odaya sokuyor. Skorun ve paran hesabına bağlı tutulduğu için kaybolmuyor.
Botlar birbirleriyle de savaşıyor
Botları başta yalnızca oyunculara saldıracak şekilde yazmıştım. Az oyunculu maçlar bu yüzden boş ve tekdüze geliyordu. Botlar birbirine de saldırınca harita bir anda canlandı.
Botların üç zorluk seviyesi var. Canı yarının altına inen bot, düşmanın göremediği yakın bir yere koşup çömeliyor, birkaç saniye sonra çatışmaya dönüyor. Düşman gören bot, yakındaki botları aynı çatışmaya çağırıyor. Bir süredir kimsenin binmediği tanka kendisi biniyor, hasar görünce iniyor. Eski Şehir’in dar sokaklarında takılmasınlar diye açık yönleri yoklayarak yol seçiyorlar. Bu kısım en çok deneme yanılma isteyen yer oldu.

Sesin gecikmesi
Oyuna en çok atmosfer katan şey, ucuz bir hile: ses hızı. Uzaktaki bir atışı önce görüyorsun, sesi saniyede 343 metreyle sonra geliyor. Uzaklaştıkça ses boğuklaşıyor ve arkasından bir yankı geliyor; Çöl Kasabası’nda ve limanda daha güçlü, karda zayıf. Başının yanından geçen mermi vızıldıyor. Ayak sesleri zemine göre değişiyor: karda çıtırtı, limanda sert zemin, cephede toprak.
Seslerin çoğu ses dosyası değil, web sürümündeki sentez kodundan üretiliyor. Proje kurulurken WAV dosyalarına dönüştürülüyorlar.
Vazgeçtiklerim ve sonradan eklediklerim
- Sesli sohbet. İlk sürümde vardı ama Unity’nin web sürümünde ses karşı tarafa hiç ulaşmıyordu. Telefon ve tarayıcı aynı maçta olabildiği için yarım çalışan bir özellik yerine kaldırmayı seçtim. Yazılı sohbet kaldı.
- Raporlama ve engelleme. Yabancılarla oynanan bir oyunda sohbet olduğu için App Store incelemesi bunu istedi. Skor tablosundan bir oyuncuyu engellemek ya da raporlamak mümkün, sohbette de kelime filtresi var.
- Web’de daha hızlı açılış. İlk açılışta inen toplam 40 MB civarındaydı, 27 MB’a indi. Dokular telefonlar ve bilgisayarlar için ayrı biçimlerde paketleniyor, tarayıcı uygun olanı indiriyor. Maçta kare hızı uzun süre düşük kalırsa grafik kalitesi kendiliğinden bir kademe iniyor.
Hesap yok, reklam yok, uygulama içi satın alma yok. Türkçe ve İngilizce.
Cumbus Wars Google Play’de. Kurmadan denemek istersen tarayıcıda da oynayabilirsin; telefondaki arkadaşınla aynı maça girersin. (iPhone sürümü henüz App Store’da değil.)