Todo bom jogo que se preze salva os dados da campanha ou partida para que quando o jogador retorne ao game, ele possa continuar de onde parou. Essa funcionalidade maravilhosa cabe a nós desenvolvedores programar e garantir a sua total funcionalidade.
Esse é um artigo bem rico, que para gravar um simples texto no formato em JSON, vamos passar por algumas linhas de códigos e conceitos bem interessantes.
Obtendo as pastas especiais do Windows
Para obter o caminho completo da pasta Meus Documentos, Desktop, Arquivos de Sistema, entre outros, nós devemos utilizar o método GetFolderPath da classe System. Vamos ver abaixo como ficaria para obter o caminho completo até o Desktop (área de trabalho) do usuário.
System.Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);
Você pode obter todos os valores disponíveis em https://docs.microsoft.com/pt-br/dotnet/api/system.environment.specialfolder?view=net-6.0.
Alguns dos diretórios são:
- SpecialFolder.MyDocuments;
- SpecialFolder.Desktop;
- SpecialFolder.CommonProgramFiles;
Persistindo os dados na Unity 3D
Para que a gente possa a dar início aos trabalhos, crie um novo script chamado de SaveInSpecialFolder e associe ele ao GameObject Camera ou qualquer outro que estará em cena quando der play.
Até aqui perfeito, nós já temos nosso script criado e já sabemos também qual método com parâmetro devemos utilizar para obter o caminho completo dos diretórios especiais.
Agora vamos incluir a instrução abaixo logo no início do nosso script, assim vamos importar as funcionalidades para manipulação de diretórios e arquivos.
using System.IO;
Vamos criar uma nova classe chamada de PlayerInfo, para esse exemplo, nós mantivemos ela no mesmo arquivo criado anteriormente, ela vai conter todos os dados que serão gravados no arquivo de texto. Nessa classe como pode ser observado no código abaixo, temos algumas propriedades que diz respeito as características do personagem, note também, que utilizamos a instrução Serializable, garantindo assim que as informações possam ser gravadas e preenchidas quando necessário.
[System.Serializable]
public class PlayerInfo
{
public string char_name = "Aleska";
public int life = 100;
public int power = 10;
}
Agora dentro da nossa classe SaveInSpecialFolder, vamos criar um método chamado de GetData(). Nesse método basicamente criamos uma nova instância da classe PlayerInfo, na sequencia atribuímos o valor 70 para a propriedade power e por fim, retornamos seu conteúdo no formato de JSON.
A classe JsonUtility é a responsável por manipular os Jsons dentro da Unity, através dela utilizamos o método ToJson para converter nossa classe PlayerInfo em uma string Json. É importante que suas propriedades ou classes sejam serializadas.
private string GetData()
{
PlayerInfo pi = new PlayerInfo();
pi.power = 70;
return JsonUtility.ToJson(pi);
}
Agora vamos obter o diretório na qual vamos salvar nosso arquivo, para isso, quebramos a instrução em algumas partes e atribuímos a variáveis, afim de deixar esse tutorial mais didático.
Vamos criar um método chamado GetDir, ele retorna uma string e será responsável por criar o caminho caso ele não exista e retornar o caminho completo com o nome do arquivo.
Veja o código completo do método abaixo.
private string GetDir()
{
string myDocuments = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
string myPath = string.Format("{0}/my_studio/my_game", myDocuments);
string fullPath = string.Format("{0}/my_file.json", myPath);
if (!Directory.Exists(myPath))
{
Directory.CreateDirectory(myPath);
}
return fullPath;
}
Vamos entender agora cada linha desse método:
- Linha 1 - criamos uma variável chamada de myDocuments e atribuímos a ela o caminho para a pasta meus documentos;
- Linha 2 - aqui utilizamos o método string.format para montar um novo endereço contendo o diretório meus documentos com o caminho para as pastas. Nesse exemplo vamos criar uma pasta chamada my_studio e dentro dela my_game dentro do diretório Meus Documentos;
- Linha 3 - seguindo a mesma proposta da linha anterior, aqui criamos uma nova variável que será retornada no método. Ela armazena o caminho completo com o nome do arquivo, que para esse exemplo, ficou como my_file.json;
- Linha 4...6 - na sequencia utilizamos um if para verificar se o diretório armazenado na variável da linha 2 não existe, assim o criando quando necessário;
- Linha 7 - por fim, retornamos o nome do nosso arquivo completo.
Maravilha, mais uma parte importante está criada, agora temos um método que retorna o nome do caminho com o arquivo. O legal aqui é que se o caminho não existir, o próprio método se encarrega de criar, esse é o poder de desmembrar partes do seu código em responsabilidades.
Estamos na penúltima etapa do nosso curto percurso de salvar as informações, agora vamos de fato persistir o Json no arquivo, mas para isso vamos criar um novo método chamado SaveData com o tipo de retorno void. Veja o código completo abaixo.
private void SaveData()
{
using (StreamWriter sw = new StreamWriter(this.GetDir())) {
string data = this.GetData();
Debug.Log(data);
sw.WriteLine(data);
sw.Close();
}
}
Vamos entender o que cada uma dessas linhas do nosso método estão fazendo:
- Utilizamos a instrução using para criar uma nova instância da classe StreamWriter, que é responsável por gravar nossas informações. Perceba que estamos chamando o método Getdir() para nos retornar o caminho completo do arquivo que vamos fazer a persistência do conteúdo;
- Criamos uma variável chamado de data para armazenar a string Json que é obtida através do método GetData();
- Para título didático, exibimos o conteúdo do Json no console da Unity, mas essa linha é desnecessária para nossa funcionalidade;
- Chamamos o método WriteLine da classe StreamWriter e passamos como parâmetro o conteúdo que desejamos salvar;
- Por fim, fechamos a conexão com o arquivo, deixando ele livre para a utilização.
Agora para finalizar, vamos fazer uma chamada para o método SaveData() no método padrão Start.
private void Start()
{
SaveData();
}
Basta agora só pressionar o Play e ver nosso código funcionando. Se tudo deu certo, o diretório será criado com as informações no arquivo, como podemos observar na imagem abaixo.
Confira o nosso código completo abaixo.
using UnityEngine;
using System.IO;
public class SaveInSpecialFolder : MonoBehaviour
{
private void Start()
{
SaveData();
}
private void SaveData()
{
using (StreamWriter sw = new StreamWriter(this.GetDir())) {
string data = this.GetData();
Debug.Log(data);
sw.WriteLine(data);
sw.Close();
}
}
private string GetDir()
{
string myDocuments = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
string myPath = string.Format("{0}/my_studio/my_game", myDocuments);
string fullPath = string.Format("{0}/my_file.json", myPath);
if (!Directory.Exists(myPath))
{
Directory.CreateDirectory(myPath);
}
return fullPath;
}
private string GetData()
{
PlayerInfo pi = new PlayerInfo();
pi.power = 70;
return JsonUtility.ToJson(pi);
}
}
[System.Serializable]
public class PlayerInfo
{
public string char_name = "Aleska";
public int life = 100;
public int power = 10;
}
Finalizamos por aqui mais um conteúdo, então, até a próxima oportunidade.