Salve o jogo
Parte da seção Arquitetura de jogos no Unity do Journey de Unity da Coddy. Lição 25 de 50.
Um jogo salvo é um objeto gravado como JSON. Coloque tudo o que o salvamento precisa em uma classe [System.Serializable], preencha-a com os dados do jogo e grave o resultado de JsonUtility.ToJson em algum lugar que persista depois que o jogo terminar. Esta masmorra mantém o andar, o ouro e as chaves encontradas:
[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 fornece ao jogo em todas as plataformas, mantida entre as sessões de jogo e durante as 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 antigo; File.Exists informa se há um arquivo, e File.ReadAllText o lê de volta (os três vêm de System.IO). A pasta do próprio jogo pode ser somente para leitura, então os salvamentos vão para persistentDataPath e para 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 o salvamento precisa, e o jogo copia valores para ela ao salvar e para fora 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 por meio de um botão Salvar: OnApplicationQuit é executado ao sair normalmente, mas um celular pode fechar um jogo em segundo plano sem executá-lo.
Desafio
MédioO explorador caminha pela ilha usando as setas, e a barra de espaço planta uma bandeira onde o explorador está. Transforme a ilha em um jogo salvo no arquivo island.json:
- Em
IslandSave.cs, escreva uma classe[System.Serializable]IslandSavecom os campos públicosplayerPosition(um Vector3) eflags(umList<Vector3>). Save(), que o botão Save chama, grava a posição do explorador e as bandeiras como JSON emisland.jsonemApplication.persistentDataPath.- Em
Start(), seisland.jsonexistir, coloque o explorador de volta na posição salva e plante novamente cada bandeira salva, usandoPlantFlagpara que as bandeiras estejam na lista para o próximo salvamento.
Pressione Play, plante algumas bandeiras e clique em Save; depois, Stop e Play novamente. Em seguida, Check.
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
}
}
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