Unity - Carregando o json da pasta StreamingAssets no Android
Um grande problema quando queremos utilizar um arquivo do tipo json, para por exemplo, traduzir um aplicativo/jogo no Android,
não conseguimos ter acesso a pasta StreamingAssets diretamente. A pasta StreamingAssets é uma pasta que o
Unity não criptografa, sendo excelente para colocar arquivos de tradução ou até arquivos de configuração do
seu aplicativo/jogo.
Depois de algumas pesquisas, descobri como resolver este problema relacionado ao Android, quero deixar registrado para
ajudar quem tiver dificuldades.
A pasta StreamingAssets não é criada por padrão nos projetos, então crie na raiz do seu projeto.
Primeiro vamos entender o funcionamento da leitura do json na game engine Unity.
Existem diversos métodos para fazer a leitura de um json na engine, tive a oportunidade de estudar diversos métodos, este eu
considero o mais simplificado.
Vamos construir um json bem simples, bem direto ao ponto, exatamente o que preciso em uma aplicação que estou desenvolvendo no momento.
Na pasta StreamingAssets, crie o arquivo "pt.json", você pode criar com qualquer nome, mas para este exemplo, lembre que vamos tratar o
nome do arquivo como "pt.json".
Veja o json abaixo.
{
"gameName": "Nome do jogo",
"gameMode1": "Modo de jogo 1",
"gameMode2": "Modo de jogo 2",
}
Criado o json, também precisamos criar um novo script que será a classe que a engine vai inicializar.Crie conforme o exemplo abaixo.
public class Translate : MonoBehaviour
{
public TranslateDB translateDB = default;
void Start()
{
translateDB = new TranslateDB();
translateDB.LoadJson();
}
}
Para este exmplo, apenas isso já é o suficiente, primeiro vamos criar uma referência para a outra classe que vamos criar mais adiante.Inicializamos ela e vamos chamar o método de tradução.
Depois vamos montar a classe que contém as variáveis com os mesmos nomes das keys do arquivo json, coloquei o nome de TraslateDB neste script.
public class TranslateDB
{
public string gameName = default;
public string gameMode1 = default;
public string gameMode2 = default;
}
Dentro da mesma classe TranslateDB crie o método que faz a leitura do jsonpublic void LoadJson()
{
string fileName = "pt.json";
string filePath = Application.streamingAssetsPath + "/" + fileName;
string jsonString = "";
jsonString = File.ReadAllText(filePath);
//... continua
}
Obs¹ Devido a limitação do plugin de exibir códigos no html sobre o <>, fizemos uma separação no código do método de leitura do json.Insira o código abaixo logo após a última linha jsonString...
var jsonData = JsonUtility.FromJson<translatedb>(jsonString);
Agora pode copiar o restante das linhas também no final do método.
gameName = jsonData.gameName;
gameMode1 = jsonData.gameMode1;
gameMode2 = jsonData.gameMode2;
Continuando, a método de acesso a arquivos da pasta StreamingAssets é a padrão da engine, como já mencionamos, no Android, o json
está dentro do apk, não sendo possível ter acesso diretamente, precisando ser necessário fazer um ajuste no método de leitura para que
seja verificado dentro do apk pela o arquivo.json especificado.public void LoadJson()
{
string fileName = "pt.json";
string filePath = Application.streamingAssetsPath + "/" + fileName;
string jsonString = "";
if (Application.platform == RuntimePlatform.Android)
{
WWW reader = new WWW(filePath);
while (!reader.isDone) { }
jsonString = reader.text;
}
else
{
jsonString = File.ReadAllText(filePath);
}
//... continua
}
Obs² Como disse acima, insira a linha abaixo no método de leitura do json.var jsonData = JsonUtility.FromJson<TranslateDB>(jsonString);
Por fim, vamos finalizar o método com as 3 linhas abaixo.
gameName = jsonData.gameName;
gameMode1 = jsonData.gameMode1;
gameMode2 = jsonData.gameMode2;
Desta forma, você consegue realizar a tradução também no AndroidNão foram feitos testes no IOS, pois não possuo equipamentos da Apple.
Qualquer dúvida, pode me contactar pelas minhas redes sociais.