Menu
CoddyTech

JsonUtility

Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 30 z 64.

JSON to tekst zawierający wartości obiektu, dzięki czemu można go zalogować, wysłać lub zapisać do pliku. JsonUtility.ToJson(obj) zamienia obiekt na JSON, a JsonUtility.FromJson<T>(json) tworzy na jego podstawie nowy obiekt T. JsonUtility stosuje te same zasady co Inspektor, dlatego działa z klasą [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 i Rank nie występują w JSON-ie. JsonUtility zapisuje publiczne pola oraz prywatne pola oznaczone atrybutem [SerializeField] i nic więcej: żadnych właściwości, pól statycznych ani zwykłych pól prywatnych. Pomija też pole typu Dictionary oraz pole, którego klasa nie jest oznaczona atrybutem [System.Serializable]. Są to również pola pomijane przez Inspektora. JsonUtility.ToJson(obj, true) zapisuje ten sam JSON w kilku wierszach, dzięki czemu łatwiej go odczytać.

Lista wewnątrz klasy jest zapisywana, tak jak badges. Sama lista nie jest zapisywana: JsonUtility wymaga obiektu na najwyższym poziomie, dlatego JsonUtility.ToJson(scores) dla obiektu List<int> zawierającego 10, 20 i 30 zwraca {}. Umieść listę w klasie i przekonwertuj tę klasę; ScoreBoard zawierający tę samą listę zostanie zapisany jako {"scores":[10,20,30]}:

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

Wyzwanie

Średni

Udostępnij drużynę jako kod JSON.

  1. W CharacterBuild utwórz pole Strength, public int strength;, a agility oznacz jako [SerializeField].
  2. Poniżej napisz klasę Team z atrybutem [System.Serializable] i polem public List<CharacterBuild> heroes;. W TeamCode utwórz listę public Team team; i zapisuj jej dane w formacie JSON.
  3. LoadCode wczytuje code do team i zapisuje Loaded 3 heroes w logu.

Naciśnij „Graj” i naciśnij spację: drużyna zostanie wyświetlona w formacie JSON. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using System.Collections.Generic;
using UnityEngine;

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

Wszystkie lekcje w sekcji Architektura gier w Unity

Poćwicz samodzielnie: Edytor online Unity