当前位置:首页 > 游戏信息 > 正文

如何将Unity的Coroutine封装到Async/Await模式中

如何将Unity的Coroutine封装到Async/Await模式中-第1张-游戏信息-龙启网

在探索Unity Coroutine返回值处理的解决方案时,发现原有的方法显得勉强,尤其是在事件处理器嵌套于多层 Coroutine 中时,逻辑变得复杂难懂。于是,我继续在网络上寻求前人经验,发现了一种更优雅的解决方案 - Async/Await模式。

Async/Await模式是目前成熟的异步编程方法,其价值不在于提升程序运行速度,而是使代码结构符合人类日常习惯。通过了解此模式,我们能够实现代码的简洁清晰,如同派遣赵子龙跑快递并等待回信。网上已有开发者对Coroutine和IEnumerator进行了扩展,使其可以轻松封装到Async/Await模式中。

游戏蛮牛多年前就有过相关项目的中文翻译,通过阅读原文,发现已有代码示例展示了如何将Unity中的常见协程转换为可await的等待。感兴趣者可以克隆GitHub上的源代码深入研究。项目的核心在于实现CustomAwaiter。

为了实现最简单版本的UnityWebRequestResourceLoader资源加载类,首先需要创建一个Awaiter类,需引用System.Runtime.CompilerServices库,并实现INotifyCompletion接口的OnCompleted方法以及GetAwaiter、IsCompleted、GetResult、Complete方法和属性。业务逻辑类中,将业务逻辑分为两部分:传统Unity协程方法和Awaiter返回值的方法。通过这种方式,主程序可以使用await语法调用。

主程序挂载在场景中的GameObject上,采用await xxx()的写法,使得代码结构更为清晰。对于自定义Async/Await封装Unity协程的过程,其关键在于实现CustomAwaiter和合理安排业务逻辑。在测试中,使用Thread.Sleep模拟耗时任务导致卡顿,这在Unity中可能因单线程导致。调整为WaitForSeconds后,问题得到解决。

通过这个过程,我们能够实现Unity Coroutine的封装到Async/Await模式,使代码逻辑更符合人类习惯,提升代码可读性和维护性。未来,可进一步研究svermeulen的开源项目,利用SynchronizationContext将耗时任务转至其他线程,优化性能。