Prosedürel içerik üretimi (procedural generation) nasıl yapılır? Bir zindan (dungeon) üreticisini nasıl tasarlarsınız?
Cevap
Prosedürel üretim, içeriği elle değil algoritmalar ve kurallarla üretmektir. Temel ilke determinizm: aynı seed her zaman aynı sonucu vermelidir; böylece dünyayı kaydetmek yerine seed saklanır, hatalar tekrarlanabilir ve oyuncular seed paylaşabilir.
Yaygın teknikler:
| Teknik | Kullanım |
|---|---|
| Perlin / Simplex noise (oktavlar ile fBm) | Arazi yüksekliği, biyomlar, bulut |
| BSP (Binary Space Partitioning) | Oda tabanlı zindanlar |
| Cellular automata | Doğal görünümlü mağaralar |
| Random walk / drunkard walk | Organik koridorlar |
| Wave Function Collapse | Tile kurallarına uyan haritalar |
| Grammar / şablon tabanlı | Görev, level yapısı |
Basit oda + koridor zindanı:
public List<RectInt> Generate(int seed, int roomCount, int mapSize)
{
var rng = new System.Random(seed); // global Random değil, kendi örneğimiz
var rooms = new List<RectInt>();
int attempts = 0;
while (rooms.Count < roomCount && attempts++ < roomCount * 20)
{
int w = rng.Next(4, 10), h = rng.Next(4, 10);
var r = new RectInt(rng.Next(1, mapSize - w - 1), rng.Next(1, mapSize - h - 1), w, h);
if (rooms.Exists(o => o.Overlaps(Expand(r, 1)))) continue; // çakışma varsa at
rooms.Add(r);
}
// Sonra: oda merkezlerini MST (ör. Prim) ile bağla, birkaç ekstra kenar ile döngü ekle,
// L şeklinde koridorlar çiz, başlangıç ve boss odasını en uzak iki oda seç.
return rooms;
}Kaliteyi sağlamak için:
- Oynanabilirlik garantisi: Her odaya erişim (flood fill / BFS ile bağlantı kontrolü), anahtar-kapı sırası.
- Kısıtlar ve elle yapılmış parçalar: Tamamen rastgele içerik sıkıcıdır; elle tasarlanmış oda şablonlarını prosedürel olarak birleştirmek (Spelunky, Dead Cells) daha iyi sonuç verir.
- Determinizm tuzakları:
UnityEngine.Random'ı başka sistemlerle paylaşmak, dictionary iterasyon sırası ve platformlar arası float farkları seed'in tutarlılığını bozabilir. - Performans: Büyük dünyalarda chunk tabanlı, arka plan thread'inde üretim ve streaming.
İlgili Oyun Programlama soruları
- Oyun döngüsü (game loop) nedir? Sabit ve değişken zaman adımı arasındaki fark nedir?
- Delta time nedir, neden kullanılır?
- Object pooling nedir, neden kullanılır?
- Entity Component System (ECS) nedir? Klasik nesne yönelimli yapıdan farkı nedir?
- Çarpışma tespitinde broad phase ve narrow phase nedir?
- Multiplayer oyunlarda server authority, client-side prediction ve lag compensation nasıl çalışır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.