Menu
CoddyTech

Cargar y valores predeterminados

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 26 de 50.

La carga debe manejar partidas guardadas que no existen o que están incompletas. Un juego de carreras guarda un RaceSave; la versión 2 del juego añadió 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 jugador nuevo no tiene archivo, y File.ReadAllText en un archivo inexistente genera una excepción FileNotFoundException, así que primero comprueba File.Exists y parte de new RaceSave(): 0 trofeos, el Rookie Kart y un volumen de 0.8, los valores de inicialización de los campos. El archivo de la versión 1 de un jugador antiguo contiene {"trophies":3,"car":"Red Racer"}. FromJson crea un nuevo RaceSave, que ejecuta los valores de inicialización de los campos, y después establece solo las claves que tiene el JSON, así que musicVolume es 0.8. Se ignora una clave para la que la clase no tiene ningún campo. Por lo tanto, una nueva versión del juego puede leer partidas guardadas antiguas, siempre que cada campo nuevo tenga un valor de inicialización sensato.

JsonUtility.FromJsonOverwrite(json, obj) rellena un objeto que ya existe en lugar de crear uno, y deja como estaban todos los campos que no aparecen en el JSON. FromJson no puede crear un MonoBehaviour ni un ScriptableObject (Unity genera la excepción Cannot deserialize JSON to new instances of type 'RaceSettings.'), así que un recurso de configuración se carga sobrescribiéndolo: JsonUtility.FromJsonOverwrite(json, settings);. Sobrescribir también conserva los valores que ya tiene un objeto, como los que le asignó el Inspector, mientras que FromJson restauraría los valores de inicialización de la clase.

challenge icon

Desafío

Intermedio

La mascota virtual carga pet.json cuando comienza el juego, y la barra espaciadora alimenta a la mascota y la guarda. La carga falla de dos maneras:

  • Un jugador nuevo no tiene pet.json, y Start se detiene con una FileNotFoundException. Si no hay archivo, conserva la mascota que configuró el Inspector (Biscuit, hambre 30, felicidad 80, una Ball) y registra A new pet: Biscuit.
  • La versión 1 del juego solo guardaba petName y hunger; happiness y toys se añadieron en la versión 2 (consulta PetSave.cs). Al cargar una partida guardada antigua con FromJson, se obtienen los valores 50 de la clase y ningún juguete, no los valores del Inspector. Carga un archivo existente en pet con JsonUtility.FromJsonOverwrite, para que cualquier dato que falte en el archivo conserve el valor del Inspector, y registra el saludo con el nombre cargado, como Welcome back, Mochi.

Pulsa Play y alimenta a la mascota, después Stop y Play de nuevo, y luego Check.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Arquitectura de juegos en Unity