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;
}Wyzwanie
ŚredniKonstruktor 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
CharacterBuildspraw, by siła i zręczność były zapisywanymi wartościami: zastąp właściwośćStrengthpublicznym polemstrength, aagilitypozostaw jako prywatne, ale oznacz je jako[SerializeField]. - Sama lista jest zapisywana jako
{}. Poniżej CharacterBuild napisz klasęTeamoznaczoną jako[System.Serializable], z jednym publicznym polemheroestypuList<CharacterBuild>. WTeamCodezastąp listęheroespublicznym polemteamtypu Team i zapisujTeam code:, a po nim JSON obiektuteam. - W
LoadCodeodczytaj kod doteamza pomocą JsonUtility i zapisz, ilu bohaterów zawiera, na przykładLoaded 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;
}
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
1Komponenty, nie hierarchie
Małe komponentyPodstawowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPodsumowanie: modułowa wieżyczka4Dane serializowane
Klasy serializowalneListy w InspectorzeWyliczenia w InspectorzePodsumowanie: tabela łupów10Projekt: Arena przetrwania
BohaterTypy wrogów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPodsumowanie: klawisz interakcji5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaFale jako danePowtórka: baza danych przedmiotów8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest3Zdarzenia
Zdarzenia C# w UnitySubskrypcja w OnEnablePola UnityEventZdarzenia sterują interfejsemPodsumowanie: wyskakujące okno osiągnięcia6Zapisywanie za pomocą JSON
JsonUtilityZapisz gręWczytywanie i wartości domyślnePowtórka: sloty zapisu