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.
Sfida
MedioL'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]IslandSavecon i campi pubbliciplayerPosition(un Vector3) eflags(unList<Vector3>). Save(), che viene chiamato dal pulsante Save, scrive la posizione dell'esploratore e le bandiere in formato JSON inisland.jsoninApplication.persistentDataPath.- In
Start(), seisland.jsonesiste, rimetti l'esploratore nella posizione salvata e pianta di nuovo ogni bandiera salvata, usandoPlantFlagaffinché 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
}
}
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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti