Salvando o progresso do jogador em um jogo do Unity

22

Estou fazendo um jogo usando o mecanismo de jogo Unity. Quero salvar o progresso do jogador, incluindo nível, pontos de experiência, personagem escolhido etc. Atualmente, estou usando os playerprefs, mas quero saber se isso funcionará para jogadores que também rodarão o jogo em seus dispositivos móveis (Android / iOS) como desktops (OSX / PCs)? Caso contrário, como devo salvar essas informações? Quero salvar automaticamente o progresso do jogador após limpar cada estágio.

Shantanu Singh
fonte

Respostas:

30

PlayerPrefs funcionará multi-plataforma, mas é não recomendado para o progresso de jogo salvar arquivos porque é insegura. Como um arquivo de texto sem formatação, um jogador pode abri-lo facilmente e alterar o conteúdo para trapacear ou fazer com que seu jogo se comporte de forma imprevisível. Também não é garantido que você fique por perto.

O PlayerPrefs destina-se a informações de preferências não essenciais, como mapeamento de controle ou configurações de música / sfx - coisas que o player pode mudar livremente de qualquer maneira e não perderia muito se fosse (no Windows, por exemplo) usar um ponto de restauração do sistema e perder algumas de suas informações de registro. Se isso perdesse as pontuações mais altas ou o progresso da campanha, os jogadores ficariam chateados!

Em vez disso, é recomendável salvar o progresso da jogabilidade em seu próprio arquivo (geralmente binário, possivelmente criptografado ou assinado se você quiser dificultar a modificação, mas veja o comentário de Philipp abaixo).

Você pode usar o Application.persistentDataPath para obter um local confiável para salvar em cada plataforma. Isso geralmente ocorre em uma pasta de dados do usuário que não será apagada em casos como o exemplo acima.

Depois de ter um caminho para salvar, você pode usar os métodos regulares de C # IO para criar, gravar e ler seu arquivo. Os detalhes variam muito, dependendo do formato e da estrutura do arquivo salvo. Portanto, se você tiver problemas, é melhor fazer uma nova pergunta detalhando o que você está tentando fazer e onde está preso.

DMGregory
fonte
30
Na minha opinião, criptografar e assinar seus arquivos de savegame é apenas snakeoil. Não é seguro porque você precisa armazenar chaves e algoritmos no executável do jogo, onde um hacker habilitado pode acessá-los. Também não faz sentido. Quando é um jogo singleplayer: Por que se preocupar? Deixe o jogador aproveitar o jogo da maneira que quiser. Quando se trata de um jogo multiplayer, você deve salvar tudo no servidor, onde está protegido contra manipulação.
Philipp
5
@ SamedTarıkÇETİN Há uma distinção importante entre o caminho dos dados (o local onde o jogo está instalado) e o caminho persistente dos dados (um local confiável para salvar novos dados). Em algumas plataformas, um jogo criado não pode gravar no caminho de dados instalado; portanto, é recomendável salvar no local do caminho de dados persistente como regra geral.
DMGregory
2
Embora eu concorde com o @Philipp que o armazenamento do lado do cliente nunca é realmente seguro e que, em muitos casos, não precisamos nos preocupar muito com a proteção de jogos para um jogador, a quantidade de segurança ou ofuscamento a aplicar é, em última análise, uma escolha cada criador precisa fazer por si. Com esta resposta, só quero dar ao solicitante as informações para fazer uma escolha informada sobre o que é adequado para o jogo deles.
DMGregory
1
Por um lado, concordo com o @Philipp, mas também vi / trabalhei com um arquivo de salvamento serializado que era completamente ilegível para trabalhar em um editor de texto. Sim, eu provavelmente poderia ter descoberto como entrar e fazer uma alteração ou outra, mas como o arquivo parecia 2 megas de hexidecimal bruto, teria sido uma tarefa difícil de descobrir. Nesses casos, apenas as pessoas mais obstinadas tentariam desmontá-lo e os resultados seriam específicos para esse ponto do jogo (adicionar mais uma unidade ao salvamento empurra todos os dados subseqüentes). Então, novamente, não foi destinado para ser seguro.
Draco18s
2
@ ShantanuSingh por não armazená-los no PlayerPrefs. Esse tipo de informação deve ser armazenado em um banco de dados remoto e solicitado na inicialização do aplicativo. Para compatibilidade quando uma conexão com a Internet não estiver disponível, volte para um arquivo salvo seguro local (ou seja: criptografado). Os valores do banco de dados, quando disponíveis, devem substituir os valores locais. Pode haver plug-ins de compra no aplicativo que lidam com coisas de outras maneiras também, mas provavelmente será "necessário para a Internet", hackável (mesmo um arquivo criptografado não é 100% seguro) ou como este comentário detalha.
Draco18s
-1

O PlayerPrefs é uma loja K / V projetada para "simplesmente funcionar", independentemente da plataforma criada. Eu digo apenas continue usando, a menos que você tenha uma razão convincente para não fazê-lo.

gronelândia
fonte
Eu acho que a pergunta era praticamente se existem razões convincentes para não usar PlayerPrefs (sim, existem). Como tal, diminuí a votação desta resposta porque ela não responde à pergunta.
Peter-Barbear Robert Harvey
-1

Então, a melhor maneira de economizar no servidor? Converta todas as informações necessárias para salvar em json string e armazene-as no próprio servidor mysql como dados da string e quando precisar carregar, conectar-se ao servidor e restaurá-lo?

O Criador
fonte
4
Esta não é uma resposta para a pergunta. Se você tiver uma pergunta, faça como uma nova pergunta .
Sourav Paul