Menu
CoddyTech

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.

challenge icon

Défi

Moyen

L’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 consignez A new pet: Biscuit.
  • La version 1 du jeu n’enregistrait que petName et hunger ; happiness et toys ont é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 dans pet avec JsonUtility.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 dans Welcome 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;
    }
}
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