🎮
Unity snabbreferens
  • Unity snabbreferens
  • Installation & setup
  • Kompilera och distribuera
  • Unity och git
  • Grundläggande koncept
    • Begrepp
    • Ett Unityprojekts uppbyggnad
    • Prefabs och instanser
    • Komponenter
    • Scener
    • MonoBehavior
    • Lager och taggar
    • Knappar och axlar
  • Grundfunktioner
    • Debug och gizmos
    • Datatyper och synlighet
    • Input
      • Action-based Input System
    • Flytta och rotera
    • Kollisioner
    • Skapa och förstör
    • Hitta spelobjekt
    • Beständig data
    • Slump
    • Fysik (2D och 3D)
      • Raycasting*
    • UI och Canvas*
    • Importera grafik*
      • Sprite editor*
    • Unity Events
    • Invoke, Couroutines
    • Animationer*
      • AnimationClip*
      • Animator Controller*
  • Andra funktioner
    • Tilemaps*
    • Asset Store
      • Användbara Assets
    • Package manager
    • Meddelanden
    • CharacterController
    • Scriptable objects*
  • Tilläggspaket
    • AI-Navmesh*
    • Mirror (nätverk)
    • XR Toolkit
      • Controllers
      • Interaktion*
      • Device Simulator
      • Teleportation
      • Meta Quest 2/3
      • 3D-modeller*
    • MRTK3 (HoloLens 2)
      • Grundkoncept*
      • Simulering
      • Interaktion*
      • Röststyrning
      • UI/UX och Canvas*
      • Spatial awareness*
      • Deployment*
    • MRTK2 (Hololens 1)
    • ProBuilder
  • Tekniker
    • Påverka andra objekt*
    • Rutnät*
Powered by GitBook
On this page
  • Spara data mellan scener
  • Static
  • DontDestroyOnLoad()
  • Spara data mellan körningar av spelet
  • PlayerPrefs
  • WriteAllText, WriteAllLines
  • JsonUtility

Was this helpful?

  1. Grundfunktioner

Beständig data

PreviousHitta spelobjektNextSlump

Last updated 2 years ago

Was this helpful?

Spara data mellan scener

Static

Ett väldigt enkelt sätt att spara data så att den inte förstörs vid scenbyte är att lagra datan i en variabel.

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. , 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);

för att läsa och skriva data fungerar precis likadant i Unity. Däremot bör man använda Application.persistentDataPath som första del av alla filnamn för att se till så filerna sparas i rätt mapp (spelets data-mapp).

Även om senare versioner av Dotnet har för att serialisera och deserialisera så saknas dessa i den version av Dotnet som ingår i Unity. Istället har Unity JsonUtility.

Samma metoder som används i vanliga C#
inbyggda bibliotek
JSON
statisk
Find