Unity: чтение json с android

126
29 сентября 2019, 05:50

К сожалению, достаточно заезженный вопрос, который у меня не работает. Делаю для своей игры переводчик по оффициальному тутору юнити, но раз у меня игра на андроид, то пришлось добавить несколько строк, тк файлы без WWW не прочесть. На всякий случай прилагаю не отрезок, а весь код:

using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class LocalizationManager : MonoBehaviour {
public static LocalizationManager instance;
private Dictionary<string, string> localizedText;
private bool isReady = false;
private string missingTextString = "Localized Text not found";
// Use this for initialization
void Awake () {
    if (instance == null)
    {
        instance = this;
    }
    else if (instance != this)
    {
        Destroy(gameObject);
    }
    DontDestroyOnLoad(gameObject);
}
public void LoadLocalizedText(string fileName)
{
    localizedText = new Dictionary<string, string>();
    string filePath = Path.Combine(Application.streamingAssetsPath, "Languages/" + fileName + ".json");

    if (File.Exists(filePath))
    {
#if UNITY_ANDROID && !UNITY_EDITOR
        WWW reader = new WWW(filePath);
        while (!reader.isDone) { }
        string dataAsJson = reader.text;
        LocalizationData loadedData = JsonUtility.FromJson<LocalizationData>(dataAsJson);
        Debug.Log("Translate is done on Android");
#endif
#if UNITY_EDITOR
        string dataAsJson = File.ReadAllText(filePath);
        LocalizationData loadedData = JsonUtility.FromJson<LocalizationData>(dataAsJson);
        Debug.Log("Translate is done on Editor");
#endif
        for (int i = 0; i < loadedData.items.Length; i++)
        {
            localizedText.Add(loadedData.items[i].key, loadedData.items[i].value);
        }
        Debug.Log("Data loaded, dictionary contains: " + localizedText.Count + " entries");
    }
    else
    {
        Debug.LogError("Can not find file!");
    }
    isReady = true;
}
public string GetLocalizedValue(string key)
{
    string result = missingTextString;
    if (localizedText.ContainsKey(key))
    {
        result = localizedText[key];
    }
    return result;
}
public bool GetIsReady()
{
    return isReady;
}
}

При запуске через юнити эдитор, все работает, а при запуске с телефона-андроид пишет на всех текстовых полях "Localized Text not found". Подскажите, что не так?

Answer 1

Спустя несколько дней, как я начал сходить с ума по этой проблеме, нашлось решение. Все дело в цикле while (!reader.isDone) { }. Видимо, он криво выполнялся и вел к тому, что файл не читался. Прилагаю свой рабочий код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
public class LocalizationManager : MonoBehaviour {
public static LocalizationManager instance;
private Dictionary<string, string> localizedText;
private bool isReady = false;
private string missingTextString = "Localized Text not found";
// Use this for initialization
void Awake () {
    if (instance == null)
    {
        instance = this;
    }
    else if (instance != this)
    {
        Destroy(gameObject);
    }
    DontDestroyOnLoad(gameObject);
}
public void LoadLocalizedText(string fileName)
{
    localizedText = new Dictionary<string, string>();

    string filePath = Path.Combine(Application.streamingAssetsPath, "Languages/" + fileName + ".json");
    Debug.Log(filePath);
    if (File.Exists(filePath))
    {
        string dataAsJson = File.ReadAllText(filePath);
        LocalizationData loadedData = JsonUtility.FromJson<LocalizationData>(dataAsJson);
        Debug.Log("Translate is done on Editor");

        for (int i = 0; i < loadedData.items.Length; i++)
        {
            localizedText.Add(loadedData.items[i].key, loadedData.items[i].value);
        }
        Debug.Log("Data loaded, dictionary contains: " + localizedText.Count + " entries");
    }
    else
    {
        Debug.LogError("Can not find file!");
    }
    isReady = true;
}

IEnumerator LoadLocalizedTextOnAndroid(string fileName)
{
    localizedText = new Dictionary<string, string>();
    string filePath = Path.Combine(Application.streamingAssetsPath, fileName + ".json");
    WWW reader = new WWW(filePath);
    yield return reader;
    Debug.LogWarning(filePath);
    if (reader.error != null)
    {
        Debug.LogWarning(reader.error);
        yield break;
    } 
    string dataAsJson = reader.text;
    LocalizationData loadedData = JsonUtility.FromJson<LocalizationData>(dataAsJson);
    Debug.Log("Translate is done on Android");
    for (int i = 0; i < loadedData.items.Length; i++)
    {
        localizedText.Add(loadedData.items[i].key, loadedData.items[i].value);
        Debug.Log("KEYS:" + loadedData.items[i].key);
    }
    isReady = true;
}

public void SetLanguage(string fileName)
{
    if (Application.platform == RuntimePlatform.WindowsEditor)
        LoadLocalizedText(fileName);
    else if (Application.platform == RuntimePlatform.OSXEditor)
        LoadLocalizedText(fileName);
    else if (Application.platform == RuntimePlatform.Android)
        StartCoroutine("LoadLocalizedTextOnAndroid", fileName);
}

public string GetLocalizedValue(string key)
{
    string result = missingTextString;
    if (localizedText.ContainsKey(key))
    {
        result = localizedText[key];
    }
    return result;
}
public bool GetIsReady()
{
    return isReady;
}
}
READ ALSO
winform picturebox не отображает JPEG byte из SQL

winform picturebox не отображает JPEG byte из SQL

этот код отображает фото из датабейз Nortwind из таблицы Categories

131
Стиль Xaml для кнопки &ldquo;крестик&rdquo;

Стиль Xaml для кнопки “крестик”

В триггерах, сеттерах и т д не очень силён, подскажите пожалуйста, как можно реализовать стиль, чтобы при наведении на кнопку, она постепенно...

169
Не видно ui обьектов в Canvas в unity

Не видно ui обьектов в Canvas в unity

Не видно ui обьектов в canvasУ меня 2 canvas, я не вижу обьектов на втором canvas они невидимые, почему так

105