Bir oyunda kayıt (save) sistemi nasıl tasarlanır? Serileştirmede nelere dikkat edilir?

Cevap

Temel ilke: sahnedeki nesneleri değil, oyun durumunu (state) kaydetmek. Kaydedilecek veriler sade veri sınıflarında toplanır, yüklemede bu veriden dünya yeniden kurulur.

[System.Serializable]
public class SaveData
{
    public int version = 2;
    public float[] playerPosition;   // Vector3 yerine düz dizi
    public int health;
    public List<string> collectedItemIds = new();
}

public static class SaveSystem
{
    static string PathFor(int slot) => Path.Combine(Application.persistentDataPath, $"save{slot}.json");

    public static void Save(SaveData data, int slot)
    {
        string json = JsonUtility.ToJson(data);
        string tmp = PathFor(slot) + ".tmp";
        File.WriteAllText(tmp, json);
        File.Copy(tmp, PathFor(slot), overwrite: true);   // yarım yazılmış kayda karşı
        File.Delete(tmp);
    }

    public static SaveData Load(int slot)
    {
        string p = PathFor(slot);
        return File.Exists(p) ? JsonUtility.FromJson<SaveData>(File.ReadAllText(p)) : new SaveData();
    }
}

Dikkat edilecekler

  • Benzersiz kimlikler: Toplanan eşyalar, açılan kapılar gibi sahne nesnelerine kalıcı ID verilir (isim veya sahnedeki sıra güvenilir değildir).
  • Versiyonlama: Oyun güncellenince eski kayıtlar bozulmamalı; version alanı ve migration kodu tutulur.
  • Format seçimi: JSON okunabilir ve debug dostudur; binary format (MessagePack, protobuf) daha küçük ve hızlıdır. .NET'in BinaryFormatter'ı güvenlik açıkları nedeniyle kullanılmamalıdır.
  • Atomik yazma: Yazma sırasında oyun çökerse kayıt bozulmasın diye önce geçici dosyaya yazılır.
  • Hile koruması: Tek oyunculu oyunlarda checksum yeterlidir; rekabetçi oyunlarda gerçek veri sunucuda tutulur.
  • Unity'ye özgü: JsonUtility Dictionary ve property desteklemez; gerekirse Newtonsoft.Json kullanılır. PlayerPrefs sadece ayarlar için uygundur, oyun kaydı için değil.
  • Konsol ve mobil platformlarda kayıt API'leri ve depolama kısıtları farklıdır.
  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