侧边栏壁纸
博主头像
憨憨大头个人博客博主等级

心存希冀,目有繁星

  • 累计撰写 110 篇文章
  • 累计创建 13 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Unity的协程详解

Administrator
2024-09-02 / 0 评论 / 0 点赞 / 14 阅读 / 3496 字

协程(coroutine)是一种用户态线程,与传统线程相比,协程是非抢占式的,可以由程序员控制线程的切换,因此可以在一个线程中执行多个任务,避免了线程的频繁切换和上下文切换的开销。

在协程内部,会维护一个相对独立的执行栈和寄存器上下文,每个协程可以有自己的状态,当协程执行遇到阻塞或者需要等待IO操作的时候,可以主动让出CPU,暂停自身,并根据需要恢复其他协程的执行。协程最常用的操作是yield,用于暂停当前协程的执行,并将控制权交给上层调用者,也可以将数据返回给调用者。另外一个常用的操作是send,用于恢复某个协程的执行,并传递数据给协程,以便协程根据数据继续执行。

Unity中的协程由协程函数和协程调度器两部分构成.协程函数使用的是C#的迭代器, 协程调度器则利用了MonoBehaviour中的生命周期函数来实现. 协程函数实现了分步, 协程调度器实现了分时.

Unity规定的协程返回值的含义

含义代码
下一帧再执行后续代码yield return null; yield retun x(x代表任意数字)
结束该协程yield break;
等待固定时间执行后续代码yield return new WaitForSeconds(0.3f);
yield return new WaitForSecondsRealtime(0.3f); //不受timescale影响
函数执行完毕后执行后续代码yield return FunctionName();
异步执行完毕后执行后续代码yield return AsyncOperation;
协程执行完毕后执行后续代码yield return Coroutine;
帧渲染完成后执行后续代码yield return new WaitForEndOfFrame();
物理帧更新后执行后续代码yield return new WaitForFixedUpdate();
参数为true时执行后续代码yield return new WaitUntil(arg);
参数为false时执行后续代码yield return new WaitWhile(arg);

注: 为了优化性能,yield return 后面需要new的返回值应该预先创建, 而不是在协程函数中反复创建.

示例

Unity中的协程方法通过yield这个特殊的属性可以在任何位置、任意时刻暂停。也可以在指定的时间或事件后继续执行,而不影响上一次执行的就结果,提供了极大地便利性和实用性。
协程在每次执行时都会新建一个(伪)新线程来执行,而不会影响主线程的执行情况。

void Fade() 
{
    for (float f = 1f; f >= 0; f -= 0.1f) 
    {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield return null;//下一帧继续执行for循环
        yield return new WaitForSeconds(0.1f);//0.1秒后继续执行for循环
    }
}

协程生命周期

img

0

评论区