Unity中提供了协程的方法,在处理一些需要异步的函数时非常方便,尤其是在处理网络请求响应的时候,但是协程函数有些时候需要自定义,这就需要自己实现满足条件的协程函数了,好在Unity提供了这样的类来帮助我们实现相关的功能。通过继承CustomYieldInstruction实现自己的协程函数。
https://docs.unity3d.com/ScriptReference/CustomYieldInstruction.html
其中接口函数keepWaiting是一定要实现的,以一段http请求的代码为例:
当然了Unity的原生类UnityWebRequest是支持协程的就没这么麻烦,可是如果需要C#的HttpWebRequest来实现的时候就没那么容易了,需要自己实现了。 实现方式如下,通过keepWaiting的返回值来通知调用的代码是否执行完毕。
/// <summary>
/// 自定义协程函数,解决HttpWebResponse不支持协程的问题
/// </summary>
class GetResponse : CustomYieldInstruction
{
bool code = true;
public HttpStatusCode StatusCode;
public string responseString;
public GetResponse(HttpWebRequest httpWebRequest)
{
try
{
HttpWebResponse httpWebResponse = httpWebRequest.GetResponse() as HttpWebResponse;
StatusCode = httpWebResponse.StatusCode;
var responseStream = httpWebResponse.GetResponseStream();
var reader = new StreamReader(responseStream);
responseString = reader.ReadToEnd();
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
code = false;//结束协程的挂起等待
}
public override bool keepWaiting
{
get { return code; }
}
}