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.
Sfida
MedioSalva l’isola in island.json.
- In
IslandSave.cs, scrivi una classe[System.Serializable]IslandSaveconpublic Vector3 playerPosition;epublic List<Vector3> flags;. - In
Start(), impostapathsuPath.Combine(Application.persistentDataPath, "island.json"). Save()scrive in formato JSON inpathun IslandSave contenentetransform.positioneflags.Start()rilegge un file esistente: la posizione ePlantFlagper 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
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozioEsercitati da solo: Playground Unity