Menu
CoddyTech

JsonUtility

Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 24 von 50.

JSON ist Text, der die Werte eines Objekts enthält, sodass er protokolliert, gesendet oder in eine Datei geschrieben werden kann. JsonUtility.ToJson(obj) wandelt ein Objekt in JSON um, und JsonUtility.FromJson<T>(json) erstellt daraus ein neues T. JsonUtility folgt denselben Regeln wie der Inspector und funktioniert daher mit einer Klasse [System.Serializable]:

[System.Serializable]
public class PlayerProfile
{
    public string playerName = "Ana";
    public int level = 7;
    public List<string> badges = new List<string> { "Explorer", "Sharpshooter" };
    [SerializeField] private float hoursPlayed = 12.5f;
    private int secretCode = 1234;
    public int Rank { get; set; } = 3;
}
string json = JsonUtility.ToJson(new PlayerProfile());
// {"playerName":"Ana","level":7,"badges":["Explorer","Sharpshooter"],"hoursPlayed":12.5}
PlayerProfile copy = JsonUtility.FromJson<PlayerProfile>(json);

secretCode und Rank fehlen. JsonUtility schreibt öffentliche Felder und private Felder, die mit [SerializeField] markiert sind, und sonst nichts: keine Eigenschaften, keine statischen Felder und keine gewöhnlichen privaten Felder. Auch ein Dictionary-Feld wird übersprungen, ebenso wie ein Feld, dessen Klasse nicht [System.Serializable] ist. Diese Felder lässt auch der Inspector aus. JsonUtility.ToJson(obj, true) schreibt dasselbe JSON über mehrere Zeilen verteilt, sodass es leichter zu lesen ist.

Eine Liste innerhalb einer Klasse wird geschrieben, wie es bei badges der Fall ist. Eine Liste für sich allein wird nicht geschrieben: JsonUtility benötigt ganz oben ein Objekt, daher gibt JsonUtility.ToJson(scores) für eine List<int> mit den Werten 10, 20 und 30 {} zurück. Packe die Liste in eine Klasse und wandle diese um; ein ScoreBoard, das dieselbe Liste enthält, wird als {"scores":[10,20,30]} geschrieben:

[System.Serializable]
public class ScoreBoard
{
    public List<int> scores;
}
challenge icon

Aufgabe

Mittel

Mit dem Team-Builder können Spieler ein Team als Code teilen. Mit der Leertaste sollte das Team als JSON ausgegeben werden, und LoadCode(string code) sollte einen Code wieder einlesen. Momentan wird mit der Leertaste Team code: {} ausgegeben, und die Stärke und Beweglichkeit der Helden sind nicht einmal im Inspector zu sehen.

  • Mache in CharacterBuild Stärke und Beweglichkeit zu gespeicherten Werten: Ersetze die Eigenschaft Strength durch ein öffentliches Feld strength und lasse agility privat, aber markiere es mit [SerializeField].
  • Eine Liste für sich allein wird als {} geschrieben. Schreibe unter CharacterBuild eine mit [System.Serializable] markierte Klasse Team mit einem öffentlichen Feld heroes vom Typ List<CharacterBuild>. Ersetze in TeamCode die Liste heroes durch ein öffentliches Feld team vom Typ Team und gib Team code: gefolgt vom JSON von team aus.
  • Lies in LoadCode den Code mit JsonUtility in team ein und gib aus, wie viele Helden darin enthalten sind, zum Beispiel Loaded 3 heroes.

Im Inspector wird team mit einem Ritter (Stärke 8, Beweglichkeit 3) und einem Bogenschützen (Stärke 4, Beweglichkeit 9) befüllt. Drücke Play und dann die Leertaste, lies den Code in der Console ab und klicke anschließend auf Check.

Probier es selbst

using UnityEngine;

[System.Serializable]
public class CharacterBuild
{
    public string hero;
    public int Strength { get; set; }
    private int agility;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Spielarchitektur in Unity