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;
}Sfida
MedioIl 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àStrengthcon un campo pubblicostrengthe mantieniagilityprivato, contrassegnandolo con[SerializeField]. - Una lista da sola viene scritta come
{}. Sotto CharacterBuild, scrivi una classeTeam[System.Serializable]con un campo pubblicoheroes, unaList<CharacterBuild>. InTeamCode, sostituisci la listaheroescon un campo pubblicoteamdi tipo Team e registraTeam code:seguito dal JSON diteam. - In
LoadCode, leggi il codice inteamcon JsonUtility e registra quanti eroi contiene, come inLoaded 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;
}
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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti