本文都是参考一个开源的项目:Unity3dAsyncAwaitUtil/releases
之前写的文章可以参考:Unity 中的 async-await 关键字解析
本文要实现的就是:await 可以直接接 协程 yield return 的东西
此处就拿 WaitForSecond 举例子:
void Start()
{
ForIEnumator();
}
async void ForIEnumator()
{
await WaitThenThrow();
}
IEnumerator WaitThenThrow()
{
yield return WaitThenThrowNested();
}
IEnumerator WaitThenThrowNested()
{
Debug.Log("Waiting 1 second...");
yield return new WaitForSeconds(1.0f);
throw new Exception("zxcv");
}
那么具体是怎么实现的呢?
首先 await 后面跟着的是 一个 INotifyCompletion 类型,很显然 WaitForSeconds 不是,那我们就可以写一个扩展方法,叫做 GetAwaiter 兼容一下
public static IEnumatorAwaiter<object> GetAwaiter(this IEnumerator coroutine)
{
IEnumatorAwaiter<object> awaiter = new IEnumatorAwaiter<object>();
SyncContextUtil.RunOnUnityScheduler(() =>
{
CoroutineRunner.Instance.StartCoroutine(
new IEnumeratorWrapper<object>(coroutine, awaiter).Run());
});
return awaiter;
}
public static IEnumatorAwaiter<T> GetAwaiter<T>