Menu
CoddyTech

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;
}
challenge icon

Desafío

Intermedio

El 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 propiedad Strength por un campo público strength, y mantén agility privado, pero márcalo con [SerializeField].
  • Una lista por sí sola se escribe como {}. Debajo de CharacterBuild, escribe una clase Team con [System.Serializable] y un único campo público heroes, una List<CharacterBuild>. En TeamCode, reemplaza la lista heroes por un campo público team de tipo Team, y registra Team code: seguido del JSON de team.
  • En LoadCode, lee el código en team con JsonUtility y registra cuántos héroes contiene, como en Loaded 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;
}
quiz iconPonte a prueba

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