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;
}Desafio
MédioO 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 propriedadeStrengthpor um campo públicostrengthe mantenhaagilityprivado, mas marque-o com[SerializeField]. - Uma lista por si só é escrita como
{}. Abaixo de CharacterBuild, escreva uma classe[System.Serializable]chamadaTeamcom um campo públicoheroes, do tipoList<CharacterBuild>. EmTeamCode, substitua a listaheroespor um campo públicoteamdo tipo Team e registreTeam code:seguido do JSON deteam. - Em
LoadCode, leia o código emteamusando JsonUtility e registre quantos heróis ele contém, como emLoaded 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;
}
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
1Componentes, não hierarquias
Componentes pequenosUm script-base para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens