赞
踩
我们知道协成只能返回IEnumerator类型,但是委托可以预先设置好后续的事情
- //通过协成读取文件的内容
- public IEnumerator ReadFile(string path, Action<string> action)
- {
- WWW www = new WWW(path);
- yield return www;
- string data = www.text;
- action(data);
- }
-
- void Start()
- {
- StartCoroutine(ReadFile("www.csdn.net",
- _ =>
- {
- Debug.Log(_);
- }));
- }
- 输出:
- //<!DOCTYPE html>
- //<html>
- //<head>
- // <meta charset="utf-8">
- //......
yield return null; //等1帧执行.暂停协同程序,下一帧再继续往下执行. 通知协程管理器,我到这个点要中断一下,下一帧从这个地方运行而已.
yield return 0; //同yield return null;,数字改多大没用,都是等一帧
yield return 666; //同yield return null;,数字改多大没用,都是等一帧
yield break; //不在执行下面的语句,直接rerun
yield return asynaOperation; //等待异步操作执行完毕后执行
yield return StartCoroutine(coroutine); //等待子协程执行完毕后再执行
yield return WWW(); 在WWW下载完成之后……waits for a web request to complete (resumes as if WaitForSeconds or null)
yield return new WaitForEndOfFrame(); //等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前。用在while循环里减少死机
yield return new WaitForSeconds(0.3f);//等待0.3秒 , 一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后注意:受Time.timeScale影响,当Time.timeScale = 0f 时,yield return new WaitForSecond(x) 将不会满足。
yield return new WaitForFixedUpdate(); // 所有脚本上的FixedUpdate函数已经执行调用之后持续
yield return new WaitUntil:将协同执行直到 当输入的参数(或者委托)为true的时候…… || yield return new WaitUntil(() => frame >= 10);
yield return new WaitWhile:将协同执行直到 当输入的参数(或者委托)为false的时候…… || yield return new WaitWhile(() => frame < 10);
协程其实就是一个IEnumerator(迭代器),IEnumerator 接口有两个方法 Current 和 MoveNext() ,只有当MoveNext()返回 true时才可以访问 Current,否则会报错。迭代器方法运行到 yield return 语句时,会返回一个expression表达式并保留当前在代码中的位置。 当下次调用迭代器函数时执行从该位置重新启动。
Unity在每帧做的工作就是:调用 协程(迭代器)MoveNext() 方法,如果返回 true ,就从当前位置继续往下执行。
yield return 被会“翻译”为一个 IEnmerator 对象,这个对象实现的 MoveNext() 包含函数内所有 yield return 的处理
函数内有多少个 yield return 在对应的 MoveNext() 就会返回多少次 true (不包含嵌套)。
另外非常重要的一点的是:同一个函数内的其他代码(不是 yield return 语句)会被移到 MoveNext 中去,也就是说,每次 MoveNext 都会顺带执行同一个函数中 yield return 之前,之后 和两个 yield return 之间的代码。
每次 执行协程 时,都会新建一个新(伪)线程去执行,第二次执行不会影响上一次的执行,
结论是:协程适用于同一时间只运行一份函数的情况,如果同一时间运行多份同一个协程就会难以管理
协程不是线程,也不是异步执行的,是Unity每帧LateUpdate()之后都会去处理的函数
1 如果 [gameObject激活] 并且 [脚本.enable=true ] 状态 下, StartCoroutine启动了协程 ,协程会立即运行到第一个 yield return 语句处,控制权交给外部
2. 等待Unity在下一帧(Frame)LateUpdate()之后
3.检查协程是否允许的条件 :
脚本.enabled = false 协程会照常运行
a.检测 gameObject 是否处于激活(active) ,不激活不运行
b.检测 yield return 后面的表达式,如果满足就继续向下执行
MonoBehaviour.enabled = false 协程会照常运行,gameObject.SetActive(false) 停止,即使在Inspector把 gameObject 激活还是没有继续执行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。