Caricamento e valori predefiniti
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 26 di 50.
Il caricamento deve gestire i salvataggi mancanti o incompleti. Un gioco di corse salva un RaceSave; la versione 2 del gioco ha aggiunto musicVolume:
[System.Serializable]
public class RaceSave
{
public int trophies;
public string car = "Rookie Kart";
public float musicVolume = 0.8f;
}RaceSave save;
if (File.Exists(path))
{
save = JsonUtility.FromJson<RaceSave>(File.ReadAllText(path));
}
else
{
save = new RaceSave();
}Un nuovo giocatore non ha alcun file e File.ReadAllText su un file mancante genera FileNotFoundException, quindi controlla prima File.Exists e parti da new RaceSave(): 0 trofei, il Rookie Kart e volume 0.8, i valori iniziali dei campi. Il file della versione 1 di un vecchio giocatore contiene {"trophies":3,"car":"Red Racer"}. FromJson crea un nuovo RaceSave, esegue i valori iniziali dei campi e poi imposta solo le chiavi presenti nel JSON, quindi musicVolume è 0.8. Una chiave per cui la classe non ha un campo viene ignorata. Una nuova versione del gioco può quindi leggere i vecchi salvataggi, purché ogni nuovo campo abbia un valore iniziale sensato.
JsonUtility.FromJsonOverwrite(json, obj) riempie un oggetto già esistente invece di crearne uno e lascia invariati tutti i campi assenti nel JSON. FromJson non può creare un MonoBehaviour o uno ScriptableObject (Unity genera Cannot deserialize JSON to new instances of type 'RaceSettings.'), quindi una risorsa delle impostazioni viene caricata sovrascrivendola: JsonUtility.FromJsonOverwrite(json, settings);. La sovrascrittura mantiene anche i valori già presenti in un oggetto, come quelli assegnati dall’Inspector, mentre FromJson ripristinerebbe i valori iniziali della classe.
Sfida
MedioL’animale virtuale carica pet.json all’avvio del gioco e la barra spaziatrice lo nutre e lo salva. Il caricamento non funziona in due modi:
- Un nuovo giocatore non ha
pet.jsone Start si interrompe con una FileNotFoundException. Se non c’è un file, mantieni l’animale configurato nell’Inspector (Biscuit, fame 30, felicità 80, una Ball) e registraA new pet: Biscuit. - La versione 1 del gioco salvava solo
petNameehunger;happinessetoyssono stati aggiunti nella versione 2 (vedi PetSave.cs). Un vecchio salvataggio caricato con FromJson riceve il valore 50 della classe e nessun giocattolo, non i valori dell’Inspector. Carica un file esistente inpetconJsonUtility.FromJsonOverwrite, così qualsiasi dato mancante nel file mantiene il valore dell’Inspector, e registra il messaggio di bentornato con il nome caricato, comeWelcome back, Mochi.
Premi Play e dai da mangiare all’animale, poi Stop e di nuovo Play, quindi Check.
Provalo tu
using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;
public class PetCare : MonoBehaviour
{
public PetSave pet;
public TMP_Text petText;
private string path;
void Start()
{
path = Path.Combine(Application.persistentDataPath, "pet.json");
pet = JsonUtility.FromJson<PetSave>(File.ReadAllText(path));
Show();
}
void Update()
{
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
pet.hunger = Mathf.Max(pet.hunger - 10, 0);
pet.happiness = Mathf.Min(pet.happiness + 5, 100);
File.WriteAllText(path, JsonUtility.ToJson(pet));
Show();
}
}
void Show()
{
petText.text = pet.petName + ": hunger " + pet.hunger + ", happiness " + pet.happiness;
}
}
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 oggetti3Eventi
Eventi C# in UnityIscriviti in OnEnableCampi UnityEventGli eventi guidano l'interfaccia utenteRiepilogo: popup dell'obiettivo6Salvare con JSON
JsonUtilitySalva la partitaCaricamento e valori predefinitiRiepilogo: slot di salvataggio