Unity 协程 Unity Task UniTask

协程

使用 StartCoroutine 和 IEnumerator
yield return null 暂停执行并随后在下一帧恢复
yield return new WaitForSeconds(1f); 延迟1秒
waitfor系列有好几个
Unity 协程 Unity Task UniTask_第1张图片
WaitForSeconds 和 WaitForSecondsRealtime 的区别

使用缩放时间将协程执行暂停指定的秒数。

实际暂停时间等于给定时间除以 Time.timeScale。如果要使用未缩放时间进行等待,请参阅 WaitForSecondsRealtime。在协程中,WaitForSeconds 只能与 yield 语句结合使用。

有一些因素可能意味着实际等待的时间量与指定的时间量不完全一致。
1 在当前帧的 end 处开始等待。如果您在一个非常长的帧(例如,具有同步加载等阻止主线程的长时间操作的帧)上使用持续时间“t”启动 WaitForSeconds,协程将在帧结束后返回“t”秒,而不是取消后“t”秒。
2 允许协程在“t”秒后继续在第一帧上执行,不是确切的“t”秒之后。

WaitForEndOfFrame
等待,直到该帧结束,在 Unity 渲染每一个摄像机和 GUI 之后,在屏幕上显示该帧之前。

可以用它将显示内容读取到纹理中,将其编码为图像文件(请参阅 Texture2D.ReadPixels 和 Texture2D.Texture2D),并将其存储在设备上。
从 Game 视图切换到 Scene 视图将导致 WaitForEndOfFrame 冻结。它只在应用程序切换回 Game 视图时才会继续。只有当应用程序在 Unity 编辑器中运行时才会发生这种情况。

注意:在批处理模式下,不会在编辑器上调用此协程。如需了解更多详细信息,请参阅手册中的命令行参数页面。

WaitWhile 直到提供的委托评估为 false
WaitUntil 直到提供的委托评估为 true

注意:可以使用 StopCoroutine 和 StopAllCoroutines 来停止协程。 当用 SetActive(false) 禁用某个协程所附加到的游戏对象时,该协程也将停止。调用 Destroy(example)(其中 example 是一个 MonoBehaviour 实例)会立即触发 OnDisable,并会处理协程,从而有效地停止协程。最后,在帧的末尾调用 OnDestroy。

通过在 MonoBehaviour 实例上将 enabled 设置为 false 来禁用 MonoBehaviour 时,协程不会停止。

协程的缺点就是
他必须依赖 Monobehavior

Unity Task

相比 协程 Unity 的 Task 更加灵活

看例子

void Start()
{ 
     Debug.Log("1 : " + Thread.CurrentThread.ManagedThreadId);
     this.aaa();
     Debug.Log("2 : " + Thread.CurrentThread.ManagedThreadId);
}

async void aaa()
{
    Debug.Log("3 : " + Thread.CurrentThread.ManagedThreadId);
    await Task.Run(() =>
    {
        Debug.Log("5 : " + Thread.CurrentThread.ManagedThreadId);
        Thread.Sleep(3000);
        Debug.Log("6 : " + Thread.CurrentThread.ManagedThreadId);
    });
    Debug.Log("4 : " + Thread.CurrentThread.ManagedThreadId);
}

你会发现 Task.Run 里面的内容是单独id 也就是 5 和 6
其他所有的都是主线程id

你可能感兴趣的:(unity,游戏引擎)