Mühendislik
Yapay zekâ kodlama ajanlarıyla 3D Unity mobil oyun nasıl çıkarılır?
Oyunun derlendiği tek yer build makinesi olur; her sahne, her sayı ve her şehir bir ajanın düzenleyip bir insanın inceleyebileceği kod ya da veri olarak durur; her build'i de bir insandan önce ajanlar emülatörde oynar. GOGOGO LLC'nin Android ve iOS için geliştirdiği, test aşamasındaki 3D sokak lezzetleri oyunu GoTasty'yi böyle yapıyoruz.
7 dk okuma

GOGOGO LLC'nin CTO'suyum ve GoTasty'nin kodunun büyük kısmını depomuzda çalışan yapay zekâ kodlama ajanları (Claude Code) yazdı; yönlendiren, inceleyen ve birleştiren benim. Oyun, Unity 6 ile yapılmış low-poly bir 3D idle arcade: İstanbul'da tek bir simit fırınıyla başlıyorsun, yemekleri yığın hâlinde tezgâha taşıyorsun, çırak alıp yeni tezgâhlar açıyorsun. 8 Kasım 2026 itibarıyla 33 ülkede 167 oynanabilir lokasyonu var. Bunu mümkün kılan düzen, bozulan yerleriyle birlikte burada.
Derleyici neden CI?
Günlük döngümüzde etkileşimli bir Unity Editor oturumu yok. Bir ajan sahne görünümünde tıklayıp gezemez; ben de oyunun gerçek durumunun tek bir kişinin açık editöründe yaşadığı bir düzen istemedim. Bu yüzden her değişiklik bir commit ve onu GitHub Actions derliyor. Assets/, Packages/ ya da ProjectSettings/ klasörüne dokunan her push bir Android build'i üretiyor; iOS build'i de tek bir elle tetiklemeye uzak.
Bu kural dürüstlüğü zorunlu kılıyor. Build kırmızıysa değişiklik olmamış demektir. Geçici bir linker çökmesi yeniden çalıştırılır; geri kalan her şey bir düzeltme commit'i alır. Ayrıca oynanabilir bir APK için kimsenin bilgisayarında Unity kurulu olması gerekmiyor; kurucunun biri mühendisliği, diğeri ürünü yürütürken bu önemli.
Build'ler önce GitHub'ın barındırdığı Linux makinelerinde GameCI ile başladı, şehir sayısı büyüyüp mağaza paketi belleğe sığmayınca 8 çekirdekli daha büyük bir makineye geçti ve 4 Kasım 2026'dan beri varsayılan olarak kendi Mac mini M4'ümüzde çalışıyor. Oradaki sıcak çalışma alanı, soğukken 52 dakika süren bir Android build'ini yaklaşık 8 dakikaya indirdi. O makineyi ayrıca ezagor.com'da anlattım.
Bir yapay zekâ ajanının Unity sahnesini bozması nasıl önlenir?
Unity sahneleri ve prefab'ları kötü birleşen, incelemesi neredeyse imkânsız büyük YAML dosyaları. Elle düzenlenen sahneden tamamen kaçınıyoruz: oyun sahnesini her build'de bir editör betiği (PrototypeSceneBuilder) üretiyor. Bir ajan tezgâhı taşımak ya da istasyon eklemek istediğinde sahneyi kuran C# kodunu değiştiriyor ve bu değişiklik sıradan bir diff olarak görünüyor.
İşin çoğunu üç sınır daha yapıyor:
- Sayılar için tek yer. Ayarlanabilir her değer (fiyatlar, süreler, upgrade eğrileri) tek bir
EconomyConfigdosyasında duruyor ve oyun sayıları yalnızcaGameManagerüzerinden okuyor. Temposu ayarlayan bir ajan yirmi değil, tek bir dosyaya dokunuyor. - SDK'lar için tek yer. Analitik, reklam, onay ve çökme raporları yalnızca
Services/içinden çağrılıyor. Event adları tasarım dokümanını izliyor ve yayından sonra hiç değişmiyor; böylece bir refactor bir hunisi sessizce bozamıyor. - Her dosyada bir sınıf ve dosya adı sınıf adıyla aynı. Sıkıcı ama ajan düzenlemelerini küçük ve incelenebilir tutuyor.
167 lokasyonu tek tek elle kurmadan nasıl yaparsın?
İlk şehirler C# ile elle kuruldu: tezgâhlar, istasyon animasyonları ve dekorlar her şehir için ayrı yazıldı. Bu ölçeklenmiyor ve elle kurulan her şehir temel uygulamayı da büyütüyordu. Ekim sonunda bir şehir kitine geçtik. Artık bir şehir; ürünlerini, beş tezgâhını, dükkân cephelerini, renklerini, arka planını ve İngilizce, Türkçe ve İspanyolca metinlerini taşıyan bir JSON dosyası. Ortak arketipler (şiş, ızgara, fritöz, fırın, demlik, tencere ve diğerleri) tezgâhları kuruyor, tek bir yorumlayıcı da onları verideki zaman çizelgesine göre canlandırıyor.
Biçim katı olduğunda ajanlar bu tür işte iyidir. Bir doğrulayıcı, şehir build'e girmeden önce şemayı, üç dili, ürün bloğunu ve gelir dengesini kontrol ediyor. 167 lokasyonun 102'si kit şehri; daha önce elle kurulanlar olduğu gibi kalıyor. Kit tezgâhları build sırasında hazırlanıyor ve mağaza build'lerinde oyuncu o şehre ilk kez gittiğinde CDN'imizden indiriliyor; böylece uygulama her şehirle büyümüyor.
Testçiler oynamıyorsa build'i kim oynar?
Erken dönemde testçilerin build'leri kurup nadiren oynadığını gördük. Bu yüzden her sürüm adayından ya da oynanış değişikliğinden sonra ajanlar Android emülatöründe QA yapıyor. Bir ajan yayın build'ini yeni bir oyuncu gibi oynuyor: önce cihazı test cihazı olarak işaretliyor, eğitimi izliyor ve gerçek bir reklama asla dokunmuyor. Bir diğeri, dikkatli bir oyuncu gibi oynayan ve temposunu 15 saniyede bir kaydeden yerleşik bir botla geliştirme build'ini çalıştırıyor.
Tempoyu tahmin etmeden böyle ayarlıyoruz. Tempo koşuları deterministik (sabit 1/30 sn adım ve tohumlanmış rastgelelik); aynı build'in iki koşusu aynı sayıları veriyor ve bir denge değişikliği gerçek bir fark olarak görünüyor. Bir tur betiği kamerayı bir şehir listesinde gezdirip ekran görüntülerinden temas sayfaları yazıyor; bir insan on yeni sokağı birkaç dakikada böyle inceliyor. Emülatörde ajanların alanı dar: her zaman adb -s ile tek bir cihaza seslen, asla geniş bir kill komutu çalıştırma, sabit portlarda iki örnek kullan.
İnsana ne kalıyor?
Kodun, dokümanların ve QA notlarının çoğunu ajanlar yazıyor ve çalışma dallarında commit ve push için kalıcı izinleri var. Geri dönüşü olmayan, para harcayan ya da kimlik bilgilerine dokunan her şeyden önce soruyorlar; bazı konsol adımları da doğrudan bize ayrılmış. Neyin yapılacağına ben karar veriyorum, integration dalına birleşmeleri inceliyorum ve bir sokağın doğru görünüp görünmediğine bakıyorum. Ürün tarafı kardeşim Okan'da: mağaza sayfaları, testçiler ve sırada ne çıkacağı.
İnsanın diğer işi ortak hafızayı dürüst tutmak. Depoda her ajan oturumunun ilk okuduğu uzun bir CLAUDE.md dosyası var: teknik kurallar, sürüm geçmişi, hesap kurulumları ve geçen sefer neyin bozulduğu. Bir ajan bir şeyi zor yoldan öğrendiğinde oraya yazıyor. Sıfırdan başlayan bir oturumla dünden başlayan bir oturum arasındaki fark o dosya.
GoTasty şu an nerede?
GoTasty Android ve iOS'ta test aşamasında: Google Play'de kapalı test, iOS'ta TestFlight. Şehirler, yemekler ve fragman GoTasty sayfasında, tasarım tarafı ise GoTasty geliştirici günlüğünde. Ajanları oyun geliştirme dışında nasıl işlettiğim için çok ajanlı yapay zekâ sistemlerini canlıda işletmek yazısına bakabilirsiniz.
Kaynaklar
- Claude Code overview · Anthropic
- Unity 6 · Unity Technologies
- Getting started · GameCI
- Larger runners · GitHub Docs
- Self-hosted runners · GitHub Docs
- Unity Editor command line arguments reference · Unity Documentation
- Android Debug Bridge (adb) · Android Developers
- GoTasty: Street food game around the world · GOGOGO LLC
- Set up an open, closed, or internal test · Play Console Help
- TestFlight · Apple Developer