您的位置:首页 > 移动开发 > Unity3D

Unity入门操作_协程_023

2017-08-28 21:50 387 查看
协程的出现意义:解决了使用多个计时器使程序显得复杂。

协程的作用一共有两点:

1)延时(等待)一段时间执行代码;

2)等某个操作完成之后再执行后面的代码。

简单来说,协程就是:你可以写一段顺序的代码,然后标明哪里需要暂停,然后在下一帧或者一段时间后,系统会继续执行这段代码。

Unity一个协程函数的返回值是IEnumerator,它是一个迭代器。

using UnityEngine;

using System.Collections;

public class IEnumer : MonoBehaviour {

void Start () {
StartCoroutine(Countdown());  这一行用来开始我们的Countdown程序,注意,我并没有给它传入参数,但是这个方法调用了它自己(这是通过传递Countdown的return返回值来实现的)。

StartCoroutine(Test());
}
IEnumerator Test()
{
for (float i = 0; i <3; i+=Time.deltaTime)
{
yield return 0;(类似于coutinue)
}
Debug.Log(0);
}


两个协程嵌套使用

using UnityEngine;

using System.Collections;

public class IEnumer : MonoBehaviour {

void Start () {
StartCoroutine(Test02(3));
}
IEnumerator Test01(int number)
{
int count = 0;
while (count<number)
{
count++;
yield return new WaitForSeconds(1);
Debug.Log("这是产生的第"+count+"个怪物!");
}
}
IEnumerator Test02(int number)
{
int count =0;
while (count<number)
{
count++;
yield return StartCoroutine(Test01(5));
Debug.Log("这是产生的第" + count + "波怪物!");
yield return new WaitForSeconds(5);
}
}


协程不在Update中使用,因为协程自身就有可能形成死循环

using UnityEngine;

using System.Collections;

public class IEnumer : MonoBehaviour {

void Start () {
InvokeRepeating("Test", 0, 2);
}
IEnumerator Test()
{
for (float i = 0; i <3; i+=Time.deltaTime)
{
yield return 0;(类似于coutinue)
}
Debug.Log(0);
}


我们已经学过了通过 StartCoroutine()方法来开始一个协程

如果我们想要终止所有的协程,可以通过StopAllCoroutines()方法来实现,它所要做的就跟它的名字所表达的一样。注意,这只会终止在调用该方法的对象中(是指调用这个方法的类)开始的协程,对于其他的MonoBehavior类中运行的协程不起作用。

如果我们有以下这样两条协程语句:

StartCoroutine(FirstTimer());

StartCoroutine(SecondTimer());

那我们怎么终止其中的一个协程呢?在这个例子里,这是不可能的,如果你想要终止某一个特定的协程,那么你必须得在开始协程的时候将它的方法名作为字符串,就像这样:

//If you start a Coroutine by name…

StartCoroutine(“FirstTimer”);

StartCoroutine(“SecondTimer”);

//You can stop it anytime by name!

StopCoroutine(“FirstTimer”);

抽象化一个协程的第一个方法是给它传递参数,协程作为一个函数方法来说,它自然能够传递参数。这里有一个协程的例子,它在特定的地方输出了特定的信息。

StartCoroutine(RepeatMessage(5, 1.0f,”Hello!”));

IEnumerator RepeatMessage(int count,float frequency,string message)
{
for(int i = 0; i < count; i++)
{
Debug.Log(message);
for(float timer = 0; timer < frequency; timer += Time.deltaTime)
yield return 0;
}
}


1、在程序中调用StopCoroutine()方法只能终止以字符串形式启动(开始)的协程;

2、多个协程可以同时运行,它们会根据各自的启动顺序来更新;

3、协程可以嵌套任意多层(在这个例子中我们只嵌套了一层);

4、如果你想让多个脚本访问一个协程,那么你可以定义静态的协程;

5、协程不是多线程(尽管它们看上去是这样的),它们运行在同一线程中,跟普通的脚本一样;

6、如果你的程序需要进行大量的计算,那么可以考虑在一个随时间进行的协程中处理它们;

7、IEnumerator类型的方法不能带ref或者out型的参数,但可以带被传递的引用;

8、目前在Unity中没有简便的方法来检测作用于对象的协程数量以及具体是哪些协程作用在对象上。

如果你在语句中使用 yield 关键字,则意味着它在其中出现的方法、运算符或 get 访问器是迭代器。通过使用 yield 定义迭代器

1、yield关键字用于遍历循环中

2、使用 yield return 语句可一次返回一个元素

3、yield break用于终止循环遍历

注意事项

1、foreach 循环的每次迭代都会调用迭代器方法。迭代器方法运行到 yield return 语句时,会返回一个 expression,并保留当前在代码中的位置。 当下次调用迭代器函数时执行从该位置重新启动。

2、yield语句的迭代块可以产生IEnumerator和IEnumerable两种对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: