Unity 绑定(订阅)事件方式

协程 - Unity 手册 (unity3d.com)

协程就是一种特殊的函数,它可以主动的请求暂停自身并提交一个唤醒条件,Unity会在唤醒条件满足的时候去重新唤醒协程。
当开始一个协程后,当前线程会先完成协程(或协程主动跳出),然后回到主线程。

协程 多线程
切换时机 自定 CPU时间片为单位的系统调度
CUP核心 与主线程在同一核心 根据操作系统调度不同
对主线程的影响 卡顿会影响主线程 卡死都不影响主线程
线程同步影响 不存在线程同步问题 需要注意线程同步问题
线程开销 不存在线程开销 存在线程创建、销毁、切换的开销
书写方式 与普通函数一致 回调函数
yield语句 功能
yield return null; 下一帧再执行后续代码
yield return 0; 下一帧再执行后续代码
yield return 6(任意数字); 下一帧再执行后续代码
yield break; 直接结束该协程的后续操作
yield return asyncOperation; 等异步操作结束后再执行后续代码
yield return StartCoroution(其他协程); 调用其他协程后再执行后续代码
yield return WWW(); 等待WWW操作完成后再执行后续代码
yield return new WaitForEndOfFrame(); 等待帧结束,等待所有摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
yield return new WaitForSeconds(0.3f); 等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.TimeScale的影响)
yield return new WaitForSecondsRealtime(0.3f); 等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.TimeScale的影响)
yield return WaitForFixedUpdate 等待下一次FixedUpdate开始时再执行后续代码
yield return new WaitUntil(); 将协同程序执行直到当输入的参数(或者委托)为true的时候
yield return new WaitWhile(); 将协同程序执行直到当输入的参数(或者委托)为false的时候
当某一个脚本中的协程在执行过程中,如果我们将该脚本的enable设置为false,协程不会停止(因为它是基于C#中的IEnumerator)。只有将挂载该脚本的物体设置为SetActive(false)时才会停止。

Unity在调用StartCoroutine()后不会等待协程中的内容返回,会立即执行后续代码。

1
2
3
4
5
6
7
8
9
10
11
IEnumerator CaculateResult()
{
for (int i = 0; i < 10000; i++)
{
//内部循环计算
//在这里的yield会让改内部循环计算每帧执行一次,而不会等待10000次循环结束后再跳出
yield return null;
}
//如果取消内部的yield操作,仅在for循环外边写yield操作,则会执行完10000次循环后再结束,相当于直接调用了一个函数,而非协程。
yield return null;
}
1
2
3
4
5
6
7
8
9
10
11
12
 IEnumerator UpdateTick()
    {
        while (true)
        {
            if (GameRuning)
            {
                AddTick();
                yield return null; //在这里的yield操作会使内部循环每帧执行一次,而不会等待循环完成后再跳出
            }
        }
        //yield return null; //会等待while(true)循环执行完后再结束,相当于直接调用了一个函数而非协程
    }

Unity 绑定(订阅)事件方式
https://newztx.github.io/2024/07/24/Unity Coroutine协程/
作者
Cranky Dove
发布于
2024年7月24日
许可协议