Devlog

Tilo Mitra's avatar

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 json
public 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 Android
Não foram feitos testes no IOS, pois não possuo equipamentos da Apple.
Qualquer dúvida, pode me contactar pelas minhas redes sociais.

Voltar