Menu
CoddyTech

JsonUtility

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 30 sur 64.

JSON est du texte qui contient les valeurs d'un objet, afin qu'elles puissent être consignées, envoyées ou écrites dans un fichier. JsonUtility.ToJson(obj) transforme un objet en JSON et JsonUtility.FromJson<T>(json) en crée un nouveau T. JsonUtility suit les mêmes règles que l'Inspector ; il fonctionne donc avec une 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 et Rank sont absents. JsonUtility écrit les champs publics et les champs privés marqués [SerializeField], et rien d'autre : ni les propriétés, ni les champs statiques, ni les champs privés ordinaires. Un champ Dictionary est également ignoré, tout comme un champ dont la classe n'est pas [System.Serializable]. Ce sont aussi les champs que l'Inspector omet. JsonUtility.ToJson(obj, true) écrit le même JSON sur plusieurs lignes, ce qui le rend plus facile à lire.

Une liste contenue dans une classe est écrite, comme c'est le cas pour badges. Une liste seule ne l'est pas : JsonUtility a besoin d'un objet à la racine, donc JsonUtility.ToJson(scores) appliqué à une List<int> contenant 10, 20 et 30 renvoie {}. Place la liste dans une classe et convertis cette classe ; un ScoreBoard contenant la même liste est écrit sous la forme {"scores":[10,20,30]} :

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

Défi

Moyen

Partage l’équipe sous forme de code JSON.

  1. Dans CharacterBuild, fais de Strength un champ, public int strength;, et marque agility avec [SerializeField].
  2. En dessous, écris une classe Team [System.Serializable] avec public List<CharacterBuild> heroes;. Dans TeamCode, déclare la liste avec public Team team; et affiche son JSON dans les journaux.
  3. LoadCode lit code dans team et affiche Loaded 3 heroes dans les journaux.

Appuie sur « Jouer », puis sur Espace : l’équipe s’affiche au format JSON. Ensuite, appuie sur « Vérifier ».

Essayez vous-même

using System.Collections.Generic;
using UnityEngine;

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

Toutes les leçons de Architecture de jeu dans Unity

Entraînez-vous par vous-même : Playground Unity