我在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上的位置不同吗? 还有别的吗?
答案 0 :(得分:2)
WWW
或UnityWebRequest
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)