JsonUtility
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 24 de 50.
JSON es texto que contiene los valores de un objeto, así que se puede registrar, enviar o escribir en un archivo. JsonUtility.ToJson(obj) convierte un objeto en JSON y JsonUtility.FromJson<T>(json) crea un nuevo T a partir de él. JsonUtility sigue las mismas reglas que el Inspector, así que funciona con una clase [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);Faltan secretCode y Rank. JsonUtility escribe los campos públicos y los campos privados marcados con [SerializeField], y nada más: ninguna propiedad, ningún campo estático ni ningún campo privado sin atributos. También omite los campos Dictionary y los campos cuya clase no es [System.Serializable]. El Inspector también excluye esos campos. JsonUtility.ToJson(obj, true) escribe el mismo JSON repartido en varias líneas, para que sea más fácil de leer.
Una lista dentro de una clase se escribe, como ocurre con badges. Una lista por sí sola no: JsonUtility necesita un objeto en el nivel superior, así que JsonUtility.ToJson(scores) para un List<int> con 10, 20 y 30 devuelve {}. Pon la lista en una clase y conviértela; un ScoreBoard que contiene la misma lista se escribe como {"scores":[10,20,30]}:
[System.Serializable]
public class ScoreBoard
{
public List<int> scores;
}Desafío
IntermedioEl creador de equipos permite que los jugadores compartan un equipo como código. Al pulsar la barra espaciadora se debe registrar el equipo como JSON, y LoadCode(string code) debe leer el código. Ahora mismo, al pulsar la barra espaciadora se registra Team code: {}, y la fuerza y la agilidad de los héroes ni siquiera aparecen en el Inspector.
- En
CharacterBuild, haz que la fuerza y la agilidad sean valores guardados: reemplaza la propiedadStrengthpor un campo públicostrength, y manténagilityprivado, pero márcalo con[SerializeField]. - Una lista por sí sola se escribe como
{}. Debajo de CharacterBuild, escribe una claseTeamcon[System.Serializable]y un único campo públicoheroes, unaList<CharacterBuild>. EnTeamCode, reemplaza la listaheroespor un campo públicoteamde tipo Team, y registraTeam code:seguido del JSON deteam. - En
LoadCode, lee el código enteamcon JsonUtility y registra cuántos héroes contiene, como enLoaded 3 heroes.
El Inspector llena team con un Caballero (fuerza 8, agilidad 3) y un Arquero (fuerza 4, agilidad 9). Pulsa Play y luego la barra espaciadora, lee el código en la Consola y, después, pulsa Check.
Pruébalo tú mismo
using UnityEngine;
[System.Serializable]
public class CharacterBuild
{
public string hero;
public int Strength { get; set; }
private int agility;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Arquitectura de juegos en Unity
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modular4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botín7Máquinas de estados
Estados como clasesUna máquina de estadosTransicionesCerebros de enemigosRepaso: estados de puertas10Proyecto: Superviviente de la arena
El héroeTipos de enemigos2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: tecla de interacción5ScriptableObjects
Recursos de datosEstadísticas de armasConfiguración compartidaOleadas como datosRepaso: base de datos de objetos