Unity中的DeCoroutine
2016-12-28 18:51
225 查看
unity协程是一个能暂停执行,暂停后立即返回,直到中断指令完成后继续执行的函数。
它类似一个子线程单独出来处理一些问题,性能开销较小,但是他在一个MonoBehaviour提供的主线程里只能有一个处于运行状态的协程。
2.协同程序的特点
1、协程在中断指令(YieldInstruction)产生时暂停执行
2、协程一暂停执行便立即返回 //中断协程后返回主函数,暂停结束后继续执行协程剩余的函数。
3、中断指令完成后从中断指令的下一行继续执行
4、同一时刻、一个脚本实例中可以有多个暂停的协程,但只有一个运行着的协程
5、函数体全部执行完后,协程结束
6、协程可以很好的控制跨越一定帧数后执行的行为
7、协程在性能上、相比于一般函数几乎没有更多的开销
3.创建一个协程函数
123456 | IEnumerator methodName(Object parameter1,Object parameter2,...){ // to do something yield return YieldInstruction/other/null; // to do something else } |
1 2 3 4 5 | //每3秒执行一次 while(true){ //to do something yield return new WaitForSeconds(3); } |
8.例子
lg1、举例说明协同程序的执行流程
using UnityEngine;
using System.Collections;
public class SimpleCoroutine : MonoBehaviour {
/// <summary>
/// Start, 协程的执行流程
/// Start函数运行,输出“1”,然后开始协程Do;
/// Do输出“2”,然后开始协程newDo;
/// newDo输出“3”,产生中断指令后暂停,立即返回Do;
/// Do产生中断指令后暂停,Do暂停并立即返回Start函数;
/// Start执行StartCoroutine的下一条语句:输出“4”;
/// 2秒后,newDo的中断指令完成并继续执行,输出“5”,协程newDo结束;
/// Do的中断指令因为协程newDo的结束而完成并继续执行,输出“6”,协程Do结束。
/// </summary>
void Start () {
Debug.Log(“1”);
StartCoroutine(Do());
Debug.Log(“4”);
}
IEnumerator Do() {
Debug.Log(“2”);
yield return StartCoroutine(newDo());//WaitForSeconds(5);
Debug.Log(“6”);
}
IEnumerator newDo() {
Debug.Log(“3”);
yield return new WaitForSeconds(2);
Debug.Log(“5”);
}
}
//输出结果顺序是,1,2,3,4,5,6
[/csharp]
lg2、加载指令(通过WWW加载本地文件)
?
void OnGUI(){
if(GUI.Button(new Rect(200,200,150,30),”点击进入协同程序”)){
Debug.Log(“1”);
StartCoroutine(loadLocalBundle(path));
Debug.Log(“3”);
}
}
private IEnumerator loadLocalBundle(string url){
Debug.Log(“2”);
using(WWW www = new WWW(url)){
yield return www;
Debug.Log(“4”);
if(www.error != null){
var bytes = www.bytes;
}
AssetBundle ab = www.assetBundle;
GameObject gameObject = ab.mainAsset as GameObject;
Instantiate(gameObject);
Debug.Log(“5”);
Debug.Log(“load local assetBundle finished…”+gameObject);
}
}
注意:
大概执行流程,点击按钮后开始执行协同程序,WWW按照提供的url进行加载,完毕后 yield return www;中断指令跳转到主线程。
主线程继续执行其他内容,www在加载完成后跳出中断继续执行余下内容。
加载完毕,实例化加载内容。
相关文章推荐
- 【Unity 3D】学习笔记十九:实例:游戏人物移动
- [UnityShaderCookbook 读书笔记] [01] Unity Shader 基础
- Unity调用C++的Dll文件,Xcode的.a文件
- unity工程导入到iOS项目
- Unity获取未激活游戏对象的方法
- Unity开发Oculus Rift应用时,打包发布时遇到的一些坑
- 【Unity 3D】学习笔记二十三:unity游戏脚本(三)
- UNITY 5.1.2发行说明 中文版
- 【Unity技巧】Unity中的优化技术
- HTC Vive VR Unity 开发入门
- 上最全的Unity面试题(含答案)
- Unity使用GetEncoding("GB2312")问题
- Unity 2D精灵编辑器简单操作
- unity tips
- Unity中WheelCollider的Slip曲线
- UnityEditor扩展 - Vuforia license like文本输入框
- unity输入框InputField属性详情
- 1.2设计模式在Unity中应用—Behavioral Pattern— Command Pattern 命令模式
- 【Unity 3D】学习笔记二十八:unity工具类
- Unity Sprite Atlas Compression