Salve o jogo
Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 31 de 64.
Um jogo salvo é um objeto gravado como JSON. Coloque tudo de que o salvamento precisa em uma classe [System.Serializable], preencha-a com dados do jogo e grave o resultado de JsonUtility.ToJson em algum lugar que permaneça após o jogo ser encerrado. Esta masmorra mantém o andar, o ouro e as chaves encontrados:
[System.Serializable]
public class DungeonSave
{
public int floor;
public int gold;
public List<string> keys;
}using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class Dungeon : MonoBehaviour
{
public int floor = 1;
public int gold;
public List<string> keys = new List<string>();
private string path;
void Start()
{
path = Path.Combine(Application.persistentDataPath, "dungeon.json");
if (File.Exists(path))
{
DungeonSave save = JsonUtility.FromJson<DungeonSave>(File.ReadAllText(path));
floor = save.floor;
gold = save.gold;
keys = save.keys;
}
}
public void Save()
{
DungeonSave save = new DungeonSave();
save.floor = floor;
save.gold = gold;
save.keys = keys;
File.WriteAllText(path, JsonUtility.ToJson(save));
}
}Application.persistentDataPath é uma pasta que a Unity disponibiliza para o jogo em todas as plataformas, que é mantida entre partidas e durante atualizações. Path.Combine combina esse caminho com um nome de arquivo, usando o separador da plataforma. File.WriteAllText(path, text) grava o arquivo, substituindo um arquivo antigo; File.Exists informa se ele existe; e File.ReadAllText lê o conteúdo de volta (os três são de System.IO). A pasta do próprio jogo pode ser somente leitura, então os salvamentos devem ficar em persistentDataPath e em nenhum outro lugar. Crie o caminho em Awake ou Start: a Unity não permite usar persistentDataPath em um inicializador de campo.
A classe de salvamento contém apenas o que é necessário salvar, e o jogo copia valores para ela ao salvar e a partir dela ao carregar. Um salvamento pequeno pode ser armazenado em PlayerPrefs em vez de em um arquivo: PlayerPrefs.SetString("dungeon", json) e PlayerPrefs.GetString("dungeon") armazenam o mesmo JSON. Salve quando acontecer algo que valha a pena manter, em um ponto de controle ou usando um botão de salvamento: OnApplicationQuit é executado ao sair normalmente, mas um celular pode fechar um jogo em segundo plano sem executá-lo.
Desafio
MédioSalve a ilha em island.json.
- Em
IslandSave.cs, escreva uma classe[System.Serializable]IslandSavecompublic Vector3 playerPosition;epublic List<Vector3> flags;. - Em
Start(), definapathcomoPath.Combine(Application.persistentDataPath, "island.json"). Save()grava um IslandSave comtransform.positioneflagsempathcomo JSON.Start()lê de volta um arquivo existente: a posição e chamaPlantFlagpara cada bandeira.
Pressione “Jogar”, plante bandeiras, Salvar, pare e pressione “Jogar”: elas estarão de volta. Depois, pressione “Verificar”.
Experimente você mesmo
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.InputSystem;
public class Explorer : MonoBehaviour
{
public GameObject flagPrefab;
public float speed = 4f;
private List<Vector3> flags = new List<Vector3>();
private InputAction moveAction;
void Start()
{
moveAction = InputSystem.actions.FindAction("Move");
// Carregue island.json aqui
}
void Update()
{
Vector2 input = moveAction.ReadValue<Vector2>();
transform.Translate(new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime);
if (Keyboard.current.spaceKey.wasPressedThisFrame)
{
PlantFlag(transform.position);
}
}
void PlantFlag(Vector3 position)
{
flags.Add(position);
Instantiate(flagPrefab, new Vector3(position.x, 0.5f, position.z), Quaternion.identity);
}
// O botão Save chama este método
public void Save()
{
// Grave a posição do jogador e as bandeiras em island.json
}
}
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