编辑02 2014年4月02日.Jambla帮助我现在几乎可以肯定这不是UnityWebRequest的限制或错误,因为现在我知道我在项目中使用的相同代码适用于Jambla。由于代码还可以,我认为只有两个可用的解决方案:1。问题是Android版本/设备的组合。我会尽快尝试其他设备。 2.我的项目在构建设置中有一个设置,阻止我的游戏在Start方法之后从streamingAssetsPath复制文件(我可以确认它不是在启动之后,因为如果我尝试在启动后启用游戏对象并且该对象获得了一个脚本,尝试在Start方法中复制它仍然可以工作)。
如果有人知道什么设置导致此行为,请回答此问题。如果您在Android和/或设备版本上遇到相同的行为,请告诉我什么设备/版本。
原始问题。我知道,要从Android上的streamingAssetsPath读取,我需要使用UnityWebRequest来自streamingAssetsPath并在Coroutine中返回unitywebrequest.SendWebRequest()。我还检查平台是否是Android,因为在PC上我不需要使用UnityWebRequest。通常我将一个json文件从streamingAssetsPath复制到persistentDataPath并从那里工作(因为我可以在DOS和Android / iOS上创建和修改文件在persistentDataPath上)。我的问题是该读取仅适用于Start方法(或Start方法上的Coroutine)。我不知道为什么,但是当我尝试在android上运行时从streamingAssetsPath读取文件时(例如在Update或从按钮调用的方法中)我无法做到这一点。我想知道这是Android / Unity限制还是我可以解决它。
我的代码是这样的(此代码仅适用于Android部分):
string fileUrlPath = Path.Combine(Application.streamingAssetsPath, "myjsonfile.json");
UnityWebRequest www = UnityWebRequest.Get(fileUrlPath);
yield return www.SendWebRequest(); //this is where the Coroutine fail if not on Start method
之后我通常使用File.WriteAllBytes将我的json复制到persistentDataPath。
一旦我知道这是否是一个限制我仍然可以继续(我可以通过在Start方法上复制文件来解决这个问题...主要的问题是知道这一点),但如果我可以通过做某事我不知道我想知道该怎么做。
我正在我的应用程序中实现一个类似的方法,我能够在运行时读取streamingAssetsPath。
这是我的实现:
private void LoadGameData()
{
#if UNITY_EDITOR
string filePath = Path.Combine (Application.streamingAssetsPath, gameDataFileName);
if (File.Exists (filePath)) {
string dataAsJson = File.ReadAllText (filePath);
GameData loadedData = JsonUtility.FromJson<GameData> (dataAsJson);
allRoundData = loadedData.allRoundData;
} else
{
Debug.LogError ("Cannot load game data!");
}
#elif UNITY_ANDROID
string path = Application.streamingAssetsPath + "/data.json";
WWW www = new WWW(path);
while(!www.isDone){}
string dataAsJson1 = www.text;
GameData loadedData1 = JsonUtility.FromJson<GameData> (dataAsJson1);
allRoundData = loadedData1.allRoundData;
#endif
}
这是另一个适用于Android和编辑器的实现:
private void LoadGameData()
{
StartCoroutine(GetText());
}
IEnumerator GetText()
{
string path = Application.streamingAssetsPath + "/data.json";
UnityWebRequest www = UnityWebRequest.Get(path);
yield return www.SendWebRequest();
Debug.Log("Loaded Q's");
string dataAsJson1 = www.downloadHandler.text;
GameData loadedData1 = JsonUtility.FromJson<GameData>(dataAsJson1);
allRoundData = loadedData1.allRoundData;
}