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:

TeknikKullanım
Perlin / Simplex noise (oktavlar ile fBm)Arazi yüksekliği, biyomlar, bulut
BSP (Binary Space Partitioning)Oda tabanlı zindanlar
Cellular automataDoğal görünümlü mağaralar
Random walk / drunkard walkOrganik koridorlar
Wave Function CollapseTile 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.
  1. Oyun döngüsü (game loop) nedir? Sabit ve değişken zaman adımı arasındaki fark nedir?OrtaOyun ProgramlamaGame Dev
  2. Delta time nedir, neden kullanılır?KolayOyun ProgramlamaGame Dev
  3. Object pooling nedir, neden kullanılır?OrtaOyun ProgramlamaGame Dev
  4. Entity Component System (ECS) nedir? Klasik nesne yönelimli yapıdan farkı nedir?ZorOyun ProgramlamaGame Dev
  5. Çarpışma tespitinde broad phase ve narrow phase nedir?ZorOyun ProgramlamaGame Dev
  6. Multiplayer oyunlarda server authority, client-side prediction ve lag compensation nasıl çalışır?ZorOyun ProgramlamaGame Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle