Persistente Daten in Unity speichern

Die PlayerPrefs-Klasse bietet eine einfache Möglichkeit skalare Daten in Unity persistent abzuspeichern. Ich nutze an dieser Stelle gerne einen eigenen Abstraktions-Layer, falls ich die Speichermethodik irgendwann einmal ändern möchte. Auch harmoniert der Layer sehr gut mit der von mir entwickelten RuntimeStorage-Klasse.

Gespeichert werden können Integer-, Float- und String-Werte. Dank Überladung gibt es eigentlich nur zwei verschiedene Methoden: Get und Set. Bei Get muss immer zwingend ein Default-Wert vergeben werden (sonst funktioniert die Überladung nicht). Dieser wird zurückgegeben, wenn kein gespeicherter Wert gefunden wurde.

Die Klasse stellt außerdem sicher, dass nicht mehrmals auf das Speichermedium geschrieben wird. Sprich, wenn ihr mehrere Werte nacheinander aktualisiert, dann wird die Speicherung erst in der LateUpdate-Methode getriggert.

using UnityEngine;

public class PersistentStorage : MonoBehaviour
{
    private bool _isDirty = false;

    private void LateUpdate()
    {
        if (_isDirty) {
            PlayerPrefs.Save();
            _isDirty = false;
        }
    }

    public void Set(string key, int value)
    {
        PlayerPrefs.SetInt(key, value);
        _isDirty = true;
    }

    public void Set(string key, float value)
    {
        PlayerPrefs.SetFloat(key, value);
        _isDirty = true;
    }

    public void Set(string key, string value)
    {
        PlayerPrefs.SetString(key, value);
        _isDirty = true;
    }

    public int Get(string key, int defaultValue)
    {
        return PlayerPrefs.GetInt(key, defaultValue);
    }

    public float Get(string key, float defaultValue)
    {
        return PlayerPrefs.GetFloat(key, defaultValue);
    }

    public string Get(string key, string defaultValue)
    {
        return PlayerPrefs.GetString(key, defaultValue);
    }
}

Übrigens sollte man das Ganze am besten als Singleton anlegen. So kann man einfacher auch die Klasse zugreifen.

So kann man dann Werte speichern:

PersistentStorage.Instance.Set("someInteger", 42);
PersistentStorage.Instance.Set("someFloat", 0.815);
PersistentStorage.Instance.Set("someString", "foo");

Und so kann man Werte laden:

PersistentStorage.Instance.Get("someInteger", 0);
PersistentStorage.Instance.Get("someFloat", 0.0f);
PersistentStorage.Instance.Get("someString", "");

Noch keine Kommentare vorhanden.