Beständig data

Spara data mellan scener

Static

public class AvatarController : MonoBehaviour
{
  public static int score = 100;
}

Eftersom statiska variabler inte är knutna till någon specifik instans av klassen så finns de kvar även när alla instanser som finns i scenen förstörts. Därför kan de användas för att lagra data som ska föras över från en scen till en annan.

DontDestroyOnLoad()

Objektet som anges som parameter kommer inte att förstöras när en ny scen laddas, utan ligga kvar i minnet. Det betyder att alla objektets variabler också behåller sina värden. Objektet kan sedan hittas i den nya scenen genom t.ex. Find, och dess värden läsas av.

public class ScoreHandler : MonoBehaviour
{
  public int score = 0;

  void Start()
  {
    DontDestroyOnLoad(this.gameObject);
  }
}

Spara data mellan körningar av spelet

PlayerPrefs

Kan användas för att spara strings, ints och floats för spelet.

Save()

Sparar alla värden till hårddisk.

HasKey()

Tar emot en string som parameter, returnerar true ifall det finns ett värde med det namnet.

if (PlayerPrefs.HasKey("score"))
{
  score = PlayerPrefs.GetInt("score");
}

DeleteKey()

Tar emot en string som parameter, tar bort värdet med det namnet (om det finns).

DeleteAll()

Tar bort alla värden.

GetInt(), SetInt()

Läser av respektive ändrar på ett int-värde med det namn som anges som parameter.

PlayerPrefs.SetInt("Score", 300);

score = PlayerPrefs.GetInt("score");

GetFloat, SetFloat

Läser av respektive ändrar på ett int-värde med det namn som anges som parameter.

PlayerPrefs.SetFloat("modifier", 3.4f);

modifier = PlayerPrefs.GetFloat("modifier");

GetString, SetString

Läser av respektive ändrar på ett string-värde med det namn som anges som parameter.

PlayerPrefs.SetString("name", "Mira");

name = PlayerPrefs.GetString("name");

WriteAllText, WriteAllLines

string name = "Mira";
string filename = Application.persistentDataPath + "/name.txt";

File.WriteAllText(filename, name);

I Windows är Application.persistentDataPath lika med:

%userprofile%\AppData\LocalLow<companyname><productname>

Där %userprofile% är din användares mapp (t.ex. C:\Users\Krank) och <companyname> och <productname> är de som angetts under Player Settings (Edit → Project Settings → Player).

JsonUtility

För att förbereda en klass för serialisering med JsonUtility, markera den som [System.Serializable].

GameData.cs
[System.Serializable]
public class GameData
{
  public int score;
  public string name;
}

Sedan kan instanser av klassen serialiseras / deserialiseras.

ScoreHandler.cs
public class ScoreHandler : MonoBehaviour
{
  public GameData data = new GameData();

  public void SaveData()
  {
    string jsonString = JsonUtility.ToJson(data);
    string filename = Application.persistentDataPath + "/data.txt";
    File.WriteAllText(filename, jsonString);
  }

  public void LoadData()
  {
    string filename = Application.persistentDataPath + "/data.txt";
    string jsonString = File.ReadAllText(filename);
    data = JsonUtility.FromJson<GameData>(jsonString);
  }
}

JsonUtility.ToJson()

Tar emot ett objekt som parameter, returnerar JSON-kod. Lägger man med både ett objekt och ett boolskt värde så avgör det boolska värdet huruvida JSON-koden är snyggt formaterad med indrag etc.

string jsonString = JsonUtility.ToJson(data);
string jsonStringPretty = JsonUtility.ToJson(data, true);

JsonUtility.FromJson<>()

Tar emot en klass mellan <> och en string som parameter. Returnerar en instans av klassen, baserad på den deserialiserade JSON-koden i stringen.

data = JsonUtility.FromJson<GameData>(jsonString);

Last updated