Menu
CoddyTech

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.

challenge icon

Sfida

Medio

L’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.json e 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 registra A new pet: Biscuit.
  • La versione 1 del gioco salvava solo petName e hunger; happiness e toys sono 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 in pet con JsonUtility.FromJsonOverwrite, così qualsiasi dato mancante nel file mantiene il valore dell’Inspector, e registra il messaggio di bentornato con il nome caricato, come Welcome 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;
    }
}
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