Menu
CoddyTech

JsonUtility

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

JSON to tekst zawierający wartości obiektu, dzięki czemu można go zapisać w logach, wysłać lub zapisać w 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 Inspector, więc 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);

Brakuje secretCode i Rank. JsonUtility zapisuje pola publiczne i prywatne oznaczone [SerializeField], i nic poza tym: żadnych właściwości, pól statycznych ani zwykłych pól prywatnych. Pomijane jest również pole typu Dictionary, podobnie jak pole, którego klasa nie jest oznaczona jako [System.Serializable]. Inspector również pomija te pola. 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: JsonUtility wymaga obiektu na najwyższym poziomie, więc JsonUtility.ToJson(scores) dla List<int> zawierającej 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

Konstruktor drużyny pozwala graczom udostępniać drużynę jako kod. Spacja powinna zapisywać drużynę jako JSON, a LoadCode(string code) powinna odczytywać kod. Obecnie Spacja zapisuje Team code: {}, a siła i zręczność bohaterów nie są nawet widoczne w Inspectorze.

  • W CharacterBuild spraw, by siła i zręczność były zapisywanymi wartościami: zastąp właściwość Strength publicznym polem strength, a agility pozostaw jako prywatne, ale oznacz je jako [SerializeField].
  • Sama lista jest zapisywana jako {}. Poniżej CharacterBuild napisz klasę Team oznaczoną jako [System.Serializable], z jednym publicznym polem heroes typu List<CharacterBuild>. W TeamCode zastąp listę heroes publicznym polem team typu Team i zapisuj Team code: , a po nim JSON obiektu team.
  • W LoadCode odczytaj kod do team za pomocą JsonUtility i zapisz, ilu bohaterów zawiera, na przykład Loaded 3 heroes.

Inspector wypełnia team Rycerzem (siła 8, zręczność 3) i Łucznikiem (siła 4, zręczność 9). Naciśnij Play i naciśnij Spację, odczytaj kod w konsoli, a następnie wybierz Check.

Spróbuj swoich sił

using UnityEngine;

[System.Serializable]
public class CharacterBuild
{
    public string hero;
    public int Strength { get; set; }
    private int agility;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Architektura gier w Unity