Ir para o conteúdo
ReadySpawn

Como fazer um sistema de save na Unity com JSON

Por Imersa Studios · Atualizado em

Coloque tudo o que quer guardar em uma única classe [Serializable], transforme em JSON com JsonUtility.ToJson e grave em Application.persistentDataPath. Para carregar, leia o arquivo e chame JsonUtility.FromJson. Esse é o núcleo; o resto é decidir o que salvar e quando.

1. Coloque o estado salvo em uma classe

Não salve GameObjects nem MonoBehaviours. Salve dados simples: números, strings, vetores e listas. Uma classe só facilita versionar depois.

using UnityEngine;

[System.Serializable]
public class SaveData
{
    public int version = 1;
    public int coins;
    public Vector3 checkpoint;
    public Color playerColor = Color.white;
}

2. Escreva e leia o arquivo

Application.persistentDataPath aponta para uma pasta que sobrevive a atualizações em todas as plataformas. Escreva primeiro num arquivo temporário e depois troque, para que uma falha no meio da escrita nunca corrompa o save do jogador.

using System.IO;
using UnityEngine;

public static class SaveSystem
{
    static string FilePath => Path.Combine(Application.persistentDataPath, "save.json");

    public static void Save(SaveData data)
    {
        string tmp = FilePath + ".tmp";
        File.WriteAllText(tmp, JsonUtility.ToJson(data, true));
        if (File.Exists(FilePath)) File.Replace(tmp, FilePath, null);
        else File.Move(tmp, FilePath);
    }

    public static SaveData Load()
    {
        if (!File.Exists(FilePath)) return new SaveData();
        return JsonUtility.FromJson<SaveData>(File.ReadAllText(FilePath));
    }

    public static void Delete()
    {
        if (File.Exists(FilePath)) File.Delete(FilePath);
    }
}

3. Arquivo JSON ou PlayerPrefs?

Arquivo JSONPlayerPrefs
Melhor paraProgresso do jogo, inventários, mundosConfigurações: volume, qualidade, última aba do menu
TamanhoQualquer tamanhoValores pequenos
Inspecionar e fazer backupAbra o arquivo em qualquer editorEscondido no registro ou num plist
WebGLPrecisa de sincronização com IndexedDBFunciona de imediato

Um arranjo comum é usar os dois: JSON para o jogo, PlayerPrefs para as configurações. Para guardar JSON no PlayerPrefs, chame PlayerPrefs.SetString("save", json) e depois PlayerPrefs.Save().

4. Decida quando salvar

  • Em eventos: pegar uma moeda, chegar a um checkpoint, terminar uma missão. O jogador nunca perde mais que um instante.
  • Ao sair: OnApplicationQuit e OnApplicationPause(true) no celular, onde os apps são encerrados sem aviso.
  • Não a cada frame: gravar em disco é lento. Marque os dados como sujos e salve uma vez no fim do frame ou num timer.

Mantenha o campo version do passo 1. Quando você adicionar campos numa atualização, saves antigos continuam carregando: campos ausentes recebem valores padrão, e você pode migrar com base no número da versão.

Pule a configuração: um sistema de save pronto

O Sistema de Save e Load para Unity é esse padrão já pronto: um controlador, uma caixa de seleção JSON/PlayerPrefs, checkpoints, moedas, plataformas coloridas e uma fase de demo, com todo o código C#. Combina bem com o Sistema de Inventário e o Personalizador de Personagem, que salva visuais do mesmo jeito.

Perguntas frequentes

Quem escreveu

Imersa Studios cria os sistemas Unity, packs low poly e guias vendidos no itch.io. O código e as técnicas daqui vêm de lançar esses produtos. Saiba mais sobre o estúdio.