赞
踩
Unity协程的yield & C#的yield关键字
1.Unity协程:
这里说的是Unity中通过StartCoroutine开启IEnumerator协程里的yield相关:
1.yield return 0、yield return null
等待下一帧接着执行下面的内容
2.yield return new WaitForSeconds(float secs)
等待指定秒数,接着执行下面的内容
3.yield return www;
使用WWW下载,等待www下载完成以后再执行下面代码
- WWW www=new WWW("这里是地址");
- Debug.Log("1");
- yield return www; //这里等待www.isDone,也就是下载完成以后才会走后面的代码
- Debug.Log("2");
4.yield return StartCoroutine("协程方法名")
先执行协程方法,并等待,直到该协程方法执行完再执行后面的内容
5.yield break
退出协程,不执行break后面的代码
例:
- public static bool temp = true;
- private void Start()
- {
- StartCoroutine(ForExample());
- }
- public IEnumerator ForExample()
- {
- yield return "1"; // 挂起等待下一帧
- Debug.Log("hiha1");
- yield return "2"; // 挂起等待下一帧
-
- Debug.Log("hiha2");
- if (temp)
- {
- // 执行 yield break 之后不再执行下面语句
- Debug.Log("bareak");
- yield break;
- }
- // 否则,temp为 false
- yield return "3";
- Debug.Log("hiha3");
- yield return "4";
- Debug.Log("hiha4");
- }
结果:
- hiha1
- hiha2
- bareak
///
yield 是在迭代器块中用于向枚举数对象提供值或发出迭代结束信号。它的形式为下列之一:
yield return <expression>;
yield break
e.g.
- class CustomCollection : IEnumerable
- {
- static void Main()
- {
- CustomCollection cc = new CustomCollection();
- foreach (String word in cc)
- {
- Console.WriteLine("Info:" + word);
- }
- }
- public IEnumerator GetEnumerator()
- {
- yield return "T1";
- yield return "T2";
- yield return "T3";
- yield return "T4";
- }
- }
上面的例子是实现了一个自定义的迭代器;实现
可迭代(可以用foreach)的数据集合,必须
实现GetEmumerator()方法,返回实现了IEmumerator的对象实例。
1/ 一种是:上面这样用yield return. yield return 需要配合IEmumerator进行使用, 在外部foreach循环中,它会执行GetEmumerator()方法,遇到yield return, 做了如下两件事情:
1.记录下当前执行到的代码位置;
2. 将代码控制权返回到外部, yield return 后面的值, 作为迭代的当前值。
当执行下一个循环, 从刚才记录的代码位置后面, 开始继续执行代码。
简单地说, yield return 就是实现IEmumerator的超级简化版, 是不是很简单?
2/ 另一种是:实现IEmumerator版本:
- public class HelloBoyGirls : IEnumerator
- {
- private int cusor = -1;
- private String[] words = {"T1", "T2", "T3", "T4"};
-
- public bool MoveNext ()
- {
- cusor++;
- return cusor < words.Length;
- }
-
- public void Reset ()
- {
- cusor = 0;
- }
- public object Current {
- get {
- return words [cusor];
- }
- }
- }
- class CustomCollection : IEnumerable
- {
- static void Main()
- {
- CustomCollection cc = new CustomCollection();
- foreach (String word in cc)
- {
- Console.WriteLine("Info:" + word);
- }
- }
- public IEnumerator GetEnumerator()
- {
- return new HelloBoyGirls();
- }
- }
结果都是:
- Info:T1
- Info:T2
- Info:T3
- Info:T4
- public class CustomCollection : IEnumerable
- {
- public IEnumerator GetEnumerator()
- {
- yield return "T1";
- yield return "T2";
- yield return "T3";
- yield return "T4";
- Console.WriteLine("After all yield returns.");
- }
- public static void Main(string[] args)
- {
- CustomCollection cc = new CustomCollection();
-
- IEnumerator enumerator = cc.GetEnumerator();
- while (true) {
- bool canMoveNext = enumerator.MoveNext();
- Console.WriteLine("canMoveNext:" +canMoveNext);
- if (!canMoveNext)
- break;
- Object obj = enumerator.Current;
- Console.WriteLine("current obj:" +obj);
- }
- // foreach (String word in cc) {
- // Console.WriteLine ("word:" +word);
- // }
- Console.WriteLine("Main End.");
-
- }
- }
结果:
- canMoveNext:True
- current obj:Hello
- canMoveNext:True
- current obj:Boys
- canMoveNext:True
- current obj:And
- canMoveNext:True
- current obj:Girls
- After all yield returns.
- canMoveNext:False
- Main End.
说明C#里,每次调用MoveNext(),走到下一个yield处(从第一个开始,先走第一个),然后Current值就是yield return后面的值,遇到yield再停住,直到再次调用;如果没有找到下一个yield则MoveNext()返回false。
除了yield return, 还有yield break; yield break 的作用是, 停止循环, MoveNext()为false, yield break 之后的语句, 不会被执行!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。