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ı;
versionalanı 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ü:
JsonUtilityDictionary ve property desteklemez; gerekirse Newtonsoft.Json kullanılır.PlayerPrefssadece 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.
İ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.