Menu
CoddyTech

Cargar y valores predeterminados

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 32 de 64.

La carga debe poder manejar partidas guardadas que no existen o 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 lanza FileNotFoundException si el archivo no existe, así que comprueba primero File.Exists y empieza con new RaceSave(): 0 trofeos, el Rookie Kart y un volumen de 0.8, los valores iniciales 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 inicializadores de los campos, y después establece solo las claves que contiene el JSON, así que musicVolume vale 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 inicializador con un valor razonable.

JsonUtility.FromJsonOverwrite(json, obj) rellena un objeto que ya existe en lugar de crear uno, y deja intactos todos los campos que no aparecen en el JSON. FromJson no puede crear un MonoBehaviour ni un ScriptableObject (Unity lanza 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 recuperaría los inicializadores de la clase.

challenge icon

Desafío

Intermedio

Carga pet.json de forma segura para los jugadores nuevos y las partidas guardadas antiguas.

  1. En Start(), sustituye la línea FromJson por if (File.Exists(path)) y un else.
  2. Si hay un archivo, rellena el pet del Inspector: JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);, y luego registra Welcome back, Mochi usando pet.petName.
  3. Si no lo hay, registra A new pet: Biscuit de la misma manera.

Pulsa «Jugar», alimenta a la mascota, luego pulsa Stop y «Jugar»: aparece el mensaje de bienvenida. Después, pulsa «Comprobar».

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;
    }
}

Todas las lecciones de Arquitectura de juegos en Unity

Practica por tu cuenta: Playground de Unity