Menu
CoddyTech

JsonUtility

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

JSON est du texte qui contient les valeurs d’un objet ; il peut donc être affiché dans les journaux, envoyé ou écrit dans un fichier. JsonUtility.ToJson(obj) convertit un objet en JSON et JsonUtility.FromJson<T>(json) en crée un nouveau T. JsonUtility suit les règles de 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 propriétés, ni champs statiques, ni 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 exclut. JsonUtility.ToJson(obj, true) écrit le même JSON sur plusieurs lignes, ce qui le rend plus facile à lire.

Une liste à l’intérieur d’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) pour 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 ainsi : {"scores":[10,20,30]} :

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

Défi

Moyen

Le constructeur d’équipe permet aux joueurs de partager une équipe sous forme de code. La barre d’espace doit afficher l’équipe au format JSON, et LoadCode(string code) doit lire un code. Actuellement, la barre d’espace affiche Team code: {}, et la force et l’agilité des héros ne sont même pas dans l’Inspector.

  • Dans CharacterBuild, faites de la force et de l’agilité des valeurs enregistrées : remplacez la propriété Strength par un champ public strength, et gardez agility privé, mais marquez-le avec [SerializeField].
  • Une liste seule s’écrit {}. Sous CharacterBuild, écrivez une classe Team [System.Serializable] avec un seul champ public heroes, de type List<CharacterBuild>. Dans TeamCode, remplacez la liste heroes par un champ public team de type Team, et affichez Team code: suivi du JSON de team.
  • Dans LoadCode, lisez le code dans team avec JsonUtility, et affichez le nombre de héros qu’il contient, sous la forme Loaded 3 heroes.

L’Inspector remplit team avec un Chevalier (force 8, agilité 3) et un Archer (force 4, agilité 9). Appuyez sur Play puis sur la barre d’espace, lisez le code dans la Console, puis cliquez sur Check.

Essayez vous-même

using UnityEngine;

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

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Architecture de jeu dans Unity