Salvando e obtendo dados com a classe PlayerPrefs na Unity 3D

PlayerPrefs é uma classe que nos permite salvar e consultar informações dentro do projeto qualquer momento.

A Unity 3D possuí incríveis classes para manipulação de dados de forma prática, uma delas é a PlayerPrefs, que nos permite salvar alguns tipos de informações e recupera-las quando for necessário.

Você pode utilizar essa classe para salvar três tipos de dados, que são: string, int e float. Todos esses dados são persistidos num sistema de chave valor na qual veremos adiante.

Onde esses dados ficam salvos?

Antes de começar a entender e utilizar a classe PlayerPrefs, é importante enfatizar que ela não é uma fonte segura, ou seja, é recomendado que só se deve salvar itens de sessão da gameplay atual. Em outras palavras, não salve nenhum informação que o jogador possa precisar após reiniciar o jogo.

Mas por que dessa limitação? A verdade é que isso é uma convenção e não uma regra da própria classe. Como os dados ficam salvos nos registro do Windows, os dados podem ser corrompidos, o usuário restaura uma nova versão do sistema e perde o save, entre outras possibilidades de problemas.

No Windows, abra o “regedit” no menu de inicialização, em seguida, navegue até o endereço 
\HKEY_CURRENT_USER\SOFTWARE\Unity\UnityEditor\DefaultCompany. Você poderá visualizar todas as informações que foram salvas, conforme o print abaixo.

Publicamos recentemente o artigo Salvar arquivos Json na pasta Meus Documentos com a Unity 3D, nele você aprende a salvar dados de forma segura em pastas do sistema.

Onde posso utilizar a classe PlayerPrefs

Existe uma infinidade de aplicações e lugares na qual você pode utilizar. Lembre-se, não é uma recomendação salvar dados do progresso do usuário, mas isso não te impede de salvar e nunca ter problemas.

Utilizando a classe PlayerPrefs, você pode salvar o nome do jogador e outras informações que foram carregadas do arquivo de load game. Também pode salvar dados de um sorteio aleatório, entre muitos outros.

No geral, tente sempre salvar e carregar informações que serão utilizados enquanto o jogo está aberto.

Entendendo a classe PlayerPrefs

Até aqui já discorremos sobre algumas precauções, agora chegou a hora de entendermos como ela de fato funciona.

Para o nosso exemplo, vamos criar duas cenas, o nome delas não importa. A Ideia é que uma delas a gente salve as informações e na outra carregue elas. Criamos também dois arquivos, um chamado de LoadPlayerPrefs e o outro SavePlayerPrefs.

Em cada uma das cenas, associe um script em especifico, ou seja, na cena um o script de save e na cena dois o script de load, em qualquer GameObject.

Vamos iniciar salvando as informações de um personagem, para isso, abra o arquivo SavePlayerPrefs e insira o código abaixo.

using UnityEngine;

public class SavePlayerPrefs : MonoBehaviour
{

    void Start()
    {
        //Salvamos uma string
        PlayerPrefs.SetString("char_name", "Gunner");

        //Salvamos um int
        PlayerPrefs.SetInt("char_power", 10);

        //Salvamos um float
        PlayerPrefs.SetFloat("char_money", 510.20f);
    }
}

Utilizamos a classe PlayerPrefs chamando um determinado método, que recebe no primeiro parâmetro a chave de acesso e no segundo seu valore de acordo com seu tipo. A chave de acesso é um nome que atribuímos para acessar mais tarde seu valor, porém não se preocupe com isso agora se não conseguiu entender, vamos criar um exemplo mais adiante e tudo ficará claro.

Podemos salvar basicamente três tipos de informações, que são elas:

  • SetString() - Apenas textos;
  • SetInt() - Apenas número inteiros;
  • SetFloat() - Apenas números inteiros ou quebrados.

Uma vez que os dados foram salvos, de play em sua aplicação para que as instruções de save sejam de fato executadas. No exemplo acima incluímos ela no método start que será chamado logo que o jogo iniciar.

Agora vamos criar nosso script para carregar os dados salvos, para isso, abra o arquivo LoadPlayerPrefs e insira o código abaixo.

using UnityEngine;

public class LoadPlayerPrefs : MonoBehaviour
{

    void Start()
    {
        //Obtemos os dados salvos do tipo string
        string charName = PlayerPrefs.GetString("char_name");

        //Obtemos os dados salvo do tipo int
        int charPower = PlayerPrefs.GetInt("char_power");

        //Obtemos os dados salvos do tipo float
        float charMoney = PlayerPrefs.GetFloat("char_money");

        Debug.Log(charName);
        Debug.Log(charPower);
        Debug.Log(charMoney);

        if (PlayerPrefs.GetInt("char_power") > 10) {
            Debug.Log("Is Paladin");
        }
    }

}

Olhando rapidamente o código já é possível entender como obter as informações, mas vamos com explicações adicionais. Utilizamos o método GetString para obter um dado que foi salvo através do método SetString.

Se você salvou o dado com o tipo int, então não poderá acessar obtendo o tipo string. Lembre-se, o C# respeita as tipagem.

Ainda sobre o exemplo acima, obtemos os dados e salvamos em variáveis dos seus respectivos tipos, na sequencia, exibimos o resultado no console da Unity. Veja também que mais abaixo utilizamos um if para comparar um valor diretamente sem associar a nenhuma variável.

Métodos adicionais da classe PlayerPrefs

Vimos durante esse artigo como salvar e carregar informações utilizando a classe nativa da Unity, mas é importante que você saiba que existem mais alguns outros métodos com funcionalidades interessantes e úteis, são eles:

HasKey - verifica se uma chave existe.

if(HasKey ("nome_chave")){
    //a chave existe
}

DeleteAll - remove todos os registros existentes.

PlayerPrefs.DeleteAll();

DeleteKey - remove apenas a chave informada.

PlayerPrefs.DeleteKey("nome_chave");

Concluímos aqui mais um artigo, se tiver alguma dúvida, deixe nos comentários.