Charger et valeurs par défaut
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 32 sur 64.
Le chargement doit gérer les sauvegardes absentes ou incomplètes. Un jeu de course enregistre une RaceSave ; la version 2 du jeu a ajouté musicVolume :
[System.Serializable]
public class RaceSave
{
public int trophies;
public string car = "Rookie Kart";
public float musicVolume = 0.8f;
}RaceSave save;
if (File.Exists(path))
{
save = JsonUtility.FromJson<RaceSave>(File.ReadAllText(path));
}
else
{
save = new RaceSave();
}Un nouveau joueur n'a pas de fichier, et File.ReadAllText sur un fichier absent déclenche FileNotFoundException. Vérifie donc d'abord File.Exists et pars de new RaceSave() : 0 trophée, le Rookie Kart et un volume de 0.8, conformément aux valeurs initiales des champs. Le fichier de la version 1 d'un ancien joueur contient {"trophies":3,"car":"Red Racer"}. FromJson crée une nouvelle RaceSave, ce qui exécute les valeurs initiales des champs, puis définit uniquement les clés présentes dans le JSON. Ainsi, musicVolume vaut 0.8. Une clé pour laquelle la classe n'a pas de champ est ignorée. Une nouvelle version du jeu peut donc lire les anciennes sauvegardes, à condition que chaque nouveau champ ait une valeur initiale pertinente.
JsonUtility.FromJsonOverwrite(json, obj) remplit un objet qui existe déjà au lieu d'en créer un, et laisse inchangé chaque champ absent du JSON. FromJson ne peut pas créer un MonoBehaviour ni un ScriptableObject (Unity déclenche Cannot deserialize JSON to new instances of type 'RaceSettings.'), donc un asset de paramètres est chargé en le remplaçant : JsonUtility.FromJsonOverwrite(json, settings);. Le remplacement conserve également les valeurs déjà présentes dans un objet, comme celles que lui a attribuées l'Inspector, alors que FromJson rétablit les valeurs initiales de la classe.
Défi
MoyenCharge pet.json de manière sécurisée pour les nouveaux joueurs et les anciennes sauvegardes.
- Dans
Start(), remplace la ligne FromJson parif (File.Exists(path))et unelse. - Si le fichier existe, remplis le champ pet dans l’Inspector :
JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);, puis affiche dans le journalWelcome back, Mochià partir depet.petName. - Sinon, affiche dans le journal
A new pet: Biscuitde la même manière.
Appuie sur « Jouer », nourris l’animal, puis arrête et appuie sur « Jouer » : le message de bienvenue s’affiche. Ensuite, appuie sur « Vérifier ».
Essayez vous-même
using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;
public class PetCare : MonoBehaviour
{
public PetSave pet;
public TMP_Text petText;
private string path;
void Start()
{
path = Path.Combine(Application.persistentDataPath, "pet.json");
pet = JsonUtility.FromJson<PetSave>(File.ReadAllText(path));
Show();
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
pet.hunger = Mathf.Max(pet.hunger - 10, 0);
pet.happiness = Mathf.Min(pet.happiness + 5, 100);
File.WriteAllText(path, JsonUtility.ToJson(pet));
Show();
}
}
void Show()
{
petText.text = pet.petName + ": hunger " + pet.hunger + ", happiness " + pet.happiness;
}
}
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