Menu
CoddyTech

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.

challenge icon

Desafio

Médio

O 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] IslandSave com os campos públicos playerPosition (um Vector3) e flags (um List<Vector3>).
  • Save(), que o botão Save chama, grava a posição do explorador e as bandeiras como JSON em island.json em Application.persistentDataPath.
  • Em Start(), se island.json existir, coloque o explorador de volta na posição salva e plante novamente cada bandeira salva, usando PlantFlag para 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
    }
}
quiz iconTeste seus conhecimentos

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