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;
}Défi
MoyenLe 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éStrengthpar un champ publicstrength, et gardezagilityprivé, mais marquez-le avec[SerializeField]. - Une liste seule s’écrit
{}. Sous CharacterBuild, écrivez une classeTeam[System.Serializable]avec un seul champ publicheroes, de typeList<CharacterBuild>. DansTeamCode, remplacez la listeheroespar un champ publicteamde type Team, et affichezTeam code:suivi du JSON deteam. - Dans
LoadCode, lisez le code dansteamavec JsonUtility, et affichez le nombre de héros qu’il contient, sous la formeLoaded 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;
}
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
1Des composants, pas des hiérarchies
Des composants simplesUn script de base pour les ennemisDes composants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaire4Données sérialisées
Classes sérialisablesListes dans l’inspecteurÉnumérations dans l’inspecteurRécapitulatif : table de butin7Machines à états
Les états sous forme de classesUne machine à étatsTransitionsLes cerveaux des ennemisRécapitulatif : états d’une porte10Projet : Survivant de l’arène
Le hérosTypes d’ennemis2Interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interaction5ScriptableObjects
Assets de donnéesStatistiques des armesParamètres partagésLes vagues sous forme de donnéesRécapitulatif : base de données d’objets