Unity协程以及迭代器
来源:互联网 发布:科技美学知乎 编辑:程序博客网 时间:2024/06/07 01:54
早在写cocos-lua时就说要认真研究一下协程,然而…
参考
twisted oak
Edison
丘丘雷雷的博客
王选易
中辽普坦的专栏
IEnumerable
namespace System.Collection{public interface IEnumerable{ IEnumerator GetEnumerator();}}
任何继承了IEnumerable接口的都可以通过foreach来遍历。
IEnumerator
namespace System.Collection{public interface IEnumerator{ bool MoveNext(); object Current(get;); void Reset();}}
.net官方关于IEnmerator的例子
public class PeopleEnum : IEnumerator{ public Person[] _people; int position = -1; public PeopleEnum(Person[] list){ _people = list; } public bool MoveNext(){ position++; return (position < _people.Length); } object IEnumerator.Current{ get{return Current} } public Person Current{ get{ try{ return _people[position]; }catch(IndexOutOfRangeException ){ throw new InvalidOperationException(); } } }}
Time slicing
不管什么时候,如果你想创建一个能够经历多个逻辑帧的流程,但是不适用多线程或多进程,那你就需要把一个任务来分割成多个任务,然后在下一帧继续执行这个任务。
斐波拉切
首先来一个经典的斐波拉切实现
[1,1,2,3,5,8…]
IEnumerator Fibonacci(){ int Fkm2 = 1; int Fkm1 = 1; yield return 1; yield return 1; while(Fkm1 + Fkm2 < int.MaxValue){ int Fk = Fk2 + Fk1; Fk2 = Fk1; Fk1 = Fk; yield return Fk; }}void Start(){ IEnumerator fib = Fibonacci(); for(i = 0 ; i < 10 ;i ++){ if(!fib.MoveNext()){ break; } Debug.Log((int)fib.Current); }}
Unity协程
StartCoroutine
开启一个协程。协程的调用几乎没有任何性能开销,StartCoroutine一般都会以及返回,然而你也可以获得返回结果的值。但会等到协程结束才能生效。
StartCoroutine()生成一个Coroutine实例,第一次运行IEnumerator然后返回一个yielded值。
游戏逻辑在没帧执行。例如Update会在每帧调用,unity会在没帧调用保存的Coroutines并且处理IEnumerators返回的值。
yield return
本质和return作用一样,将当前函数返回,只不过下次再调用这个函数是,会从yield return的下一句开始执行,函数本身的变量也都会一直保存上一次调用的状态,知道最后一次return,协程的状态才会被清除。
一个协程可以在任何地方用yield暂停,yield return的值决定了什么时候恢复协程。
YieldInstruction
Yield return可以发挥任意YieldInstruction
- yield return null;暂停协同程序,下一帧再继续执行
- yield new WaitForFixedUpdate();暂停协同程序,等到下一次调用FixedUpdate方法时再继续往下执行
- yield return new WatiForSeconds(2);暂停协同程序,2秒后再继续往下执行
- yield return StartCoroutine(“SomeCortoutineMethod”)暂停此协同程序,开启SomeCortoutineMethod协同程序
- yield return WWW
C#
IEnumerator Start(string url){
WWW www = new WWW(url);
yield return www;
...
}
YieldInstruction y;if(something){ y = null;}else if(something){ y = new WatiForEndOfFrame();}else{ y = new WaitForSeconds(1.0f);}yield return y;
协程嵌套
IEnumerator UntilTrueCoroutine(Func fn){ while(!fn()) yield return null; }Coroutine UntilTrue(Func fn){ return StartCoroutine(UntilTrueCoroutine(fn));}IEnumerator SomeTask(){ yield return UntilTrue(() => _lives < 3); }
0 0
- Unity协程以及迭代器
- unity执行顺序以及unity协程的使用
- Unity协程介绍以及使用
- Unity webGL以及HTML与unity通信
- Unity webGL以及HTML与unity通信
- unity之协程
- Unity 协程使用指南
- Unity内置协程
- Unity协程认知
- Unity协程函数
- unity 协程笔记
- Unity协程封装
- Shader以及Unity中的Shader
- unity AssetBundle打包以及加载
- Unity资源加载以及释放
- Unity - coroutines 协程揭秘
- Unity 协程使用(嵌套)
- Unity 协程嵌套测试
- River Hopscotch poj3258 (二分+贪心思想+最小值最大化)
- 《Head First 设计模式》-抽象工厂模式C++实现
- zookeer
- windows 下redis在后台运行
- 方法记
- Unity协程以及迭代器
- 魔方第三层
- Android 圆形头像
- mybatis的增删改查
- 【OpenCV学习笔记系列01-OpenCV2.4.6 + VS2010开发环境配置】
- NotePad++ 切换主题和背景
- 设计模式总结
- 排序算法之快速排序java实现
- shell 判断postgresql中用户是否存在?