Oyun Geliştirme: Hileler
3 min read

Oyun Geliştirme: Hileler

Buradaki hileler oyuncuların kullandığı değil, geliştiricinin başvurduğu hileler. Blog yazmaya, "loading" ekranları ile ilgili bir soruya kameraları da ilgilendiren bir cevap vermek üzereyken karar verdim. Eğlenceli bir konu.

Kamera demişken, oyun geliştirmek isteyen herkese aşağıdaki GDC videosunu izlemelerini öneriyorum. Dizilerden Halt and Catch Fire, oyunlardan Journey'in damağımda bıraktığı tad bir başkadır.

Modelleri Gizleme ve Tasarruf

Sahne büyüktür, kameranın göstereceği alan geniş ve derindir, o zaman görünen tüm modellerin, hatta sadece gölgesi görünen modellerin bile, render edilmesi gerekir.

Çok uzaktaki modellerin 3B olarak değil, sadece tek yüzü olan 2B modeller (billboard) halinde gösterme, ya da sis içinde kaybetme gibi yöntemler kullanılır bazen. Aşağıda, aynı yöntemi optimizasyon için değil, savaş taktiği olarak kullanan Alliance casusunu görebilirsiniz :)

Pencereler buzlanır, bina içindeki nesneler gizlenir, kameraya görünmeyen her nesne gizlenir, bazen haritalar, yer şekilleri, sokaklar buna göre tasarlanır, kameranın çok fazla öğe göstermemesi sağlanır.

Kameraya görünmeyen nesnelerin otomatik gizlenmesi, çoğu zaman Unity tarafında otomatik halledilir, uzaktaki modeller için billboard kullanma, pencereleri buzlama ya da parallax efektiyle pencerenin arkasında bir oda varmış gibi gösterme, emek harcanan ve çoğu zaman hazır araçlarla çözülebilen tekniklerden.

Bu konuda benim kullandığım yöntem, kamerayı tepede tutmak ve her zaman karakterin etrafındaki 100m çaplı alanı göstermek. Çok uzakları render etme derdi yok. Karakterin çok yükseğe çıkıp haritanın büyük kısmını görmesini engellemek için de, belirli bir yükseklikten sonra modellerin dibine bulut eklerim, altındakileri gizlerim, yetmezse çıkılabilecek yüksekliği merdiven koymayarak sınırlandırabilirim :)

Ejderhaların oyuna hemen gelmeyeceği, gelse de yerden en fazla 20m yüksekte uçacaklarını tahmin edebilirsiniz.

Yükleme Ekranları

Bunların tamamı, kusurları kapatmak içindir. Bir şeyler, sahnede istediğimiz kadar hızlı görünür hale gelmez bazen, yani çoğu zaman.

Diskten okuma, sahneyi oluşturma, dinamik nesneleri yerleştirme, save edilmiş durumu haritaya yansıtma, yani yapıları yıkma/değiştirme, yaratıkları ölü gösterme, binekleri/araçları farklı yere taşıma, karakteri olması gerektiği gibi giydirme derken, yapılacak tonla iş oluyor sahne geçisi sırasında.

Sahnenin, kullanıcının seçimlerine göre değiştiği oyunlarda, hele yer şekilleri, bitki örtüsü ve yapılar etkileniyorsa yükleme süresi daha da artıyor. Önceki başlıkla ilgili bir teknik daha: oyundan oyuna değişiklik göstermeyecek, benzer özelliklere ya da materyallere sahip modelleri tek model olarak birleştirme, ışık ve gölgeleri önceden hesaplama ve bir texture olarak kayıt etme, bellek ve disk alanı karşılığında, süreden tasarruf ettiren bir yöntem. Dinamik oyunlarda, eğer bunun gibi teknikler işe yaramıyorsa, alın size beklenecek bir işlem daha.

Burada, bir yükleme ekranının ardında sığınmak enfes bir çözüm. Sahne kamerası kapatılır, yükleme sırasında gösterilecek arayüzü gösteren kamera açılır, iş bitince asıl kameraya geçilir. Özetle, bu kadar.

İki harita arası geçiş yaparken kontrollerin çalışmaz hale geldiği cutscene'ler ded kullanılabilir, bu süreç oyun içi öğelerle hiç farkedilmeyecek hale de getirilebilir.

WoW'da, bölgeler arası geçişlerde yükleme ekranı yokken, kıtalararası geçişlerde var mesela. Kıtaların farklı sunucularda olması, sunucular arası geçişlerin her zaman seamless, yani farkedilmeden gerçekleştirilememesi gibi durumlarda yükleme ekranları kaçınılmaz hale gelebilir.

Oyunda kullanmayı planladığım yöntemlerden biri, bazı bölgeler arası geçişlerde kullanıcıyı, bir tünel gibi, belirli bir patikayı izlemeye mecbur bırakmak mesela. Ya da, Mordor'a yalnızca kuşlarla gidilir demek.

Sorunun çıkış noktasına gelirsek, oyun ilk kez açıldığında mutlaka bir yükleme ekranı kullanmanın mecburiyetine vermek istediğim örnek kameralar idi. Karakterin ekranın neresinde olacağı, karakter nesnesi yüklenene kadar belli değil. Kamera, öntanımlı noktaya bakıyor, karakter yüklenene kadar diğer nesneler ekranda belirirse, kameranın bir noktadan diğer noktaya ışınlanması ayrı çirkin, yavaş geçiş yapması ayrı. En temizi, kamerayı kapatmak, gösterilecek her nesnenin, görüntülenmeye hazır olup olmadığını kontrol etmek ve sonra perdeyi açmak.

Kamp ve meşale ateşleri için kullandığım bir efekt var bir de, ateşin gürül gürül yanması için yarım saniye geçmesi gerekiyor. Sahneyi anında gösterince tüm ateşler aynı anda yanmaya başlıyor gibi görünüyor, amatörce; bunu engellemek için efektin ayarları değiştirilebilir, bu da yan etkilere sebep olur, test etmesi dert, fark etmesi dert; yükleme ekranı tam ihtiyacım olan yarabandı.

Network konusuna girmeye gerek yok, sunucudan gelen her bilgi oldukça geç geleceği için, sahne bu bilgilere göre oluşturulduğunda bilin bakalım hangi teknik kullanılabilir :)