Unity Oyun Verilerini Kaydetme

ücretsiz unity eğitim serisi

Unity’de oyun verilerini kaydetmeyi inceleyeceğiz. PlayerPrefs ve Serialization yöntemlerini kullanarak local(yerel) olarak verileri kaydedebiliriz.

PlayerPrefs oyuncu tercihlerini kaydetmek içindir; yüksek puanlar ve ilerleme verileri kaydetmek için kullanmak istemezsiniz. Çünkü oyuncuların PlayerPrefs verilerini düzenlemeleri zor değildir. Verileri güvenli bir şekilde kaydetmenin birkaç yolu vardır. BinaryFormatter sınıfını kullanarak Serialization’a da değineceğiz.

1. Unity’de PlayerPrefs Kullanımı

PlayerPrefs ile string, float ve integer olmak üzere üç tip veri tipini kaydedebiliriz. PlayerPrefs’i ilerleme verilerini (skor, level vs.) kaydetmek için kullanmamalıyız. Çünkü PlayerPrefs verileri rahat şekilde erişilebilir. Örneğin Android cihazlarda /data/data/pkg-name/shared_prefs/pkg-name.xml şeklindeki bir yolu takip ederek PlayerPrefs verilerine erişebiliriz. PlayerPrefs oyuncu tercihlerini kaydetmek için kullanılabilir. Örnek olarak ses derecesi verilebilir.

1.1 PlayerPrefs İle Veri Kaydetme

PlayerPrefs ile bir veri kaydetmek için bir anahtar kelime belirlememiz gerekiyor. Bu anahtar kelime yardımıyla daha sonra kaydedeceğimiz veriye ulaşabiliriz. Aşağıda üç farklı veri tipini kaydettik.

PlayerPrefs.SetInt("AcilanSahneNo", 1);
PlayerPrefs.SetString("OyuncuAdi", "Mert");
PlayerPrefs.SetFloat("SesDerecesi", 50.5f);

 1.2 PlayerPrefs İle Kaydedilen Veriye Ulaşma

Önceki başlıkta kaydettiğimiz verilere ulaşmak için anahtar kelimeleri kullanacağız.

int acilanSahneNo = PlayerPrefs.GetInt("AcilanSahneNo");
string oyuncuAdi = PlayerPrefs.GetString("OyuncuAdi");
float sesDerecesi = PlayerPrefs.GetFloat("SesDerecesi");

 1.3 PlayerPrefs Diğer Fonksiyonları

  • HasKey: Bir anahtarın var olup olmadığının bool değerini döndürür.
  • DeleteKey: Belirlenen anahtar ve değerini siler.
  • DeleteAll: Bütün anahtarları ve sahip olduğu verileri siler.
if (PlayerPrefs.HasKey("SesDerecesi"))
{
    Debug.Log("Ses derecesi kaydedilmiş");
}

PlayerPrefs.DeleteKey("AcilanSahneNo");

PlayerPrefs.DeleteAll();

 

2. Serialization ile Güvenli Şekilde Veri Kaydetme

BinaryFormatter bir nesneyi serileştirmek için (yani onu 1 ve 0 lardan oluşan bir dizgiye dönüştürür) veya eski haline geri getirmek için kullanılır. Genellikle sabit diskte kaydedilir. Böylece oyun kapatıldıktan ve yeniden başlatıldıktan sonra tekrar yüklenebilir. Burada verileri kaydetmek ve yüklemek için BinaryFormatter ve FileStream kullanarak bu işlemleri gerçekleştireceğimiz bir sınıf oluşturduk.

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;
public class SaveManager
{
    [System.Serializable]
    public class Data
    {
        public int level;
        public float health;
        public bool isHardMode;
    }

    protected string savePath;
    public SaveManager()
    {
        this.savePath = Application.persistentDataPath + "/save.dat";
        this.loadDataFromDisk();
    }
    /**
     * Verileri diske kaydetme.
     */
    public void saveDataToDisk(Data data)
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create(savePath);
        bf.Serialize(file, data);
        file.Close();
    }
    /**
     * Verileri Diskten Yükleme
     */
    public void loadDataFromDisk()
    {
        if (File.Exists(savePath))
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(savePath, FileMode.Open);
            //Data data = (Data)bf.Deserialize(file);
            file.Close();
        }
    }
}