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.
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:
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:
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:
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.