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 JSON | PlayerPrefs | |
|---|---|---|
| Melhor para | Progresso do jogo, inventários, mundos | Configurações: volume, qualidade, última aba do menu |
| Tamanho | Qualquer tamanho | Valores pequenos |
| Inspecionar e fazer backup | Abra o arquivo em qualquer editor | Escondido no registro ou num plist |
| WebGL | Precisa de sincronização com IndexedDB | Funciona 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:
OnApplicationQuiteOnApplicationPause(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
Em Application.persistentDataPath. No Windows fica em AppData/LocalLow/<empresa>/<produto>; cada plataforma tem o seu local.
JsonUtility é nativo e rápido, mas limitado (sem dicionários nem propriedades). O Newtonsoft Json.NET lida com tipos complexos; a Unity o distribui como o pacote com.unity.nuget.newtonsoft-json.
Não dá para impedir totalmente na máquina deles. Em jogos single-player isso costuma ser aceitável; se importar, adicione um checksum ou criptografe o arquivo.
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.

