unity协程与迭代原理

    对于协程的理解,我认为最好的说法是:

    一段顺序的代码,然后标明哪里需要暂停,然后在下一帧或者一段时间后或者某个函数或协程执行完成之后,系统会继续执行后面代码。协程不是线程,也不是异步执行的。

这就说明它的两个作用,定时,迭代(与for,foreach一起用)  

举个例子,

 void Start()
        {
            StartCoroutine(Move());
        }

StartCoroutine()就是开启一个协程,在Start()里调用,说明只在初始化的时候执行一次。

IEnumerator Move() {
       yield return null;
       yield return null;
       yield return StartCoroutine(Just1());
       yield return StartCoroutine(Just2());
       StartCoroutine(Jisuan());
      yield return null;
}

    yield作为其中最重要的,一个协程返回最少一个yield,可以有多个,上面return null,或者return 0, 1,2等等,表示暂缓一帧,数字没有意义,都只是暂缓一帧;yield return new WaitForSeconds (2)表示暂缓2秒;break表示退出协程,还有很多就不列举了。

while(true){

Debug.log(“hello”);

yield return null;

}
上面是个无限循环,加上yield return null 的作用显而易见,每帧执行一次,防止卡死,如果是下面的话
for(i=0;i<10;i++){
 Debug.Log("hello")
yieid return null;
}

这就是有限次循环,多用于游戏加载资源,倒计时等场景下。

协程其实就是一个IEnumerator(迭代器),IEnumerator 接口有两个方法 Current 和 MoveNext() ,只有当MoveNext()返回 true时才可以访问 Current,否则会报错。

Unity在每帧做的工作就是:调用 协程(迭代器)MoveNext() 方法,如果返回 true ,就从当前位置继续往下执行。协程跟Update()其实一样的,都是Unity每帧对会去处理的函数。





你可能感兴趣的:(unity)