我编写了一个脚本,它简单地使用UnityWebRequest
下载一个文本文件。(我将文本大小设置为50 MB,以查看有意义的进展。)
private IEnumerator GetRequest(Uri uri)
{
using var unityWebRequest = UnityWebRequest.Get(uri);
var operation = unityWebRequest.SendWebRequest();
while (!operation.isDone)
{
progressText.text = $"Progress : {unityWebRequest.downloadProgress * 100:0.0}%";
yield return null;
}
}
上面的代码显示了所需的结果。
然后我开始好奇一个问题。因此,我修改了代码,使其不使用UnityWebRequestAsyncOperation
变量。
private IEnumerator GetRequest(Uri uri)
{
using var unityWebRequest = UnityWebRequest.Get(uri);
unityWebRequest.SendWebRequest(); // Edit here
while (!unityWebRequest.isDone) // Edit here
{
progressText.text = $"Progress : {unityWebRequest.downloadProgress * 100:0.0}%";
yield return null;
}
}
但奇怪的是,它的工作原理是一样的。
为了解决这个问题,我查找了UnityWebRequest.isDone
和UnityWebRequestAsyncOperation.isDone
之间的区别。
https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequest-isDone.html https://docs.unity3d.com/ScriptReference/Networking.UnityWebRequestAsyncOperation.html
即使在阅读了以上两篇文章之后,我也不太明白。这两种情况之间有什么区别吗?
发布于 2022-04-22 11:43:49
异步操作运行在一个单独的线程上,因此,不妨碍游戏的正常流程。假设您正在从您的游戏中从互联网下载一个视频,这是100 MB大。如果您不使用异步操作,游戏实际上会等到下载完成(您可能会认为它冻结)。当下载诸如文本文件或访问网站之类的小东西时,不使用异步方法是可以的,但我建议使用异步方法来避免阻塞主线程,以防出现问题(比如,由于任何原因,在线连接需要更长的时间)。
https://stackoverflow.com/questions/71962603
复制相似问题