Carregar e valores padrão
Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 32 de 64.
O carregamento precisa lidar com saves 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 novo jogador 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. Assim, uma nova versão do jogo pode ler saves antigos, desde que cada novo campo tenha um inicializador com um valor razoável.
JsonUtility.FromJsonOverwrite(json, obj) preenche um objeto que já existe em vez de criar um, e deixa como estavam todos os campos que não estão no JSON. FromJson não pode criar um MonoBehaviour ou um ScriptableObject (o Unity lança Cannot deserialize JSON to new instances of type 'RaceSettings.'), então um asset de configurações é carregado sobrescrevendo-o: JsonUtility.FromJsonOverwrite(json, settings);. Sobrescrever também mantém os valores que um objeto já tem, como os que o Inspector atribuiu a ele, enquanto FromJson restauraria os inicializadores da classe.
Desafio
MédioCarregue pet.json com segurança para jogadores novos e saves antigos.
- Se houver um arquivo, preencha o pet no Inspector:
JsonUtility.FromJsonOverwrite(File.ReadAllText(path), pet);e, em seguida, registreWelcome back, Mochiusandopet.petName. - Se não houver um arquivo, registre
A new pet: Biscuitda mesma forma.
if (File.Exists(path)) e um else.Pressione “Jogar”, alimente o pet e, em seguida, pressione Parar e “Jogar”: ele diz boas-vindas de volta. Depois, pressione “Verificar”.
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;
}
}
Todas as lições de Arquitetura de Jogos no Unity
1Componentes, não hierarquias
Componentes pequenosUm script base de inimigoComponentes abstratosComponentes trabalhando juntosRevisão: torre modularRevisão: canhão duplo4Dados Serializados
Classes SerializáveisListas no InspectorEnums no InspectorRevisão: Tabela de LootRevisão: Sorteie o Loot2Interfaces no Unity
IDamageableInterfaces e TryGetComponentGetComponentsRevisão: tecla de interaçãoRevisão: mais próximo ao alcance5ScriptableObjects
Ativos de DadosAtributos da ArmaConfigurações CompartilhadasSalve o VentoOndas como DadosRevisão: Banco de ItensRevisão: Comprar na LojaPratique por conta própria: Playground de Unity