Unity Streaming Assets iOS无法正常工作

时间:2018-05-17 21:17:27

标签: c# unity3d

我在Unity制作了一款应用程序,该应用程序已在Google Play商店中存放了一年多。今天我想在Apple App Market上部署它,但翻译不能在那里工作。

我使用以下代码加载我的应用翻译

public bool LoadLocalizedText(SystemLanguage language)
{
    localizedText = new Dictionary<string, string>();
    string filePath = Path.Combine(Application.streamingAssetsPath, "localizedText_" + language + ".json");

    WWW reader = new WWW(filePath);
    if (reader.text == null || reader.text == "") return false;
    while (!reader.isDone) { }
    string dataAsJson;
    dataAsJson = reader.text;
    LocalizationData loadedData = JsonUtility.FromJson<LocalizationData>(dataAsJson);



     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");
    if (localizedText.Count == 0) return false;
    else
    {
        isReady = true;
        return true;
    }
}

然而,不知何故,所有文本字段都显示&#34;未找到本地化文本&#34;因为它无法找到我的资产......这可能是什么?

这是因为StreamingAssets文件夹没有被复制到xCode吗? 是因为iOS上的位置不同吗? 还有别的吗?

这是我的文件夹结构 Folder structure

3 个答案:

答案 0 :(得分:2)

WWWUnityWebRequest API用于读取Android上StreamingAssets上的文件。对于iOS,应使用System.IO命名空间中的任何API,例如System.IO.File.ReadAllText

这样的事情:

IEnumerator ReadFromStreamingAssets()
{
    string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, "MyFile");
    string result = "";
    if (filePath.Contains("://"))
    {
        UnityEngine.Networking.UnityWebRequest www = UnityEngine.Networking.UnityWebRequest.Get(filePath);
        yield return www.SendWebRequest();
        result = www.downloadHandler.text;
    }
    else
        result = System.IO.File.ReadAllText(filePath);
}

此外,WWW API用于协同程序功能,以便您可以等到或完成下载,直到下载完成。您的while (!reader.isDone) { }可以冻结Unity。那应该是while (!reader.isDone) yield return null;,等待每一帧直到下载完成。 LoadLocalizedText函数也必须是协程函数,因此返回类型应为IEnumerator而不是bool。要使其返回bool,请使用Action<bool>作为参数。

解决了这两个问题后,下面是新代码的样子:

public IEnumerator LoadLocalizedText(SystemLanguage language, Action<bool> success)
{
    localizedText = new Dictionary<string, string>();
    string filePath = Path.Combine(Application.streamingAssetsPath, "localizedText_" + language + ".json");

    string dataAsJson;

    //Android
    if (filePath.Contains("://"))
    {

        WWW reader = new WWW(filePath);

        //Wait(Non blocking until download is done)
        while (!reader.isDone)
        {
            yield return null;
        }

        if (reader.text == null || reader.text == "")
        {
            success(false);

            //Just like return false
            yield break;
        }

        dataAsJson = reader.text;
    }

    //iOS
    else
    {
        dataAsJson = System.IO.File.ReadAllText(filePath);
    }


    LocalizationData loadedData = JsonUtility.FromJson<LocalizationData>(dataAsJson);



    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");
    if (localizedText.Count == 0)
        success(false);
    else
    {
        isReady = true;
        success(true);
    }
}

并像这样使用:

StartCoroutine(LoadLocalizedText(languageInstance, (status) =>
{
    if (status)
    {
        //Success
    }
}));

答案 1 :(得分:0)

JsonUtility与iOS存在问题,因此无法正常工作 并且如果您在本地使用进行测试,则File.OpenRead(path)在iOS中有效 filePath = Application.streamingAssetsPath

StreamReader streamReader = new StreamReader(File.OpenRead(string.Format("{0}/{1}.txt", filePath, fileName)));

和streamingAssets仅在您要在iOS中写入文件时使用此路径-> Application.persistentDataPath

只读

答案 2 :(得分:0)

实际上,问题在于Application.streamingAssetsPath对于iOS设备而言不是完全正确。您还需要将“ file://” 手动添加到该路径。请注意,应该在Path.Combine()方法之外完成此操作,因为出于某种原因,Combine()方法会剥离它=)我浪费了几个小时试图理解问题所在,希望我的帖子可以节省一些时间。正确的方法是: filePath =“ file://” System.IO.Path.Combine(Application.streamingAssetsPath,“ MyFile”); 其余代码相同(这是正确的)以及AssetBundles)