首先是UnityWebRequest
的构建与数据发送:
UnityWebRequest webRequest = new UnityWebRequest(url, "POST"); // 初始化使用POST的UnityWebRequest,并附上目标地址
webRequest.SetRequestHeader("", ""); // 设置HTTP的头信息
// 初始化UnityWebRequest的downloadHandler与uploadHandler
webRequest.downloadHandler = (DownloadHandler) new DownloadHandlerBuffer();
webRequest.uploadHandler = (UploadHandler) new UploadHandlerRaw(data);
webRequest.uploadHandler.contentType = "application/x-www-form-urlencoded";
var asyncOperation = webRequest.SendWebRequest(); // 数据发送
玩游网调用了UnityWebRequest.SendWebRequest
之后,会得到一个UnityWebRequestAsyncOperation
类型的实例。作为继承自AsyncOperation
的类,UnityWebRequestAsyncOperation
除了能表示请求的进度以及是否结束外,还附带有创建了本次请求的UnityWebRequest
的实例的引用。后续数据的接收方案都基于此。
短链接的接收方案1——completed回调
当调用了UnityWebRequest.SendWebRequest
之后,可以对得到的UnityWebRequestAsyncOperation
类型实例内的completed
事件添加行为,以期在收到服务器返回消息后能够立即处理接收到的数据。
asyncOperation.completed += (a) =>
{
// 将事件传入的 AsyncOperation 转换为 UnityWebRequestAsyncOperation,
// 并从webRequest的downloadHandler中获取下载的数据
Do(((UnityWebRequestAsyncOperation)a).webRequest.downloadHandler.data);
};
短链接的接收方案2——Update
当调用UnityWebRequest.SendWebRequest
获取到UnityWebRequestAsyncOperation
类型的实例后,可以将该实例加入一个队列。依托网络模块的心跳(Update方法,这里的网络模块指你自己实现的网络架构,如何让它的Update执行起来由你说了算),在每次心跳时检测队列内的请求是否完成,并对完成的请求执行后续操作。
// 存放 UnityWebRequestAsyncOperation 的列表
private List<UnityWebRequestAsyncOperation> _asyncOperations = new List<UnityWebRequestAsyncOperation>();
public void Update()
{
for (int i = 0; i < _asyncOperations.Count; i++)
{
var asyncOperation = _asyncOperations[i];
if (!asyncOperation.isDone)
{
// 请求未完成,则略过后续处理逻辑
continue;
}
// 从webRequest的downloadHandler中获取下载的数据并处理
Do(asyncOperation.webRequest.downloadHandler.data);
asyncOperation.Dispose();
// 移除已处理完的请求
_asyncOperations.RemoveAt(i--);
}
}
需要说明的是,处理完下载数据后一定要对asyncOperation
执行Dispose
操作,否则Unity很可能会有Native数据泄露的报错。初步判定这是Unity对UnityWebRequest管理导致的报错。
标签:asyncOperation,游戏,c#,downloadHandler,asyncOperations,webRequest,模块,UnityWebReque From: https://www.cnblogs.com/yeci/p/17572834.html