
通常可以使用异步函数代替协程,因为Unity可能需要使用协程完成的许多事情都可以使用异步函数来完成。
然而,它们以不同的方式工作,并且各有不同的长处和短处。
例如:
async不能很好地与WebGL构建配合使用,尽管该问题已在最新版本的Unity中得到修复,虽然协程的最大问题之一是,与异步函数不同,它们不能返回数据。
然而…
协程和async/await之间最大的区别之一,在本人看来,在这两个选项之间进行选择时要考虑的最大因素是如何处理操作的生命周期。
例如:
一个协程只要它需要运行就存在,或者只要启动它的对象继续存在就存在。
那么这就意味着,如果销毁启动它的对象,协程也将停止。
然而…
异步函数并不依赖于调用它们的对象,这意味着它们可以继续运行,即使在它们被销毁之后也是如此。
例如:
如果启动协程并同时调用异步函数,但随后立即销毁对象,异步函数仍会完成,但协程不会。

void Start()
{
StartCoroutine(MyTask());
MyTaskAsync();
Destroy(gameObject);
}
async void MyTaskAsync()
{
// This task will finish, even though it's object is destroyed
Debug.Log("Async Task Started");
await Task.Delay(5000);
Debug.Log("Async Task Ended");
}
IEnumerator MyTask()
{
// This task won't finish, it will be stopped as soon as the object is destroyed
Debug.Log("Task Started");
yield return new WaitForSeconds(5);
Debug.Log("Task Ended");
}
这可能是好事,也可能是坏事,具体取决于要执行的操作。
例如:
由于其对象被销毁而中断的协程将永远不会完成,这意味着在协程结束时发生的任何类型的退役任务将永远无法运行。
而异步函数将继续执行,即使在调用它的对象被销毁之后也是如此。同样,这既有帮助也有无帮助。
如果异步函数试图引用它自己的对象,即使它已被销毁,也会导致错误。一般情况下,这不会发生,因为脚本及其功能通常会被对象禁用。
而异步函数则不是。
事实上,即使加载了一个全新的场景,该函数仍会尝试完成。因此,如果有可能在启动异步函数后不再需要它,可能需要手动取消它。
如何取消可以参阅:Unity中异步功能如何取消?
…
以上是在Unity异步与协程的全部内容,如果你有任何反馈,请随时在本页面下方留言。