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.
Défi
MoyenL’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]IslandSaveavec les champs publicsplayerPosition(un Vector3) etflags(uneList<Vector3>). Save(), appelé par le bouton Save, écrit la position de l’explorateur et les drapeaux au format JSON dansisland.jsondansApplication.persistentDataPath.- Dans
Start(), siisland.jsonexiste, replacez l’explorateur à la position sauvegardée et replantez chaque drapeau sauvegardé avecPlantFlag, 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
}
}
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’objets