Menu
CoddyTech

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.

challenge icon

Desafio

Médio

Salve a ilha em island.json.

  1. Em IslandSave.cs, escreva uma classe [System.Serializable] IslandSave com public Vector3 playerPosition; e public List<Vector3> flags;.
  2. Em Start(), defina path como Path.Combine(Application.persistentDataPath, "island.json").
  3. Save() grava um IslandSave com transform.position e flags em path como JSON.
  4. Start() lê de volta um arquivo existente: a posição e chama PlantFlag para 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

Pratique por conta própria: Playground de Unity