JsonUtility
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 30 de 64.
JSON es texto que contiene los valores de un objeto, por lo 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, por lo 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: no escribe propiedades, campos estáticos ni campos privados sin atributos. También omite los campos de tipo Dictionary y aquellos cuya clase no es [System.Serializable]. El Inspector también omite esos campos. JsonUtility.ToJson(obj, true) escribe el mismo JSON distribuido en varias líneas, lo que facilita su lectura.
Se escribe una lista dentro de una clase, como ocurre con badges. Una lista por sí sola no se escribe: JsonUtility necesita un objeto en el nivel superior, así que JsonUtility.ToJson(scores) para una List<int> con los valores 10, 20 y 30 devuelve {}. Incluye 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
IntermedioComparte el equipo como código JSON.
- En
CharacterBuild, convierteStrengthen un campo,public int strength;, y marcaagilitycon[SerializeField]. - Debajo, escribe una clase
Team[System.Serializable]conpublic List<CharacterBuild> heroes;. EnTeamCode, declara la lista comopublic Team team;y registra su JSON. LoadCodeleecodeenteamy registraLoaded 3 heroes.
Pulsa «Jugar» y luego la barra espaciadora: el equipo se muestra como JSON. Después, pulsa «Comprobar».
Pruébalo tú mismo
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class CharacterBuild
{
public string hero;
public int Strength { get; set; }
private int agility;
}
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 modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergente6Guardar con JSON
JsonUtilityGuarda la partidaCargar y valores predeterminadosRepaso: espacios de guardadoElegir y eliminar un espacioPractica por tu cuenta: Playground de Unity