AOY
TR EN
← Tüm projeler

TunnelPulse

OyuniOS · Android

Dönen tünelde dar boşluklara sığmak için kanatları katla — Unity ile yazılmış arcade refleks oyunu.

TunnelPulse — ana menü ve en iyi skor
Menü · en iyi skor
TunnelPulse — koşu sonu skor ekranı
Koşu sonu
TunnelPulse — market ekranı
Market
01

Ne yapıyor

TunnelPulse bir arcade refleks oyunu. Bir uzay gemisiyle dönen bir tünelin içinde ilerliyor, tünel boyunca gelen engellerin arasından geçiyorsunuz. Kontrol iki hareketten ibaret: sürüklemek gemiyi taşıyor, iki parmak kanatları katlıyor.

On iki engel tipi var ve hepsi aynı şeyi istemiyor. Oyun bunu dört eylem işaretiyle anlatıyor, her biri ayrı renkte: çoğunda yapılacak bir şey yok (süzül), dar delikte kanadı kapat, dilim ve kiriş engelinde yuvarlan ve açıklığı takip et, Yarıkta ise tam tersi — kanadı aç ve hizala.

Aynı kontrolün birbirine zıt iki kullanımının olması oyunun çekirdeği. Renk kodu bunu bir bakışta okutuyor, ama karar süresi bir saniyenin altında.

Koşu bittiğinde kaç metre gidildiği ve en iyi skorla farkı görünüyor. Menüde seviye, haftalık görevler ve market var; market iki sekmeli — gemiler ve oyunun para birimi AKIM (osiloskop temasından; İngilizcede AMP). Skor, oyuncu ve ekonomi servisleri ayrı bir sunucu projesinde duruyor.

02

Nasıl çalışıyor

Oyun Unity ve C# ile yazıldı. Sunucu tarafı ayrı bir projede: skor ve oyuncu servisleri için bir Fastify API’si ve bir yönetim paneli. Gelir tarafında AdMob ve RevenueCat var.

Tünel sahneye elle dizilmiyor

Tünel, engeller ve arayüzün büyük kısmı sahneye elle yerleştirilmek yerine çalışma anında üretiliyor. Bunun pratik sonucu şu: zorluk eğrisi, engel sıklığı ve boşluk genişliği gibi denge değerleri sahneyi yeniden kurmadan, sayı değiştirerek ayarlanabiliyor.

Bu da dengeyi tahminle değil ölçümle yapmayı mümkün kılıyor — bir değeri değiştirip aynı koşuyu tekrar oynatmak birkaç saniye sürüyor.

Çarpışma sabit, görsel ona uyduruluyor

Oyunda gemi görünümü satılıyor. Her geminin çarpışma kutusu kendi mesh’inden türetilseydi iki sonuç doğardı: ya bazı gemiler diğerlerinden dar olur (parayla avantaj), ya da her yeni gemi için bütün engellerin yeniden ayarlanması gerekirdi. İkisi de kabul edilebilir değil.

Bu yüzden çarpışma modeli analitik ve sabit: on üç örnek nokta — merkez, gövde çevresinde 45° aralıklı sekiz nokta ve iki kanatta ikişer nokta. Kanat katlandığında gövde yarıçapı büyüyor (0,40 → 0,62): dar delikten geçmenin bedeli gövdenin şişmesi.

Yeni bir gemi eklenirken kod değişmiyor; görsel bu sabit profile uyduruluyor.

İki zıt şikâyet, iki zıt düzeltme

Aynı çarpışma modeli iki farklı şekilde yanlış hissettiriyordu:

  • “Çarpmayacağımdan emindim, çarptım.” Örnek noktalar görsel yarıçapın tam üstündeydi; bir piksellik temas ölüm demekti. Gövde noktaları %20 içeri alındı — artık gemi engelin içine bir miktar girene kadar çarpışma sayılmıyor.
  • “Kesin çarptım ama deliksiz geçtim.” Gövdede yalnız dört yön noktası vardı ve engel kenarı aralarından sıyırabiliyordu. Dört yön sekize çıkarıldı.

⚠️ Kanat noktaları bilerek görsel yerinde bırakıldı: kanat teması öldürmüyor, hasar veriyor. Toleransı oraya da uygulamak, oyunun tek “affedilen hata” kanalını kapatırdı.

Skor ve ekonomi sunucuda

Skor tablosu, oyuncu kaydı ve oyun içi ekonomi istemciye bırakılmıyor; ayrı bir API ve yönetim paneli üzerinden yönetiliyor. Bu, bir denge değerini yeni sürüm çıkmadan değiştirebilmek anlamına da geliyor.

Ödüllü reklamda ödülü istemci vermiyor: AdMob sunucu taraflı doğrulamayla (SSV) sunucudaki uca haber veriyor ve bakiye orada yazılıyor. İstemcinin ödül verdiği bir kurguda oyuncunun tek yapması gereken uygulamayı kandırmak olurdu.

Satın alma iadeleri de iki mağazadan gerçek zamanlı geri düşüyor: Play tarafında Pub/Sub bildirimleri, Apple tarafında App Store sunucu bildirimleri RevenueCat’e, oradan da webhook ile oyunun ekonomisine bağlanıyor.

Karar · üretim

Elle dizilen sahne yerine çalışma anında üretim. Elle dizilen bir tünelde zorluk eğrisini değiştirmek sahneyi yeniden kurmak demek; bu da denemeyi pahalı, dolayısıyla nadir yapıyor.

Üretim tarafına geçince denge bir ayar dosyası problemine dönüştü. Bedeli görsel çeşitliliğin elle tasarlanmış bir seviyeye göre daha sınırlı olması — sonsuz koşu türünde kabul edilebilir bir takas.

Karar · skin

Satılan görsel oynanışı değiştirmiyor. Çarpışma profili bütün gemilerde birebir aynı; yeni bir gemi geldiğinde ayarlanan şey çarpışma değil, geminin görseli.

Alternatifi her geminin kendi mesh’inden çarpışma türetmekti. O yol ya pay-to-win’e ya da her yeni skin’de bütün engelleri yeniden dengelemeye çıkıyordu — ikisi de bir kere yapılınca geri alınamayacak türden kararlar.

Kuralın kodda yazılı hâli şu: görünen = çarpılan. Engelin çizilen ağı ile çarpışma testi aynı matematikten türüyor ve bir doğrulayıcı bunu her engel tipi için zorluyor.

03

Mimari

Oyun
Unity · C#
API
Fastify
Veri
PostgreSQL
Gelir
AdMob · RevenueCat
Platform
iOS ve Android
Kontrol
Sürükle: hareket · iki parmak: kanatları katla
Engeller
On iki tip, dört eylem işareti: süzül · kanadı kapat · yuvarlan · kanadı aç
Çarpışma
Analitik ve her gemide aynı: 13 örnek nokta, kanat katlanınca gövde yarıçapı 0,40 → 0,62
Sunucu
Skor, oyuncu ve ekonomi servisleri için ayrı bir API ve yönetim paneli
Para birimi
AKIM (İngilizcede AMP) — market iki sekmeli: gemiler ve AKIM
Gelir modeli
Ücretsiz, reklamlı; ödüllü reklamda ödülü sunucu yazıyor (SSV), ayrıca uygulama içi satın alma
04

Sıkça sorulanlar

Oyun nasıl oynanıyor?

Parmağınızı sürükleyerek gemiyi tünel içinde hareket ettiriyorsunuz, iki parmakla kanatları katlıyorsunuz. On iki engel tipi dört farklı şey istiyor: çoğunda süzmek yetiyor, dar delikte kanadı kapatmak, dilim engelinde yuvarlanmak, Yarık’ta ise kanadı açıp hizalamak gerekiyor. Amaç mümkün olduğunca uzağa gitmek.

İnternet bağlantısı gerekiyor mu?

Oynanışın kendisi cihazda çalışıyor. Skor tablosu, oyuncu kaydı ve oyun içi ekonomi ayrı bir sunucu projesi üzerinden yürüyor; bunlar için bağlantı gerekiyor.

Zorluk nasıl ayarlanıyor?

Tünel ve engeller çalışma anında üretildiği için zorluk eğrisi ve boşluk genişliği gibi değerler sahne yeniden kurulmadan değiştirilebiliyor. Denge tahminle değil, aynı koşuyu farklı değerlerle tekrarlayarak ölçümle ayarlanıyor.

05

Diğer projeler

aynı elden çıkan işler
06

İletişim

Benzer bir iş mi var?

Fikirden mağaza yayınına kadar ürün geliştiriyorum. E-posta ile ulaşabilirsiniz.