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;
}Défi
MoyenPartage l’équipe sous forme de code JSON.
- Dans
CharacterBuild, fais deStrengthun champ,public int strength;, et marqueagilityavec[SerializeField]. - En dessous, écris une classe
Team[System.Serializable]avecpublic List<CharacterBuild> heroes;. DansTeamCode, déclare la liste avecpublic Team team;et affiche son JSON dans les journaux. LoadCodelitcodedansteamet afficheLoaded 3 heroesdans 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
1Des composants, pas des hiérarchies
De petits composantsUn script de base pour les ennemisComposants abstraitsDes composants qui fonctionnent ensembleRécapitulatif : tourelle modulaireRécapitulatif : canon double4Données sérialisées
Classes sérialisablesListes dans l’InspecteurÉnumérations dans l’InspecteurRécapitulatif : table de butinRécapitulatif : tirer le butin2Les interfaces dans Unity
IDamageableInterfaces et TryGetComponentGetComponentsRécapitulatif : touche d’interactionLe plus proche à portée5ScriptableObjects
Ressources de donnéesStatistiques des armesParamètres partagésSauver le ventLes vagues comme donnéesRécapitulatif : base de données des objetsRécapitulatif : acheter dans la boutique3Événements
Les événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interfaceRécapitulatif : fenêtre de succèsRécapitulatif : minuteur de la fenêtre6Sauvegarder avec JSON
JsonUtilitySauvegarder la partieCharger et valeurs par défautRécapitulatif : emplacements de sauvegardeChoisir et supprimer un emplacementEntraînez-vous par vous-même : Playground Unity