Skip to content

Bir yapay zekâ oyun motorunun anatomisi: istemin içinde gerçekte ne var?

Mariana Muntean, Cinevva CEO'su

Cinevva hakkında yabancılardan en sık duyduğumuz şey, onun bir yapay zekâ sarmalayıcısı olduğu. Ana sayfaya geliyor, üzerinde "Oyununu tarif et" yazan tek bir giriş kutusu görüyor ve ürünü anladıklarına karar veriyorlar. Oysa yalnızca giriş kapısını anlamış oluyorlar. Ürün, siz o cümleyi yazarken görmediğiniz her şeyin yanı sıra, bu haftadan itibaren oyuncularınızın oyununuzu bulmak için ilk adım attığı açık dünyadır.

Bu girişin arkasında eksiksiz bir oyun motoru, tür tanımlı 26 araca sahip bir orkestratör, bir üretken model filosu, on bir sağlayıcıyı kapsayan birleşik bir varlık araması, ajanın okuyup yazabildiği canlı bir oyun iframe'i ve aynı ajanın tamamlanmış oyununuzu kaydırılabilir bir oynanış videosu olarak yayımladığı bir mağaza bulunuyor. Bunların hiçbiri egzotik değil. Hepsi altyapı işi. Asıl ilginç iş, neyi neye bağlayacağımıza karar vermekti.

Bu yazıda sistemi tepeden tırnağa inceleyeceğiz. Teknik yatırımcılara ve katkıda bulunmayı düşünen geliştiricilere yaptığımız açıklama bu. İkisi de aynı yanıtı istiyor.

1. İstem sistemin kendisi değil, görünen yüzüdür

Ana sayfadaki Cinevva istem alanı. Tek bir metin alanında 'Asteroitler, güçlendirmeler ve synth müziklerle neon bir uzay nişancı oyunu yap.' yazıyor. Altında üç öneri etiketi ve Cinevva logosu bulunuyor.

İlk tasarım kararımız, kullanıcı gerçekten işe dâhil olana kadar her şeyi gizlemekti. Ana sayfanın tek bir görevi var: bir cümleyi alıp projeye dönüştürmek. Deneyimi herkese açık taraf (istem, vitrinler ve mağaza akışı) ile üretici tarafı (IDE, varlık araçları ve yayımlama akışı) olarak ikiye ayırdık; böylece yalnızca oyun oynamak isteyenler kokpite bakmak zorunda kalmıyor.

Bu nedenle yer tutucu metin "Neon grafiklere sahip bir yılan oyunu yap" ve "Üstten görünümlü zombi nişancı oyunu" gibi örnekler arasında değişiyor. Bunlar eğitim içeriği değil. Kullanıcıya izin veren küçük bir işaret. Kullanıcı, "tuhaf arcade fikri"nin geçerli bir girdi olduğunu görüyor.

Gönder düğmesine bastığınız anda üç şey gerçekleşir. Sistem, kalıcı bir kimliğe sahip yepyeni bir oyun projesi oluşturur. Boş bir dosya ağacı (index.html, game.js, style.css, assets/, GDD.md) hazırlar. Ardından cümlenizi, bu boş dosyaları işaret eden bir proje bağlam penceresiyle birlikte orkestratöre yönlendirir. Bu noktadan sonra elleri olan bir ajanla konuşursunuz.

2. Giriş alanının arkasında eksiksiz bir tarayıcı IDE'si

Karanlık moddaki Cinevva üretici IDE'si. Üç panel bulunuyor: solda GDD.md, index.html, game.js, style.css ve assets klasörünü içeren bir dosya ağacı; ortada Three.js işleyici kurulumunu gösteren, sözdizimi vurgulamalı bir kod düzenleyici; sağda ise SKOR ve CAN HUD'uyla üstten görünümlü neon bir uzay nişancı oyununu gösteren canlı oyun önizlemesi.

Üretici çalışma alanı, tamamen tarayıcıda çalışan üç panelli bir IDE'dir. Solda dosya ağacı, ortada kod düzenleyici, sağda canlı oyun iframe'i ve alt kısım boyunca uzanan bir sohbet alanı bulunur. Bu düzeni bilinçli olarak seçtik. Hâlihazırda kod yazan kişiler onu anında tanıyor. Kod yazmayanlar ise orta paneli görmezden gelip yalnızca sohbet üzerinden ilerleyebiliyor.

Dosya ağacı bir metafor değil. Her proje gerçekten de bir Cloudflare Worker aracılığıyla doğrudan R2'den sunulan HTML, JS, CSS, üretilmiş görseller, GLB modelleri ve ses dosyalarından oluşan küçük bir statik sitedir. Derleme adımı yoktur. Bunun önemli bir nedeni var. Ajanın gerçekten yayımlayacağınız dosyaları okuyup yazabilmesi anlamına gelir. Ayrıca aynı yapının iframe içinde, Capacitor ile paketlenmiş bir telefonda, Tauri ile paketlenmiş Steam sürümünde ve Embedded Activity olarak Discord içinde çalışmasını sağlar. Tek bir dosya sistemi, altı dağıtım hedefi.

Ürettiğimiz her oyunun window üzerinde iki işlev sunması zorunludur. getGameState(), çalışan oyunu tanımlayan sade bir nesne döndürür (oyuncu konumu, skor, canlar, düşmanlar, zamanlayıcılar). setGameState(patch) ise kısmi bir güncellemeyi canlı oyuna uygular. Bu küçük API, ajanın çalışan bir oyunu yeniden yüklemeden inceleyip değiştirmesini sağlayan sözleşmedir. Bunun neden önemli olduğuna 6. bölümde geri döneceğiz.

3. Asıl motorun bulunduğu orkestratör

Cinevva orkestratörünün şeması. 'Orkestratör (LLM)' etiketli merkezî bir düğüm, çevresine yerleştirilmiş sekiz araç düğümüne bağlı: list_game_files, read_files, edit_files, write_files, generate_image (Flux), generate_skybox (Blockade), generate_music (ElevenLabs) ve rig_model (Tripo). Noktalı bir çizgi, orkestratörü 'ekran görüntüleri + konsol' etiketli 'Oyun iframe'i' düğümüne bağlıyor.

Buna "bir yapay zekâ sarmalayıcısı" diyenlerin gözden kaçırdığı nokta, yapay zekânın kod yazmaktan ziyade küçük bir orkestrayı yönetmesidir. Orkestratör, öncü bir model üzerinde çalışan, araç çağırmaya dayalı bir döngüdür. Yaklaşık bin satırlık bir sistem istemine ve tür tanımlı 26 işlevden oluşan bir araç yüzeyine sahiptir. Motor, araç tanımlarıdır. Model ise orkestra şefidir.

26 araç beş aileye ayrılır. Dosya sistemi araçları (list_game_files, read_files, search_game_file, edit_files, write_files, delete_files, rename_files), ajanın oyununuzu herhangi bir kod tabanı gibi ele almasını sağlar. Proje araçları (create_new_game, list_games, open_game, ask_user, game_ready), bir projenin yaşam döngüsünü ve kontrolün insana geri verilmesini yönetir. Üretken araçlar (generate_image, generate_skybox, generate_music, generate_sfx, rig_model, apply_animation, list_animations, list_skybox_styles), birazdan ele alacağımız uzmanlaşmış modelleri çağırır. Bilgi araçları (search_fonts, list_library_docs, search_library_docs, list_generations), ajana uydurma API'ler yerine güvenilir, dizine eklenmiş doğruluk kaynakları sunar. Çalışma zamanı araçları (read_console_logs, execute_js) ise ajanın canlı oyunu görmesini ve ona müdahale etmesini sağlar.

Tipik bir ilk konuşma sırası kabaca şöyle görünür. Kullanıcı "Neon bir uzay nişancı oyunu yap" yazar. Model önce tasarımı açıklayan GDD.md dosyası için bir write_files çağrısı, ardından index.html, game.js ve style.css için bir write_files çağrısı daha üretir. prompt="synthwave space shooter, 120 BPM, driving bassline" ile generate_music çağrısı yapar; bu, ElevenLabs Music üzerinde bir iş başlatır ve R2 içindeki bir MP3 URL'si döndürür. Yıldız alanı için Blockade Labs model 3 stilini kullanarak generate_skybox çağrısı yapar. iframe'i yeni yapıya geçirmek için game_ready(title, message), ardından oyunun hatasız başlatıldığını doğrulamak için read_console_logs çağrısı yapar. Bir yığın izleme kaydı görürse kullanıcı herhangi bir sorun bildirmeden önce edit_files adımına geri döner ve hatayı düzeltir.

Bu tasarımın ilginç özelliği, ürüne özgü olan tek şeyin sistem istemi ile araç şemaları olmasıdır. Modeli değiştirseniz bile her şey çalışmaya devam eder. Geçen yıl içinde yüzeyi değiştirmeden üç öncü model arasında geçiş yaptık, çünkü yüzey bize ait.

4. Varlık tarafı: modellere dağıtılan bir yapı

Üç panelli bir varlık üretim paneli. Sol panelde 'synthwave space shooter, 120 BPM, driving bassline' istemini, 60 saniyelik süre kaydırıcısını ve Üret düğmesini içeren bir müzik üreticisi ile 'Asteroid Drift Theme' başlıklı, çalmakta olan bir dalga biçimi kartı bulunuyor. Orta panelde 'deep space, distant nebula, two moons' istemini ve dört adet 360 derecelik ortam küçük resminden oluşan ızgarayı içeren bir gökyüzü kutusu üreticisi var. Sağ panelde düşük poligonlu mor bir uzay gemisinin dönen 3D model önizlemesi, 'İskeletle + Yürüt' düğmesi ve 'İskelet oluşturuluyor... 1 dk. 42 sn. kaldı' yazan bir durum göstergesi bulunuyor.

Ajan görsel, müzik, ses veya 3D içerik üretmez. Uzmanları çağırır. Cinevva'nın varlık tarafı, sınıfının en iyi modellerine dağılan ve birinin çıktısı diğerinin geçerli girdisi olacak şekilde birbirine bağlanan bir yapıdır.

Görseller ve sprite'lar için generate_image, her zaman 32'nin katı olan bir genişlik ve yükseklik kullanarak Flux Pro 1.1'i çağırır; istem şeffaflık talep ettiğinde çıktı biçimi PNG'ye geçer. Tam uzunlukta şarkılar için ajan, stilistik bir istem ve saniye cinsinden süreyle ElevenLabs Music'i çağırır. Tek seferlik efektlerde ElevenLabs SFX, "laser gun firing, sci-fi blaster" gibi bir metinden beş ila on beş saniye içinde bir klip üretir. 360 derecelik ortamlar için generate_skybox, yaklaşık doksan stilden biriyle Blockade Labs'i çağırır ve varsayılan olarak model 3 Digital Painting'i kullanır. 3D karakterler için rig_model, bir GLB dosyasını iki ayaklı, dört ayaklı, altı ayaklı, sekiz ayaklı, yılansı veya suda yaşayan bir canlı olarak kaplamak ve iskeletlendirmek üzere Tripo'ya gönderir. Ardından apply_animation, on beş hazır animasyondan herhangi birini oynatır (boşta durma, yürüme, koşma, zıplama, tırmanma, dalma, kesme, ateş etme, hasar alma, düşme, dönme ve iki ayaklı olmayanlara özel yürüyüşler).

Bunların her biri eşzamanlı bir çağrı değil, bir iştir. Saniyelerden dakikalara kadar sürebilirler. Orkestratör bunları başlatır, hemen bir jobId ile geri döner ve ayrı bir kanal, varlık hazır olduğunda sonucu konuşmaya aktarır. Bu, deneyimin hissini tamamen değiştirir. Ajan, arka planda bir 3D modelin iskeletlendirilmesi tamamlanırken oyun mantığını geliştirmeye devam edebilir. Kullanıcı hiçbir zaman tek bir kritik yolu beklemek zorunda kalmaz.

Tüm çıktılar aynı yere gider. cdn.cinevva.com arkasındaki R2'ye; sade URL'lerle erişilebilir biçimde. Böylece ajanın bir sonraki write_files çağrısı yalnızca <audio src="https://cdn.cinevva.com/audio/abc.mp3"> etiketini ekleyebilir ve oyun doğrudan çalışır. SDK yok, varlık paketleyici yok, manifest yok.

5. On bir sağlayıcıda varlık araması

Karanlık moddaki Cinevva varlık arama sayfası. Üstteki arama çubuğunda 'asteroid rock' sorgusu bulunuyor. Sağındaki sağlayıcı filtrelerinde Tümü, PolyHaven, Sketchfab, Kenney, Quaternius, AmbientCG, OpenGameArt, Freesound, Smithsonian, Synty ve Jamendo seçenekleri gösteriliyor; Sketchfab vurgulanmış. Aşağıda dört sütunlu bir asteroit modeli küçük resimleri ızgarası bulunuyor. Her kartta sağlayıcı rozeti, CC0 veya CC-BY lisans etiketi ve 'Oyunda kullan' düğmesi var. Sağ üst köşedeki küçük açıklamada 'ChatGPT: oyun geliştiricileri için en iyi ücretsiz varlık araçlarından biri' yazan bir sohbet balonu görünüyor.

Belirli bir şeye ihtiyaç duyduğunuzda üretim harikadır. Bir şey zaten mevcutsa arama daha hızlıdır. Varlık Kitaplığı, on bir ücretsiz ve lisanslı sağlayıcıda birleşik arama yaparak sonuçları tek bir sıralanmış akışta sunar.

Sağlayıcı kayıt sistemi worker içinde yer alır ve her sorguyu PolyHaven, Sketchfab, Freesound, Kenney, AmbientCG, Quaternius, OpenGameArt, Smithsonian 3D koleksiyonu, TurboSquid, Synty ve Jamendo üzerinde paralel olarak çalıştırır. Her sağlayıcı ortak bir arayüz uygular (search, getMetadata, isBrowsable, getSupportedTypes), dolayısıyla yeni bir sağlayıcı eklemek için tek bir TypeScript dosyası yeterlidir. Birleştirme katmanı, sayfalandırmayı farklı şekillerde yapan sağlayıcılar arasında imleç tabanlı sayfalandırmayı yönetir, yinelenen lisansları kaldırır, varlık türlerini ortak bir sınıflandırmada (model, doku, ses, hdri, sprite) normalleştirir ve ajanın yeniden dağıtamayacağı bir şeyi seçmemesi için her varlığı lisansıyla etiketler.

ChatGPT geçen çeyrekte bu aracı oyun geliştiricileri için en iyi ücretsiz varlık buluculardan biri olarak önerdiğinde gidip tavsiyeyi okuduk. Önemli olan kısımda haklıydı. Mesele tek bir kitaplığın üzerinde arama çubuğumuzun olması değil. Mesele, "taş duvar dokusu" arayan bağımsız bir geliştiricinin tek sorguyla ve tutarlı lisans meta verileriyle PolyHaven ile AmbientCG sonuçlarını, Kenney'nin stilize sürümünü ve Smithsonian'ın fotogrametri seçeneğini yan yana görebilmesi. Ajan da aynı uç noktayı kullanabilir ve varlıkları bir insanla aynı şekilde seçebilir.

Motorun çoğu zaman yeterince önemsenmeyen kısmı budur. Çoğu oyun yapay zekâsı demosu her şeyi sıfırdan üretir ve sonuçta tek tip, parlak, hafif tekinsiz bir görünüm ortaya çıkar. Cinevva'daki ilginç oyunlar, üretilmiş varlıkları Smithsonian'dan gerçek CC0 fotogrametri içerikleri ve Quaternius'tan el yapımı düşük poligonlu bir ağaçla birleştiriyor. Orkestratör bunu tek bir konuşma sırasında yapabilir.

6. Ajan oyunu oynar

Canlı hata ayıklama görünümü. Solda, oyuncu gemisinin asteroitlerden kaçtığı, SKOR'un 4820 ve kalan can sayısının 2 olduğu çalışan bir neon uzay nişancı oyunu var. Sağda üst üste iki panel bulunuyor: JSON.stringify(getGameState()) çağrısını ve oyuncu konumu, hız, sağlık, skor, canlar ve asteroit sayısını içeren, döndürülmüş bir JSON nesnesini gösteren execute_js paneli ile asteroit oluşturma, güçlendirme alma, bir doku yükleme uyarısı ve 58 FPS değerini içeren en son günlük satırlarını gösteren read_console_logs paneli.

Mühendislerin çoğunu gösterdiğimizde şaşırtan kısım bu. Ajan yalnızca dosyalara kod yazmaz. Oyunu korumalı bir iframe içinde çalıştırır, konsolunu okur, kullanıcı arayüzü ile 3D sahne için ayrı katmanlar hâlinde ekran görüntüleri alır ve durumu incelemek veya değiştirmek için canlı çalışma zamanı içinde JavaScript çalıştırır. read_console_logs, iframe’deki son elli console.log, console.warn, console.error satırını ve yakalanmamış istisnaları döndürür. Her game_ready çağrısından sonra ajan, sistem istemi gereği read_console_logs çağırmalı ve oyunu kullanıcıya teslim etmeden önce tüm hataları düzeltmelidir. Bu tek kural, diğer araçlarda görülen “Yapay zekâ tamamlandığını söyledi ama ekran simsiyah” sorunlarının çoğunu ortadan kaldırır.

execute_js ise daha güçlü olanıdır. Oyunun global kapsamında rastgele JavaScript çalıştırır. Her oyunun getGameState ve setGameState işlevlerini uygulaması gerektiğinden ajan, çalışan oyunun tüm durumunu okumak için JSON.stringify(getGameState()) çalıştırabilir; ardından oyuncuyu ışınlamak için setGameState({player: {x: 500, y: 100}}), yenilmezlik vermek için setGameState({lives: 99}) veya ileri atlamak için setGameState({level: 3}) çağrısını kullanabilir. Ayrıca Three.js sahne grafiğini incelemek için scene.children.map(c => c.type) ya da oluşturucunun bağlandığını doğrulamak için document.querySelectorAll('canvas').length gibi komutlarla daha alt seviyelere de erişebilir.

Bunun neden önemli olduğunu görebilirsiniz. Bir kullanıcı “Oyuncu ikinci bölümde duvara takılıyor” dediğinde ajanın tahmin yürütmesi gerekmez. İkinci bölümü açar, getGameState() çalıştırır, çarpışma verilerini inceler, düzeltmeyi test etmek için bir execute_js yaması çalıştırır ve ancak bundan sonra düzeltmeyi diske yazar. Sizin hata ayıkladığınız gibi hata ayıklar. Iframe’i bir hedef değil, eş düzey bir bileşen olarak ele alıyoruz.

7. Kütüphane belgeleri, sıkıcı gerçeklik kaynağı

Oyunların gerçekten kullandığı kütüphanelerin (Three.js, Tone.js, Cannon ve giderek daha fazlasının) resmî belgelerini yapılandırılmış, aranabilir bir JSON deposunda dizinliyoruz. Ajan, açık web’e yönelmeden önce search_library_docs("threejs", "Mesh") komutuna başvurur. Bu daha hızlıdır, sürümlendirilmiştir ve iki alt sürüm önce yeniden adlandırılmış bir yöntemi asla uydurmaz.

Bu gösterişli bir şey değil. Ancak çalışan kod üreten bir yapay zekâ ile kırkıncı satırda çöken, ikna edici görünen kod üreten bir yapay zekâ arasındaki farkı yaratıyor. Cinevva ile geliştirilen oyunların görünür kalitesinin büyük bölümü bu tek karardan kaynaklanıyor.

8. Oynanabilirlikten keşfedilebilirliğe: kısa videolar ve mağaza vitrini

Kısa oynanış videolarından oluşan bir mağaza vitrini. Ortada, telefon biçimli bir kartta çatışmanın ortasındaki neon bir uzay nişancı oyununun dikey videosu oynuyor; sağ tarafta sosyal arayüz simgeleri sıralanmış (14 bin beğenili bir kalp, 3,2 bin yorumlu bir sohbet balonu, 1,8 bin paylaşımlı bir paylaşım oku ve bir 'Şimdi Oyna' düğmesi). Alttaki kısa video etiketinde 'Asteroid Drift • @indiedev tarafından • 3,1 Mn görüntülenme' yazıyor. Solda, 'Üreticinin sohbetinden' başlıklı küçük bir sohbet kesitinde asistanın 'Oyun yayında. Kısa video mağaza vitrininizde otomatik olarak yayımlandı.' mesajı yer alıyor. Sağda, Mağaza Vitrini panelinde trend olan üç oyun listeleniyor: Asteroid Drift, Roadhawk Runner ve Birb Clicker; her birinin yanında görüntülenme sayısı ve 'Trend' rozeti bulunuyor.

Kimsenin oynamadığı bir oyun, kişisel bir hobiden ibarettir. Bağımsız oyun geliştirmedeki çözülmemiş en zor sorun artık oyun yapmak değil, dağıtımdır. Bu yüzden motor “oynanabilir” noktada durmaz. “Oyuncuların önünde” olduğu noktada durur.

Cinevva’daki her proje, oyunun en son sürümünü beğeni ve paylaşım seçenekleri içeren küçük bir katmanla birlikte tam sayfa iframe’de açan play.cinevva.com/{game-id} gibi kalıcı bir paylaşım URL’sine sahiptir. Ajan game_ready çağrısı yaptığında yalnızca IDE içi önizlemeyi etkinleştirmez. Ayrıca 15 saniyelik bir oynanış videosunu Cinevva mağaza vitrininde yayımlamayı önerir. Kısa video, oynanan oyunun doğrudan iframe’den yakalanmış gerçek bir kaydıdır (ajanın oyun çalışma zamanına enjekte ettiği küçük bir kayıt betiği sunuyoruz); dolayısıyla izleyicinin kaydırırken gördüğü şey bir pazarlama kurgusu değil, gerçek oynanıştır.

Bu, bir geliştiricinin içinde yaşadığı döngüyü değiştirir. Eski döngü; kodlama, derleme, paketleme, yükleme, bir Steam sayfası yazma, algoritmayla mücadele etme ve istek listesi sayacını izleme şeklindeydi. Yeni döngü ise bir cümle yazmak, ajanın geliştirmesini izlemek, yayımla düğmesine basmak ve oyununuzun diğer her şeyin yanında aynı kaydırmalı akışta belirmesini izlemektir. Keşif, üretimin gerçekleştiği ürünün içinde, aynı URL’de ve aynı oturumla gerçekleşir.

Geliştirici topluluğundaki okurlarımızın incelemesi gereken kısım burası. Dağıtım, oyun motorlarının hiçbir zaman birlikte sunmadığı rekabet hendeği olmuştur. Unity bir editör sunar, oyunu Steam’de siz yayımlarsınız. Unreal bir editör sunar, oyunu Epic Store’da siz yayımlarsınız. Cinevva her iki yarıyı da sunar. Motor ve mağaza vitrini, oyunu geliştiren aynı orkestratör üzerinden birbiriyle iletişim kurar.

9. En İyi Performans Gösterenler: keşif çarkı

Cinevva En İyi Performans Gösterenler tablosu. Üstte Trend, En Yeni ve En İyi yazan üç sekme bulunuyor; En İyi seçili. Altında öne çıkan üç oyundan oluşan bir podyum sırası yer alıyor: birinci sırada 42,1 bin oynanmayla The Breaker Belt, ikinci sırada 27,7 bin oynanmayla Roadhawk Runner ve üçüncü sırada 37,1 bin oynanmayla Asteroid Drift. Podyumun altında Pixel Platformer, Zombie Shooter, Fruit Ninja Clone, Tower Defense, Card Battler ve Zombie Builder’ın da aralarında bulunduğu altı küçük oyun kartından oluşan daha yoğun bir ızgara bulunuyor; her birinde küçük resimler, üretici kullanıcı adları ve oynanma sayıları yer alıyor.

Kısa video akışı, çarkın bir yarısıdır. En İyi Performans Gösterenler tablosu ise diğer yarısıdır. Oyunları trend, en yeni ve tüm zamanların en iyileri olarak sıralar; ham tıklamalar yerine tamamlama oranını (oyuncu bir oturumu tamamladı mı?) ağırlıklandırır. Tamamlama oranını manipüle etmek, yükleme sayılarını manipüle etmekten daha zordur. Dikkati altmış saniye boyunca koruyan bir oyun, açılıp hemen kapatılan bir oyunu geride bırakır.

Her sinyal, orkestratörün bir sonraki turuna geri beslenir. Ajan “Bir güçlendirme ekleyelim” dediğinde sabit bir kalıp kütüphanesinden yararlanmıyor. Bu ay Cinevva’da hangi mekaniklerin oyuncuları gerçekten elde tuttuğunu gözlemlemiş bir modelden yararlanıyor. Çark, sayfanın altındaki bir tablodan ibaret değil. Tüm motorun eğitim sinyalidir.

Yatırımcılar için veri hendeğimiz budur. Yalnızca üretilmiş oyunlara sahip değiliz. Bu oyunları oluşturan istemlerle, ajanın yaptığı varlık seçimleriyle ve onları beğenen oyuncularla ilişkilendirilmiş, gerçek oturum düzeyinde etkileşim metriklerine sahip üretilmiş oyunlarımız var. Her döngü bir sonrakini daha da güçlendiriyor.

10. Motor bir oyuna dönüşüyor

Aylardır sosyal medyada ima ettiğim kısım burada. 1’den 9’a kadar olan bölümlerdeki her şey, oyun geliştiren bir sistemi anlatıyor. Siz görene kadar anlatılması daha zor olan şey ise sistemin kendisi bir mekâna dönüştüğünde yaşananlar.

Sunduğumuz tüm özelliklere rağmen oyun geliştirmek zor iştir. Daha önce hiç oyun yapmadıysanız bir anda hikâyeden, karakterlerden, dünyadan, mekaniklerden, kimin neyi ne zaman yaptığından, ışığın nasıl davrandığından, özel efektlerin nasıl katmanlandığından, müzikten, ses efektlerinden ve kamera hareketlerinden sorumlu hâle gelirsiniz. Bu çok fazla şeydir. Üstelik tüm bunların yanında sonucun, başka birinin aracının çıkardığı bir şablon gibi değil, size aitmiş gibi hissettirmesini istersiniz. İstem ve orkestratör, mekanik işlerin çoğunu sizin için yapar. Tek başlarına yapamayacakları şey, tamamlanmış eseriniz için diğer insanların izlediği bir sahne sunmaktır.

Biz de sahneyi kurduk. Bu yılın büyük bölümünde Oleg ve motor ekibi, açık bir dünyayı tarayıcıya taşımayı anlatan 14 bölümlük bir seride çalışmalarını yayımladı. Gerçek zamanlı şekillendirebildiğiniz yontulmuş araziler. Eğim ve rakıma göre kendini kaya ya da çim olarak boyayan biyomlar. Hesaplamayla üretilmiş arazinin üzerinde rüzgârda eğilen 80.000 çim sapı. Aynı adımda hem yükseklik haritası hem de hacimsel arazi üzerinde yürüyen, koşan, zıplayan ve süzülen bir karakter. Bunların hiçbiri sırf teknoloji demosu olsun diye yapılmadı. Hepsi bunun altyapısını oluşturuyordu.

Bugün açık dünya erken sürümüyle yayında. Bir avatar seçip içeri giriyorsunuz. Yayımlanmış oyunlarınız, tıpkı mağaza vitrini kısa videolarının ve En İyi Performans Gösterenler tablosunun onları şimdi gösterdiği gibi, etrafınızda ziyaret edilebilir alanlar olarak beliriyor; ancak bu kez kaydırarak değil, yürüyerek ulaşıyorsunuz. Dünyadan ayrılmadan, o dünya üzerinden bir yabancının oyununa girebilirsiniz. Az önce oynadığınız şeyi yapan kişinin yanında durup ona sırada ne ekleyeceğinizi söyleyebilirsiniz. Yeni tanıştığınız biriyle bir arazi parçasını şekillendirip onu yeni bir projenin tohumuna dönüştürebilirsiniz. Keşif artık bir akış olmaktan çıkar. Bir yürüyüşe dönüşür.

Motorumuz teknik anlamda her zaman bir oyun motoruydu. Bugün gerçek anlamda da bir oyuna dönüşüyor. Oyununuzu geliştiren şey artık başlı başına bir oyun ve 3. bölümdeki aynı orkestratör, 4. bölümdeki aynı varlık rayları, 6. bölümdeki aynı getGameState sözleşmesi, 8. bölümdeki aynı kısa videolar ve 9. bölümdeki aynı tablo, oyuncularınızın içinde dolaştığı tek bir yerde birleşiyor. Üretmek ile oynamak arasındaki sınır her zaman yapaydı. Artık ortadan kalktı.

Neleri doğru yaptığımızı düşünüyoruz

Doğru yaptığımız ilk şey, istemi bir ürün yerine bir kullanıcı arayüzü olanağı olarak ele almaktı. Ürün; orkestratör, araç yüzeyi, varlık rayları ve mağaza vitrinidir. İstem ise kullanıcıyı sisteme dâhil etmenin mümkün olan en düşük maliyetli yoludur.

İkincisi, derleme adımı olmayan düz, tarayıcıya özgü bir dosya sisteminde ısrar etmekti. Bir Cinevva oyununun tek bir doğruluk kaynağından mobil cihazlara, masaüstüne, Steam’e ve Discord’a sunulabilmesinin nedeni budur. Ajanın yazdıklarını okuyabilmesinin nedeni de budur.

Üçüncüsü, üretilen her oyunun getGameState ve setGameState işlevlerini uygulamasını gerektiren sözleşmeydi. Sistem istemindeki bu tek satır, ajanın bir kod üreticisi yerine bir iş arkadaşı gibi hissettirmesini sağlar. Ajan oynayabilir ve oynayabilen bir sistem hata ayıklayabilir.

Dördüncüsü, mağaza vitrinini motorla aynı döngüye bağlamaktı. Salt model kalitesiyle kazanmayacağız. Açık ağırlıklı bir üreticiden iki ay ileride olmanın savunulabilir bir avantajı yok. Oyununuzu geliştiren aynı ajan onu yayımladığında, ölçtüğünde ve yabancıların onu nasıl oynadığından öğrendiğinde kazanırız.

Tüm makineyi çalışırken görmek istiyorsanız ana sayfadaki istem hâlâ giriş kapısıdır. Bir cümle yazın. Arkasında neler olduğunu izleyin. Sonra buraya dönüp motorun hangi parçasını sıradaki yazıda ele almamız gerektiğini bize söyleyin.