Carregar e valores padrão
Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 26 de 50.
O carregamento precisa lidar com salvamentos que não existem ou estão incompletos. Um jogo de corrida salva um RaceSave; a versão 2 do jogo adicionou 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();
}Um jogador novo não tem arquivo, e File.ReadAllText em um arquivo inexistente lança FileNotFoundException, então verifique File.Exists primeiro e comece com new RaceSave(): 0 troféus, o Rookie Kart e volume 0.8, os inicializadores dos campos. O arquivo da versão 1 de um jogador antigo contém {"trophies":3,"car":"Red Racer"}. FromJson cria um novo RaceSave, que executa os inicializadores dos campos, e depois define apenas as chaves que existem no JSON, então musicVolume é 0.8. Uma chave para a qual a classe não tem um campo é ignorada. Portanto, uma nova versão do jogo pode ler salvamentos antigos, desde que todo campo novo tenha um inicializador com um valor sensato.
JsonUtility.FromJsonOverwrite(json, obj) preenche um objeto que já existe em vez de criar um, e deixa como estavam todos os campos ausentes no JSON. FromJson não consegue criar um MonoBehaviour ou um ScriptableObject (o Unity lança Cannot deserialize JSON to new instances of type 'RaceSettings.'), então um recurso de configurações é carregado sobrescrevendo-o: JsonUtility.FromJsonOverwrite(json, settings);. A sobrescrita também mantém os valores que um objeto já possui, como aqueles definidos pelo Inspector, enquanto FromJson restauraria os inicializadores da classe.
Desafio
MédioO animal de estimação virtual carrega pet.json quando o jogo começa, e a tecla Espaço alimenta o animal e o salva. O carregamento dá errado de duas formas:
- Um novo jogador não tem
pet.json, e Start para com uma FileNotFoundException. Sem um arquivo, mantenha o animal que o Inspector configurou (Biscuit, fome 30, felicidade 80, uma Ball) e registreA new pet: Biscuit. - A versão 1 do jogo salvava apenas
petNameehunger;happinessetoysforam adicionados na versão 2 (veja PetSave.cs). Um salvamento antigo carregado com FromJson recebe o valor 50 da classe e nenhum brinquedo, em vez dos valores do Inspector. Carregue um arquivo existente empetcomJsonUtility.FromJsonOverwrite, para que o valor do Inspector seja mantido para tudo o que estiver faltando no arquivo, e registre a mensagem de boas-vindas com o nome carregado, como emWelcome back, Mochi.
Pressione Play e alimente o animal, depois Stop e Play novamente, e então Check.
Experimente você mesmo
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;
}
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Arquitetura de jogos no Unity
1Componentes, não hierarquias
Componentes pequenosUm script-base para inimigosComponentes abstratosComponentes trabalhando juntosRevisão: Torre modular4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de Loot7Máquinas de Estados
Estados como ClassesUma Máquina de EstadosTransiçõesInteligências dos InimigosRevisão: Estados da Porta10Projeto: Sobrevivente da Arena
O HeróiTipos de Inimigos5ScriptableObjects
Assets de dadosAtributos das armasConfigurações compartilhadasOndas como dadosRevisão: banco de dados de itens