Menu
CoddyTech

JsonUtility

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 24 di 50.

JSON è testo che contiene i valori di un oggetto, quindi può essere registrato, inviato o scritto in un file. JsonUtility.ToJson(obj) trasforma un oggetto in JSON e JsonUtility.FromJson<T>(json) ne crea uno nuovo di tipo T. JsonUtility segue le stesse regole dell’Inspector, quindi funziona con una classe [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 e Rank sono assenti. JsonUtility scrive i campi pubblici e quelli privati contrassegnati con [SerializeField], e nient’altro: nessuna proprietà, nessun campo statico, nessun campo privato semplice. Viene ignorato anche un campo Dictionary, così come un campo la cui classe non è [System.Serializable]. Sono gli stessi campi che l’Inspector esclude. JsonUtility.ToJson(obj, true) scrive lo stesso JSON distribuito su più righe, più facile da leggere.

Una lista all’interno di una classe viene scritta, come accade con badges. Una lista da sola no: JsonUtility ha bisogno di un oggetto al livello più alto, quindi JsonUtility.ToJson(scores) per una List<int> contenente 10, 20 e 30 restituisce {}. Inserisci la lista in una classe e converti quella; un ScoreBoard che contiene la stessa lista viene scritto come {"scores":[10,20,30]}:

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

Sfida

Medio

Il generatore di squadre permette ai giocatori di condividere una squadra tramite un codice. Premendo Space dovrebbe registrare la squadra come JSON, e LoadCode(string code) dovrebbe leggere un codice. Al momento, premendo Space viene registrato Team code: {} e la forza e l’agilità degli eroi non sono nemmeno visibili nell’Inspector.

  • In CharacterBuild, fai in modo che forza e agilità siano valori salvati: sostituisci la proprietà Strength con un campo pubblico strength e mantieni agility privato, contrassegnandolo con [SerializeField].
  • Una lista da sola viene scritta come {}. Sotto CharacterBuild, scrivi una classe Team [System.Serializable] con un campo pubblico heroes, una List<CharacterBuild>. In TeamCode, sostituisci la lista heroes con un campo pubblico team di tipo Team e registra Team code: seguito dal JSON di team.
  • In LoadCode, leggi il codice in team con JsonUtility e registra quanti eroi contiene, come in Loaded 3 heroes.

L’Inspector riempie team con un Cavaliere (forza 8, agilità 3) e un Arciere (forza 4, agilità 9). Premi Play e premi Space, leggi il codice nella Console, poi Check.

Provalo tu

using UnityEngine;

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

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Architettura dei giochi in Unity