Menu
CoddyTech

Salva la partita

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 25 di 50.

Un salvataggio della partita è un oggetto scritto in formato JSON. Inserisci tutto ciò di cui ha bisogno il salvataggio in una classe [System.Serializable], riempila con i dati della partita e scrivi JsonUtility.ToJson dell'oggetto in una posizione che persista oltre la partita. Questo dungeon conserva il piano, l'oro e le chiavi trovate:

[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 è una cartella che Unity mette a disposizione del gioco su ogni piattaforma, conservata tra una partita e l'altra e anche durante gli aggiornamenti. Path.Combine unisce questo percorso a un nome di file usando il separatore della piattaforma. File.WriteAllText(path, text) scrive il file, sostituendo quello vecchio; File.Exists indica se il file esiste e File.ReadAllText lo legge (tutti e tre appartengono a System.IO). La cartella del gioco potrebbe essere di sola lettura, quindi i salvataggi vanno in persistentDataPath e in nessun altro posto. Crea il percorso in Awake o Start: Unity non consente di usare persistentDataPath in un inizializzatore di campo.

La classe del salvataggio contiene solo ciò che serve per salvare, e il gioco vi copia i valori per salvare e li recupera da essa per caricare. Un salvataggio piccolo può essere memorizzato in PlayerPrefs invece che in un file: PlayerPrefs.SetString("dungeon", json) e PlayerPrefs.GetString("dungeon") conservano lo stesso JSON. Salva quando succede qualcosa che vale la pena conservare, a un checkpoint o tramite un pulsante Salva: OnApplicationQuit viene eseguito quando si esce normalmente, ma un telefono può chiudere una partita in background senza eseguirlo.

challenge icon

Sfida

Medio

L'esploratore cammina sull'isola usando le frecce e con la barra spaziatrice pianta una bandiera nel punto in cui si trova. Trasforma l'isola in una partita salvata nel file island.json:

  • In IslandSave.cs, scrivi una classe [System.Serializable] IslandSave con i campi pubblici playerPosition (un Vector3) e flags (un List<Vector3>).
  • Save(), che viene chiamato dal pulsante Save, scrive la posizione dell'esploratore e le bandiere in formato JSON in island.json in Application.persistentDataPath.
  • In Start(), se island.json esiste, rimetti l'esploratore nella posizione salvata e pianta di nuovo ogni bandiera salvata, usando PlantFlag affinché le bandiere siano nell'elenco per il salvataggio successivo.

Premi Play, pianta alcune bandiere e fai clic su Save, poi Stop e di nuovo Play. Poi Check.

Provalo tu

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");
        // Carica island.json qui
    }

    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);
    }

    // Il pulsante Save chiama questo metodo
    public void Save()
    {
        // Scrivi la posizione del giocatore e le bandiere in island.json
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Architettura dei giochi in Unity