Menu
CoddyTech

Sauvegarder le jeu

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 25 sur 50.

Une sauvegarde est un objet écrit au format JSON. Place tout ce dont la sauvegarde a besoin dans une classe [System.Serializable], remplis-la à partir du jeu et écris son contenu avec JsonUtility.ToJson quelque part où il persistera après la fermeture du jeu. Ce donjon conserve l’étage, l’or et les clés trouvées :

[System.Serializable]
public class DungeonSave
{
    public int floor;
    public int gold;
    public List<string> keys;
}
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class Dungeon : MonoBehaviour
{
    public int floor = 1;
    public int gold;
    public List<string> keys = new List<string>();
    private string path;

    void Start()
    {
        path = Path.Combine(Application.persistentDataPath, "dungeon.json");
        if (File.Exists(path))
        {
            DungeonSave save = JsonUtility.FromJson<DungeonSave>(File.ReadAllText(path));
            floor = save.floor;
            gold = save.gold;
            keys = save.keys;
        }
    }

    public void Save()
    {
        DungeonSave save = new DungeonSave();
        save.floor = floor;
        save.gold = gold;
        save.keys = keys;
        File.WriteAllText(path, JsonUtility.ToJson(save));
    }
}

Application.persistentDataPath est un dossier que Unity fournit au jeu sur chaque plateforme, conservé d’une partie à l’autre et lors des mises à jour. Path.Combine le combine avec un nom de fichier en utilisant le séparateur de la plateforme. File.WriteAllText(path, text) écrit le fichier en remplaçant l’ancien, File.Exists indique s’il existe, et File.ReadAllText le lit (ces trois méthodes proviennent de System.IO). Le dossier du jeu peut être en lecture seule : les sauvegardes vont donc dans persistentDataPath, et nulle part ailleurs. Construis le chemin dans Awake ou Start : Unity refuse persistentDataPath dans un initialiseur de champ.

La classe de sauvegarde ne contient que les données nécessaires, et le jeu y copie les valeurs pour les sauvegarder, puis les récupère pour les charger. Une petite sauvegarde peut être stockée dans PlayerPrefs plutôt que dans un fichier : PlayerPrefs.SetString("dungeon", json) et PlayerPrefs.GetString("dungeon") conservent le même JSON. Sauvegarde lorsqu’un événement mérite d’être conservé, à un point de contrôle ou à l’aide d’un bouton de sauvegarde : OnApplicationQuit s’exécute lors d’une fermeture normale, mais un téléphone peut fermer un jeu en arrière-plan sans l’appeler.

challenge icon

Défi

Moyen

L’explorateur parcourt l’île avec les flèches, et la barre d’espace plante un drapeau là où se trouve l’explorateur. Faites de l’île une partie sauvegardée dans le fichier island.json :

  • Dans IslandSave.cs, écrivez une classe [System.Serializable] IslandSave avec les champs publics playerPosition (un Vector3) et flags (une List<Vector3>).
  • Save(), appelé par le bouton Save, écrit la position de l’explorateur et les drapeaux au format JSON dans island.json dans Application.persistentDataPath.
  • Dans Start(), si island.json existe, replacez l’explorateur à la position sauvegardée et replantez chaque drapeau sauvegardé avec PlantFlag, afin que les drapeaux soient dans la liste pour la prochaine sauvegarde.

Appuyez sur Play, plantez quelques drapeaux et cliquez sur Save, puis sur Stop et à nouveau sur Play. Ensuite, cliquez sur Check.

Essayez vous-même

using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;

public class Explorer : MonoBehaviour
{
    public GameObject flagPrefab;
    public float speed = 4f;
    private List<Vector3> flags = new List<Vector3>();
    private InputAction moveAction;

    void Start()
    {
        moveAction = InputSystem.actions.FindAction("Move");
        // Chargez island.json ici
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.Translate(new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime);
        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            PlantFlag(transform.position);
        }
    }

    void PlantFlag(Vector3 position)
    {
        flags.Add(position);
        Instantiate(flagPrefab, new Vector3(position.x, 0.5f, position.z), Quaternion.identity);
    }

    // Le bouton Save appelle cette méthode
    public void Save()
    {
        // Écrivez la position du joueur et les drapeaux dans island.json
    }
}
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