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 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.

challenge icon

Défi

Moyen

Charge pet.json de manière sécurisée pour les nouveaux joueurs et les anciennes sauvegardes.

  1. Dans Start(), remplace la ligne FromJson par if (File.Exists(path)) et un else.
  2. Si le fichier existe, remplis le champ pet dans l’Inspector : JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);, puis affiche dans le journal Welcome back, Mochi à partir de pet.petName.
  3. Sinon, affiche dans le journal A new pet: Biscuit de 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

Entraînez-vous par vous-même : Playground Unity