Charger et valeurs par défaut
Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 26 sur 50.
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 manquant déclenche FileNotFoundException ; vérifie donc d'abord File.Exists et pars de new RaceSave() : 0 trophée, la Rookie Kart et un volume de 0.8, les 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 initialisations des champs, puis ne définit que les clés présentes dans le JSON ; ainsi, musicVolume vaut 0.8. Toute 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 inchampé 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.') ; un asset de paramètres est donc chargé en le remplaçant : JsonUtility.FromJsonOverwrite(json, settings);. Le remplacement conserve également les valeurs déjà présentes dans un objet, comme celles qui lui ont été attribuées par l'Inspector, tandis que FromJson rétablirait les valeurs initiales de la classe.
Défi
MoyenL’animal virtuel charge pet.json au démarrage du jeu, et la barre d’espace le nourrit et enregistre ses données. Le chargement échoue de deux façons :
- Un nouveau joueur n’a pas de fichier
pet.json, et Start s’arrête avec une FileNotFoundException. En l’absence de fichier, gardez les valeurs de l’animal définies dans l’Inspector (Biscuit, faim 30, bonheur 80, une Ball) et consignezA new pet: Biscuit. - La version 1 du jeu n’enregistrait que
petNameethunger;happinessettoysont été ajoutés dans la version 2 (voir PetSave.cs). Un ancien fichier de sauvegarde chargé avec FromJson récupère les valeurs 50 de la classe et aucun jouet, et non les valeurs de l’Inspector. Chargez un fichier existant danspetavecJsonUtility.FromJsonOverwrite, afin que les valeurs de l’Inspector soient conservées pour tout élément absent du fichier, et consignez le message de bienvenue avec le nom chargé, comme dansWelcome back, Mochi.
Cliquez sur Play et nourrissez l’animal, puis cliquez sur Stop et sur Play à nouveau, puis sur Check.
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;
}
}
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’objets3Événements
Événements C# dans UnityS’abonner dans OnEnableChamps UnityEventLes événements pilotent l’interface utilisateurRécapitulatif : fenêtre contextuelle de succès6Sauvegarder avec JSON
JsonUtilitySauvegarder le jeuCharger et valeurs par défautRécapitulatif : emplacements de sauvegarde