对于协程的理解,我认为最好的说法是:
一段顺序的代码,然后标明哪里需要暂停,然后在下一帧或者一段时间后或者某个函数或协程执行完成之后,系统会继续执行后面代码。协程不是线程,也不是异步执行的。
这就说明它的两个作用,定时,迭代(与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每帧对会去处理的函数。
271

被折叠的 条评论
为什么被折叠?



