原文来自博客园http://www.cnblogs.com/xpvincent/archive/2013/07/25/3214388.html
还有网易博客http://wg2009perfect.blog.163.com/blog/static/127997663201211111222126
【协同程序】
协同程序——在主程序运行的同时开启另一就是段逻辑处理,来协同当前程序的执行,开启协同程序就是开启一个线程。
【开启协同程序】
使用MonoBehavior.StartCoroutine可以开启一个协同程序,所以该方法需要在继承Monobehaviour的类中调用
Unity3D中,使用StartCoroutine(String methodName)和startCoroutine(IEnumerator routine)都可以开启一个线程,
a. 使用字符串作为参数可以开启线程并在线程结束之前终止线程,开启线程最多只能传递一个参数
b. 使用IEnumeraotor开启的的线程不能随时终止(除非使用StopAllCoroutines()方法)
没有参数个数的限制
【终止协同程序】
a. Unity使用StopCoroutine(String methodName)来终止一个协同程序,使用StopAllCoroutine来终止所有协同程序,但是这两个方法都只能终止该MonoBehaviour中的协同程序
b. 将协同程序所在的gameObject的acitve属性设置为false,当再次设置active为true的时候,协同程序不会再开启,而设置enable和false则不会生效,因为协同程序开启后是以一个线程在运行的,它与MonoBehavior是互不干扰的模式在运行,此后除非代码调用,他们共同作用于同一个对象,只有当对象不可见的时候才能够同时终止这两个线程。
【基本的yield和StartCoroutine讲解】
写游戏代码,往往最终需要代码为连续的事件.结果会像这样:
[它可以实现将一段程序延迟执行或者将其各个部分分布在一个时间段内连续执行。]
1: <span style="font-size:18px;">private int state = 0;
2: void Update()
3: {
4: if (state == 0)
5: {
6: //做步骤0
7: state = 1;
8: return;
9: }
10: if (state == 1)
11: {
12: // 做步骤1
13: state = 2;
14: return;
15: }
16: // ...
17: } </span>
往往使用yield语句更为方便.yield语句是一个特殊的返回类型,它确保函数从yield语句的下一行继续执行.
1: <span style="font-size:18px;">while(true) {
2: // 做步骤0
3: yield return 0;
4: // 等待一帧
5: // 做步骤1
6: yield return 2;
7: // 等待两帧
8: // ...
9: } </span>
1: <span style="font-size:18px;"> // do something
2: yield return WaitForSeconds (5.0);
3: //等待5秒
4: // do something more... </span>
这个例子将执行Do,但是do函数之后的print指令会立刻执行.
1: <span style="f