我正在使用 HTTPS 中的 UnitywebRequest 方法下载 Assetbundle,但是 UnityWebRequest.SendWebRequest 似乎花了很长时间才真正开始接收任何数据。
public static IEnumerator DownloadMenuAssetBundle(string fileName)
{
string path = Path.Combine(Globals.Platform, fileName);
UnityWebRequest www = new UnityWebRequest(FileManager.RequestFile(path));//this returns the complete url to the bundle e.g https://mywebsite.com/unity/myBundle
www.downloadHandler = new DownloadHandlerBuffer();
www.SendWebRequest();
while (!www.isDone)
{
Debug.Log("response: " + www.responseCode);
if (www.isNetworkError)
{
Debug.Log(www.error);
}
Debug.Log("downloaded:" + www.downloadedBytes);
yield return null;
}
Debug.Log("downloaded bytes: " + www.downloadedBytes);
Debug.Log("final response:" + www.responseCode);
if (www.error != null)
{
Debug.LogError("Encountered error while downloading: <color=blue>" + fileName + "</color>: " + www.error);
}
else
{
//rest of the logic, this works
}
Debug.Log("response: " + www.downloadedBytes);
将返回 0
随机时间(有时从几分钟到几分钟不等)。但是 www. isNetworkError
永远不会被命中,一旦开始接收字节,它就会在几毫秒内下载整个内容。以前,我在 http 服务器上使用完全相同的脚本,它完美无缺地工作,没有任何延迟,但是一旦我切换到 https,它就开始需要一段时间。延迟也不会发生在编辑器中(Unity 版本 2017.2.1f1 运行时版本 .net 3.5,具有 2.0 子集 api 兼容性),但发生在我所有的移动设备上(一加 3、三星 Galaxy s8、三星 Galaxy s6)。
起初
www.responseCode
返回一个 301 Moved Permanently
,我通过使用新的 https url 而不是 http url 解决了这个问题,希望这能解决它。但是它没有,现在我只得到 200 OK
。这也是一个不一致的问题,因为它花费的时间并不相同,它甚至不会一直发生(但大部分时间都会发生)
这是否是安全层需要额外时间或服务器需要时间响应的问题?如果这是问题,我将如何追踪它(尽管我对此表示怀疑,因为它在编辑器中运行良好)?
编辑: 解决方法
我通过使用
WWW
类而不是 UnityWebRequest
解决了这个问题。延迟现在完全消失了,但没有进行 SSL 证书验证,因为 Unity 似乎默认拒绝它们。我不会真正称其为修复,但目前有效。 最佳答案
UnityWebRequest
总是有问题 - 有时 UnityWebRequests 没有任何意义......
你可以尝试更换
UnityWebRequest www = new UnityWebRequest(FileManager.RequestFile(path));
和
UnityWebRequest www = new UnityWebRequestAssetBundle(FileManager.RequestFile(path), 0);
测试可选:
此外,我认为您的
while
循环不是“保存”以捕获网络错误。我更喜欢 documentation 中提到的以下内容
UnityWebRequest www = new UnityWebRequestAssetBundle(FileManager.RequestFile(path);
yield return www.SendWebRequest();
if (request.isNetworkError || request.isHttpError)
{
Debug.Log(www.error.ToString());
}
else
{
// for testing only // if yield return www.SendWebRequest(); is working as expected www.isDone = true here!
while (!www.isDone)
{
Debug.Log("Something is wrong! " + www.responseCode);
yield return new WaitForSeconds(0.1f);
}
// do whatever you want
}
希望这可以帮助。
关于android - UnityWebRequest.SendWebRequest 不会在移动设备上发送,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52588303/