Menu
CoddyTech

JsonUtility

Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 24 de 50.

JSON é um texto que armazena os valores de um objeto, para que ele possa ser registrado em um log, enviado ou gravado em um arquivo. JsonUtility.ToJson(obj) transforma um objeto em JSON e JsonUtility.FromJson<T>(json) cria um novo T a partir dele. JsonUtility segue as mesmas regras do Inspector, então funciona com uma 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 estão ausentes. JsonUtility grava campos públicos e campos privados marcados com [SerializeField], e nada mais: nenhuma propriedade, nenhum campo estático, nenhum campo privado comum. Um campo Dictionary também é ignorado, assim como um campo cuja classe não é [System.Serializable]. Esses também são os campos que o Inspector deixa de fora. JsonUtility.ToJson(obj, true) grava o mesmo JSON distribuído em várias linhas, o que facilita a leitura.

Uma lista dentro de uma classe é gravada, como acontece com badges. Uma lista isolada não é: JsonUtility precisa de um objeto no nível superior, então JsonUtility.ToJson(scores) para um List<int> com 10, 20 e 30 retorna {}. Coloque a lista em uma classe e converta essa classe; um ScoreBoard que contém a mesma lista é gravado como {"scores":[10,20,30]}:

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

Desafio

Médio

O construtor de equipes permite que os jogadores compartilhem uma equipe como um código. A tecla Espaço deve registrar a equipe como JSON, e LoadCode(string code) deve ler um código. No momento, a tecla Espaço registra Team code: {}, e a força e a agilidade dos heróis nem sequer aparecem no Inspector.

  • Em CharacterBuild, faça com que força e agilidade sejam valores salvos: substitua a propriedade Strength por um campo público strength e mantenha agility privado, mas marque-o com [SerializeField].
  • Uma lista por si só é escrita como {}. Abaixo de CharacterBuild, escreva uma classe [System.Serializable] chamada Team com um campo público heroes, do tipo List<CharacterBuild>. Em TeamCode, substitua a lista heroes por um campo público team do tipo Team e registre Team code: seguido do JSON de team.
  • Em LoadCode, leia o código em team usando JsonUtility e registre quantos heróis ele contém, como em Loaded 3 heroes.

O Inspector preenche team com um Knight (força 8, agilidade 3) e um Archer (força 4, agilidade 9). Pressione Play e a tecla Espaço, leia o código no Console e, em seguida, clique em Check.

Experimente você mesmo

using UnityEngine;

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

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Arquitetura de jogos no Unity