UnityWebRequest的一个小坑

最近在实习,主要的内容是Unity(WebGL),需求是能够从服务器(Proxy)获取数据后展示出来,应该是个蛮简单的任务吧。

Unity提供了一个叫UnityWebRequest的工具类,封装了常用的网络方法。按理来说使用Get方法就能够很容易得到结果了,但是官网没有怎么await长时间请求的案例,网上抄来的其他代码也不管用。

后来发现问题出在不应该用下载过程中的UnityWebRequest.Result的错误判断来做while循环的判断点,不然的话哪怕下载成功了也还是会继续等待。就改成200了。似乎是因为UnityWebRequest会先返回200再解包错误导致的。

完整代码大概是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public IEnumerator ImportAsMeshCoroutine(...) 
{
...
#if UNITY_WEBGL
UnityWebRequest request = UnityWebRequest.Get(path);
#else
...
#endif
yield return request.SendWebRequest();

if (request.isNetworkError)
{
Debug.LogError("Error: " + request.error);
yield break;
}

// 关键的地方在这里
while (request.responseCode != 200)
{
yield return null;
}

if (request.result == UnityWebRequest.Result.ConnectionError
|| request.result == UnityWebRequest.Result.DataProcessingError
|| request.result == UnityWebRequest.Result.ProtocolError)
{
...
}
...
}

不过这样一来又有了新的问题,如果下载过程中发生了各种各样错误以至于最后的结果不是200,那该怎么处理呢?每个状态码都添加出来的话会显得极度麻烦难以维护。

总之还是记录下来,毕竟也没找到其他相关的讨论了。

  • 2023-6-27更新

不知不觉实习也过去了好久,也早就不用Unity了。回过头看,其实确实是个蛮基础的错误,不过对于只会同步代码刚接触异步的新手来说,Unity的文档还是不太方便的,yield return的语义也没那么好懂。我当初也花了不少时间去想yield return null到底是什么意思。


UnityWebRequest的一个小坑
http://inori.moe/2022/10/21/resolved-issue-of-unitywebrequest/
作者
inori
发布于
2022年10月21日
许可协议