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;
}Aufgabe
MittelMit 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
CharacterBuildStärke und Beweglichkeit zu gespeicherten Werten: Ersetze die EigenschaftStrengthdurch ein öffentliches Feldstrengthund lasseagilityprivat, aber markiere es mit[SerializeField]. - Eine Liste für sich allein wird als
{}geschrieben. Schreibe unter CharacterBuild eine mit[System.Serializable]markierte KlasseTeammit einem öffentlichen Feldheroesvom TypList<CharacterBuild>. Ersetze inTeamCodedie Listeheroesdurch ein öffentliches Feldteamvom Typ Team und gibTeam code:gefolgt vom JSON vonteamaus. - Lies in
LoadCodeden Code mit JsonUtility inteamein und gib aus, wie viele Helden darin enthalten sind, zum BeispielLoaded 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;
}
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
1Komponenten statt Hierarchien
Kleine KomponentenEin Basisskript für GegnerAbstrakte KomponentenKomponenten im ZusammenspielRückblick: Modularer Geschützturm4Serialisierte Daten
Serialisierbare KlassenListen im InspectorEnums im InspectorRückblick: Loot-Tabelle7Zustandsautomaten
Zustände als KlassenEin ZustandsautomatÜbergängeGegner-KIWiederholung: Türzustände10Projekt: Arena-Überlebenskampf
Der HeldGegnertypen2Interfaces in Unity
IDamageableInterfaces und TryGetComponentGetComponentsRückblick: Interaktionstaste5ScriptableObjects
Daten-AssetsWaffenwerteGemeinsame EinstellungenWellen als DatenRückblick: Item-Datenbank8Wiederverwendbarer Code
ErweiterungsmethodenEin generisches SingletonGenerische HilfsmethodenRückblick: FindNearest