Menu
CoddyTech

Salva la partita

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 31 di 64.

Un salvataggio è un unico oggetto scritto in JSON. Inserisci tutto ciò di cui ha bisogno il salvataggio in una classe [System.Serializable], compilala con i dati del gioco e scrivi il risultato di JsonUtility.ToJson in un luogo che sopravviva alla chiusura del gioco. Questo dungeon salva 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 assegna al gioco su ogni piattaforma, mantenuta tra una sessione di gioco e l'altra e durante gli aggiornamenti. Path.Combine la combina con il nome di un file usando il separatore della piattaforma. File.WriteAllText(path, text) scrive il file, sostituendone uno precedente; File.Exists indica se il file esiste e File.ReadAllText lo rilegge (tutti e tre provengono da System.IO). La cartella del gioco potrebbe essere di sola lettura, quindi i salvataggi vanno in persistentDataPath e in nessun altro luogo. Crea il percorso in Awake o Start: Unity non consente di usare persistentDataPath in un inizializzatore di campo.

La classe di salvataggio contiene solo ciò di cui ha bisogno il salvataggio, e il gioco vi copia i valori per salvare e li recupera da essa per caricarli. Un salvataggio piccolo può essere memorizzato in PlayerPrefs invece che in un file: PlayerPrefs.SetString("dungeon", json) e PlayerPrefs.GetString("dungeon") contengono 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 un gioco in background senza eseguirlo.

challenge icon

Sfida

Medio

Salva l’isola in island.json.

  1. In IslandSave.cs, scrivi una classe [System.Serializable] IslandSave con public Vector3 playerPosition; e public List<Vector3> flags;.
  2. In Start(), imposta path su Path.Combine(Application.persistentDataPath, "island.json").
  3. Save() scrive in formato JSON in path un IslandSave contenente transform.position e flags.
  4. Start() rilegge un file esistente: la posizione e PlantFlag per ogni bandiera.

Premi «Gioca», pianta le bandiere, premi Save, interrompi e premi «Gioca»: saranno di nuovo lì. Poi premi «Verifica».

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

Tutte le lezioni di Architettura dei giochi in Unity

Esercitati da solo: Playground Unity