C# Android Unity3d限制流化AssetPath only启动方法(更新的设备/版本或设置?)

C# Android Unity3d限制流化AssetPath only启动方法(更新的设备/版本或设置?),c#,android,unity3d,C#,Android,Unity3d,2019年4月2日编辑。 有了Jambla的帮助,我现在几乎可以肯定这不是UnityWebRequest的限制或bug,因为现在我知道我在项目中使用的代码也适用于Jambla。由于代码正常,我认为只有两种可用的解决方案: 1.问题在于Android版本/设备的组合。我会尽快尝试其他设备。 2.构建设置中有一个关于我的项目的设置,可以防止我的游戏在启动后通过StreamingAssetPath方法复制文件(我可以确认它不是在启动后,因为如果我尝试在启动后启用一个游戏对象,而该对象得到一个脚本,尝试

2019年4月2日编辑。 有了Jambla的帮助,我现在几乎可以肯定这不是UnityWebRequest的限制或bug,因为现在我知道我在项目中使用的代码也适用于Jambla。由于代码正常,我认为只有两种可用的解决方案: 1.问题在于Android版本/设备的组合。我会尽快尝试其他设备。 2.构建设置中有一个关于我的项目的设置,可以防止我的游戏在启动后通过StreamingAssetPath方法复制文件(我可以确认它不是在启动后,因为如果我尝试在启动后启用一个游戏对象,而该对象得到一个脚本,尝试在启动方法中进行复制,它仍然可以工作)

如果有人知道是什么环境导致了这种行为,请回答这个问题。如果您在android版本和/或设备上遇到相同的行为,请告诉我是什么设备/版本

原来的问题。 我知道,要从Android上的StreamingAssetPath读取,我需要使用UnityWebRequest从StreamingAssetPath获取,并在协同程序中返回UnityWebRequest.SendWebRequest()。 我还检查了平台是否是Android,因为在PC上我不需要使用UnityWebRequest。 通常我会将一个json文件从StreamingAssetPath复制到persistentDataPath并从那里开始工作(因为我可以在PC和persistentDataPath上的Android/iOS上创建和修改文件)。 我的问题是,读取只对Start方法有效(或者对Start方法有效)。我不知道为什么,但当我在android上运行时尝试从StreamingAssetPath读取文件时(例如在更新中或在按钮调用的方法中),我无法做到这一点。 我想知道这是Android/Unity限制还是我能解决它

我的代码是这样的(此代码仅适用于Android部分):

之后,我通常使用File.writealBytes将json复制到persistentDataPath


一旦我知道这是否是一个限制,我无论如何都可以继续(我可以通过复制Start方法上的文件来解决这个问题…主要的问题是要知道这一点),但是,如果我可以通过做一些我不知道的事情来做到这一点,我想知道如何做到这一点。

我在应用程序中实现了一个类似的方法,并且我能够在运行时读取StreamingAssetPath

以下是我的实现:

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
}
private void LoadGameData()
{
#如果统一编辑器
字符串filePath=Path.Combine(Application.streamingassetpath,gameDataFileName);
如果(File.Exists(filePath)){
字符串dataAsJson=File.ReadAllText(filePath);
GameData loadedData=JsonUtility.FromJson(dataAsJson);
allRoundData=loadedData.allRoundData;
}否则
{
Debug.LogError(“无法加载游戏数据!”);
}
#艾利夫·尤尼安卓
字符串路径=Application.streamingAssetsPath+“/data.json”;
WWW=新WWW(路径);
而(!www.isDone){}
字符串dataAsJson1=www.text;
GameData loadedData1=JsonUtility.FromJson(dataAsJson1);
allRoundData=loadedData1.allRoundData;
#恩迪夫
}
下面是另一个在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;

}
private void LoadGameData()
{
start例程(GetText());
}
IEnumerator GetText()
{
字符串路径=Application.streamingAssetsPath+“/data.json”;
UnityWebRequest www=UnityWebRequest.Get(路径);
返回www.SendWebRequest();
Log(“加载的Q”);
字符串dataAsJson1=www.downloadHandler.text;
GameData loadedData1=JsonUtility.FromJson(dataAsJson1);
allRoundData=loadedData1.allRoundData;
}

谢谢,但您应该注意,我向unity3d团队询问,WWW类已经过时,将来将被删除,请注意。尽管如此,这可能是UnityWebRequest类目前的一个限制,毕竟在一些版本之前,它不可能做一些我现在能够做的事情(因此不可能使用它来代替WWW类)。无论如何,我将尝试询问Unity3d团队这是否是UnityWebRequest的缺陷/限制。我已使用使用UnityWebRequest的工作版本更新了我的答案。我已经在编辑器和Android上对此进行了测试,效果良好。我使用了相同的代码(我尝试了Path Combine和string+string)。。。但在我的设备(xperia z5 compact android 7.1.1版)中,收益返回www.SendWebRequest();仅当我在Start方法中调用GetText或LoadGameData时有效。如果你的代码在android上运行,可能是我使用的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;

}