Unity StartCoroutine 协同程序
来源:互联网 发布:淘宝网打不开 编辑:程序博客网 时间:2024/06/13 09:39
协程是轻量级线程,开启协程不等同于开启线程,即不是开启一个新的流水线。通俗点讲,对于一堆任务,通过一个线程轮着对其中每个任务都执行一下。它的厉害之处在于,每运行到一个任务的时候,它都可以从这个任务上一次中断的地方开始运行。这种工作机制类似于操作系统的线程调度。
一、Unity 的 Coroutine 执行顺序
StartCoroutine 函数用于开始一个协同程序,但不是另外开启一个线程,协同程序与 StartCoroutine 函数在同一个线程之内;但是协同程序可以实现“线程切换”的效果,通过 yield 关键字,可以实现在某个事件发生时,线程的控制权回到协同程序。一个协同程序在执行过程中,会在使用了 yield 语句的位置暂停。yield 的返回值控制何时恢复协同程序向下执行。
StartCoroutine 函数在启动协同程序之后,将线程控制权转交给协同程序,协同程序在运行到 yield 语句处(会执行 yield 后的语句),交出控制权给外部线程并等待事件发生,当事件发生时,线程控制权再交回给协同程序。
示例 1:
void Start(){ print("Starting " +Time.time);----------------------------------------1 StartCoroutine(WaitAndPrint(2));-------------------------------------2 print("Done " +Time.time);-------------------------------------------3}IEnumerator WaitAndPrint(float waitTime){ yield return new WaitForSeconds(waitTime);------------------------4 print("WaitAndPrint " + Time.time);----------------------------------5}
代码的执行顺序是:12435
执行到 4 时,协程注册事件,控制权交出给外部线程;外部线程执行3;当协程注册的事件发生时,控制权将由外部线程回到协程,从上一次执行处继续执行。
示例 2:
IEnumerator Start(){ print("Starting " +Time.time);----------------------------------------1 yield return StartCoroutine(WaitAndPrint(2.0F));------------------------2 print("Done " +Time.time);------------------------------------------3}IEnumerator WaitAndPrint(float waitTime){ yield return new WaitForSeconds(waitTime);----------------------------4 print("WaitAndPrint " + Time.time);-----------------------------------------5}
代码的执行顺序是:12453
程序执行到 4,执行 yield return 表达式注册事件,将控制权交出给外部线程,而此时外部线程也要交出控制权,并且执行 yield return 后面的表达式语句,因此会重入 WaitAndPrint 函数,于是接着上次执行位置往下执行,执行语句 5,此时因为 WaitAndPrint 执行完毕,于是将控制权完全交出;之后才执行 3。其中的根本原因是,yield return 不能直接嵌套,后面需要跟一个表达式(事件)。
1.1 unity 中的 yield
yield 后面可以跟的表达式有:
return null
下个 Update 之后恢复
return new WaitForEndOfFrame
下个 OnGUI 之后恢复
return new WaitForFixedUpdate()
下个 FixedUpdate 之后恢复,有可能一帧内多次执行
return new WaitForSeconds(2)
2秒后,等下个Update之后恢复。WaitForSeconds 受 Time.timeScale 影响,当Time.timeScale = 0f 时,yield return new WaitForSecond(x) 将不会恢复
return new WWW(url)
Web请求完成了,Update之后恢复
return StartCorourtine()
新的协成完成了,Update之后恢复
break
退出协程
return Application.LoadLevelAsync(levelName)
load level 完成后恢复,用于异步加载场景
return Resources.UnloadUnusedAssets()
unload 完成后恢复
1.2 规则
返回值必须是 IEnumerator
参数不能加 ref 或 out
函数 Update 和 FixedUpdate 中不能使用 yield 语句,但可以启动协程
yield return 语句不能位于 try-catch 语句块中
yield return 不能放在匿名方法中
yield return 不能放在unsafe语句块中
- Unity StartCoroutine 协同程序
- Unity项目-了解协同StartCoroutine(1)
- Unity项目-了解协同StartCoroutine(2)
- unity StartCoroutine
- unity协同程序
- unity IEnumerator 协同程序
- Unity Coroutine协同程序
- Unity协同程序
- unity之协同程序
- Unity中的协同程序
- Unity-协同程序
- Unity StartCoroutine 和 yield return
- unity 协同程序有多线程效果
- 关于Unity协同程序的全面解析
- Unity协同程序(Coroutine)的解析
- unity场景加载,及协同程序
- unity中开启和关闭协同程序
- unity学习日记:关于协同程序Coroutine
- 浅析C语言的非局部跳转:setjmp和longjmp
- android7.x Launcher3源码解析(1)---启动流程
- RxJava之二——Single和Subject
- QT模态对话框与非模态对话框
- 方格取数 多线程动态规划
- Unity StartCoroutine 协同程序
- 实现底部导航栏中间凸起,(点击中间凸出按钮弹出菜单)
- 计蒜客 -- 求平方根
- MTCNN训练整理
- Windows+Eclipse+Maven+HBase 1.2.4开发环境搭建
- java异常总结
- VueJs探索之watch用法详解
- 18.SoC时钟系统概述及初始化
- spring 无状态 bean