Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
C# Dersleri

Unity'de JSON ile Veri Kaydetme ve Basit Şifreleme

Paylaşan: Unity Eğitim 24 December 2025 7 dakika okuma 183 görüntülenme

Giriş

Oyunlarımızda oyuncu ilerlemesini, ayarları veya envanteri kalıcı hale getirmek, modern oyun geliştirmenin olmazsa olmazlarındandır. Unity, bu ihtiyacı karşılamak için çeşitli yöntemler sunar. Bu makalede, popüler ve esnek bir veri formatı olan JSON'u kullanarak Unity JSON Kayıt sistemini nasıl kuracağımızı ve verilerimizi basit bir şifreleme yöntemiyle nasıl koruyacağımızı detaylıca inceleyeceğiz.

Unity'de Veri Kaydetme Neden Önemli?

Bir oyunun temel amacı genellikle oyuncuya belirli bir deneyim sunmaktır. Bu deneyimin sürekliliği, oyuncunun oyunu kapattığında bile ilerlemesinin, kazandığı eşyaların veya yaptığı ayarların kaybolmamasıyla sağlanır. Veri kaydetme ve yükleme mekanizmaları:

  • Oyuncu ilerlemesini (seviyeler, görevler) korur.
  • Oyun içi ekonomi verilerini (para, envanter) saklar.
  • Ayarları (ses düzeyi, grafik kalitesi, dil) kişiselleştirir.
  • Oyunun tekrar oynanabilirliğini artırır.

JSON ile Kayıt Sistemi Kurulumu

JSON (JavaScript Object Notation), insan tarafından okunabilir ve hafif bir veri değişim formatıdır. Unity'nin `JsonUtility` sınıfı sayesinde, C# sınıflarımızı kolayca JSON'a dönüştürebilir (serialize) ve JSON'dan C# nesnelerine geri dönüştürebiliriz (deserialize).

Veri Yapımızı Tanımlayalım

Öncelikle, kaydetmek istediğimiz verileri tutacak bir C# sınıfı veya yapı (struct) oluşturalım. Bu sınıfın `[System.Serializable]` etiketiyle işaretlenmesi ve içindeki alanların `public` olması veya `[SerializeField]` etiketiyle işaretlenmesi gerekir.


using UnityEngine;
using System;

[Serializable]
public class PlayerData
{
    public string playerName;
    public int level;
    public float health;
    public int[] inventoryItems;
    public Vector3 lastPosition;

    public PlayerData()
    {
        playerName = "Yeni Oyuncu";
        level = 1;
        health = 100f;
        inventoryItems = new int[] { 0, 0, 0 };
        lastPosition = Vector3.zero;
    }
}

Kayıt Yolu: `Application.persistentDataPath`

Verilerimizi nereye kaydedeceğiz? Unity'de dosya kaydetmek için en uygun yer `Application.persistentDataPath`'dir. Bu yol, platforma göre değişir ve uygulamanın kaldırmasıyla silinmez. Ayrıca, mobil cihazlarda dosya yazma izinlerini otomatik olarak yönetir.

JSON ile Veri Kaydetme

Veri sınıfımızı oluşturduktan ve kayıt yolunu belirledikten sonra, veriyi JSON formatına dönüştürüp dosyaya yazabiliriz. Bu işlem için `JsonUtility.ToJson()` ve `File.WriteAllText()` metotlarını kullanacağız.


using UnityEngine;
using System.IO;

public class SaveLoadManager : MonoBehaviour
{
    private string savePath;
    private string fileName = "playerdata.json";

    void Awake()
    {
        savePath = Path.Combine(Application.persistentDataPath, fileName);
        Debug.Log("Kayıt Yolu: " + savePath);
    }

    public void SaveGame(PlayerData data)
    {
        string json = JsonUtility.ToJson(data, true); // true ile formatlı JSON çıktısı alırız
        File.WriteAllText(savePath, json);
        Debug.Log("Oyun kaydedildi!");
    }
}

JSON ile Veri Yükleme

Kaydedilen veriyi geri yüklemek içinse `File.ReadAllText()` ile dosyayı okuyup, `JsonUtility.FromJson()` metodunu kullanarak JSON string'ini tekrar `PlayerData` nesnesine dönüştüreceğiz.


using UnityEngine;
using System.IO;

public class SaveLoadManager : MonoBehaviour
{
    // ... (Awake ve SaveGame metotları yukarıdaki gibi)

    public PlayerData LoadGame()
    {
        if (File.Exists(savePath))
        {
            string json = File.ReadAllText(savePath);
            PlayerData data = JsonUtility.FromJson(json);
            Debug.Log("Oyun yüklendi!");
            return data;
        }
        else
        {
            Debug.LogWarning("Kayıt dosyası bulunamadı, yeni bir oyun başlatılıyor.");
            return new PlayerData(); // Yeni bir PlayerData döndür
        }
    }
}

Basit Şifreleme: XOR Yöntemi

Kaydedilen JSON dosyaları insan tarafından okunabilir olduğu için, oyuncuların kayıt dosyalarını kolayca değiştirmesi mümkündür. Bunu engellemek için basit bir şifreleme yöntemi kullanabiliriz. XOR (Exclusive OR) işlemi, bir anahtar (key) kullanarak veriyi şifrelemek ve aynı anahtarla tekrar deşifrelemek için basit ve etkili bir yöntemdir. Ancak, bu yöntem profesyonel güvenlik için yeterli değildir; sadece meraklı oyuncuların basit kurcalamalarını engellemek içindir.

XOR Şifreleme Mantığı

XOR işlemi, iki bitin aynı olması durumunda 0, farklı olması durumunda 1 döndürür. Bir karakteri bir anahtar karakterle XOR'ladığınızda şifrelenir, aynı anahtar karakterle tekrar XOR'ladığınızda orijinal haline geri döner. Bu işlemi bir string'in her karakteri için tekrarlayarak tüm metni şifreleyebiliriz.

Şifreleme ve Deşifreleme Fonksiyonları


public static class EncryptionUtility
{
    private static readonly string encryptionKey = "unityegitimcom"; // Güçlü bir anahtar seçin

    public static string EncryptDecrypt(string data)
    {
        string result = string.Empty;
        for (int i = 0; i < data.Length; i++)
        {
            result += (char)(data[i] ^ encryptionKey[i % encryptionKey.Length]);
        }
        return result;
    }
}

Şifrelenmiş Veri Kaydetme ve Yükleme

Şimdi `SaveLoadManager` sınıfımızı güncelleyerek bu şifreleme fonksiyonunu entegre edelim. Bu sayede, Unity JSON Kayıt sistemimiz daha güvenli hale gelecek.


using UnityEngine;
using System.IO;

public class SaveLoadManager : MonoBehaviour
{
    private string savePath;
    private string fileName = "playerdata.json";

    void Awake()
    {
        savePath = Path.Combine(Application.persistentDataPath, fileName);
        Debug.Log("Kayıt Yolu: " + savePath);
    }

    public void SaveGame(PlayerData data)
    {
        string json = JsonUtility.ToJson(data, true);
        string encryptedJson = EncryptionUtility.EncryptDecrypt(json);
        File.WriteAllText(savePath, encryptedJson);
        Debug.Log("Oyun şifreli olarak kaydedildi!");
    }

    public PlayerData LoadGame()
    {
        if (File.Exists(savePath))
        {
            string encryptedJson = File.ReadAllText(savePath);
            string json = EncryptionUtility.EncryptDecrypt(encryptedJson);
            PlayerData data = JsonUtility.FromJson(json);
            Debug.Log("Oyun şifreli olarak yüklendi!");
            return data;
        }
        else
        {
            Debug.LogWarning("Kayıt dosyası bulunamadı, yeni bir oyun başlatılıyor.");
            return new PlayerData();
        }
    }
}

Pratik İpuçları

Hata Yönetimi ve Dosya Kontrolü

Dosya işlemleri sırasında hatalar oluşabilir (dosya bulunamadı, yazma izni yok vb.). `try-catch` blokları kullanarak bu hataları yakalamak ve kullanıcıya bilgi vermek iyi bir pratiktir.


public void SaveGameSafe(PlayerData data)
{
    try
    {
        string json = JsonUtility.ToJson(data, true);
        string encryptedJson = EncryptionUtility.EncryptDecrypt(json);
        File.WriteAllText(savePath, encryptedJson);
        Debug.Log("Oyun başarıyla kaydedildi!");
    }
    catch (Exception e)
    {
        Debug.LogError("Kayıt sırasında hata oluştu: " + e.Message);
    }
}

Kayıt Verisi Versiyonlama

Oyununuz geliştikçe `PlayerData` sınıfınız değişebilir. Eski kayıt dosyalarını yeni sürümlerle uyumlu hale getirmek için `PlayerData` sınıfınıza bir version alanı ekleyebilir ve yükleme sırasında bu versiyonu kontrol ederek gerekli dönüşümleri yapabilirsiniz.

Ne Zaman Kaydedilmeli?

Oyun kaydetme işlemlerini doğru zamanlarda tetiklemek önemlidir:

  • Oyuncu bir kontrol noktasına ulaştığında.
  • Sahneler arası geçişlerde.
  • Oyuncu oyunu manuel olarak kaydettiğinde.
  • Uygulama kapatılırken (`OnApplicationQuit` veya `OnApplicationPause` metotları içinde).

Yaygın Hatalar ve Çözümleri

`[Serializable]` Etiketi Unutmak

Kayıt edilecek sınıfın veya yapının `[System.Serializable]` etiketiyle işaretlenmemesi, `JsonUtility`'nin onu dönüştürememesine neden olur. Bu etiketi eklemeyi unutmayın.

Dosya Yolu Hataları

Application.persistentDataPath yerine yanlış bir yol kullanmak, özellikle mobil cihazlarda dosya yazma/okuma izin sorunlarına yol açabilir. Daima bu path'i kullanın.

`using` Direktiflerini Eksik Bırakmak

`File` sınıfı için `using System.IO;` ve `Serializable` etiketi için `using System;` direktiflerini dosyanızın başına eklemeyi unutmayın. Aksi takdirde derleme hataları alırsınız.

Performans ve Optimizasyon Notları

JSON ile kayıt işlemleri genellikle küçük ve orta boyutlu veriler için oldukça hızlıdır. Ancak çok büyük veri setleri (örneğin, binlerce envanter öğesi veya procedural olarak oluşturulmuş dünya verileri) için performans sorunları yaşanabilir. Bu tür durumlarda:

  • Kaydetme işlemini ana iş parçacığı (main thread) yerine bir arka plan iş parçacığında (background thread) asenkron olarak çalıştırabilirsiniz.
  • JSON yerine binary (ikili) formatları (örn: Protocol Buffers, MessagePack) veya Unity'nin kendi BinaryFormatter'ını (güvenlik açıkları nedeniyle tavsiye edilmez) kullanmayı düşünebilirsiniz.
  • Gereksiz yere sık sık kaydetme yapmaktan kaçının. Sadece veri değiştiğinde veya belirli aralıklarla kaydetme işlemini tetikleyin.

Bu makalede gösterilen Unity JSON Kayıt yöntemi, çoğu oyun için fazlasıyla yeterli olacaktır.

Sonuç

Unity'de JSON kullanarak sağlam bir veri kaydetme ve yükleme sistemi oluşturmak, oyununuzun kalitesini ve oyuncu deneyimini önemli ölçüde artırır. Basit bir XOR şifrelemesi ekleyerek de kayıt dosyalarınızı meraklı gözlerden bir nebze olsun koruyabilirsiniz. Unutmayın, bu basit şifreleme yöntemi yüksek güvenlik gerektiren durumlar için uygun değildir, ancak çoğu bağımsız oyun projesi için yeterli bir başlangıç noktasıdır. Bu rehber sayesinde kendi Unity JSON Kayıt sistemlerinizi kolayca entegre edebilirsiniz.

🧠 Ders Sonu Değerlendirme Testi

Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.

🔥 +50 XP Ödül
🔒

Sınava Katılmak İçin Giriş Yapın

Bu ders sonu testini çözebilmek, bilginizi test edip **+50 XP** kazanmak ve **Sınav Şampiyonu** rozetinin kilidini açmak için üye girişi yapmalısınız.

Yorumlar (0)

Yorum yazabilmek ve derslere katkıda bulunabilmek için giriş yapmalısınız.

İlk yorumu siz yapın!