协程
Contents
协同程序
- Unity是支持多线程的 但是新开的线程无法访问Unity相关对象的内容
- Unity中新开的线程要记得关闭
public void Test(){
Debug.log(transform.position);//报错不可以使用
}
Thread t = new Thread(Test);
t.Start();- 携程不是多线程
- 他将代码分时执行 不卡主线程
- 一般用于一些异步操作
携程的使用
- 继承Mono的类 都可以开启携程
- 协程返回 IEnumerator类型 及其子类
- 函数中通过 yield return 返回值 进行返回
IEnumerator MyCoroutine(int i,string str){
print(i);
yield return new WaitForSeconds(5f);//五秒钟后 执行
print(str);
}开启携程
StartCoroutine(MyCoroutine(123,"123"));关闭携程
//关闭所有携程
StopAllCoroutines();
//关闭指定携程
Coroutine c1 = StartCoroutine(MyCoroutine(123,"123"));
StopAllCoroutines(c1);
//也可以传入字符串 不推荐
StopAllCoroutines("MyCoroutine");携程的返回值
yield return null; // 下一帧再执行后续代码
yield return 6;//(任意数字) 下一帧再执行后续代码
yield break; //直接结束该协程的后续操作
yield return asyncOperation;//等异步操作结束后再执行后续代码
yield return StartCoroution(/*某个协程*/);//等待某个协程执行完毕后再执行后续代码
yield return WWW();//等待WWW操作完成后再执行后续代码
yield return new WaitForEndOfFrame();//等待帧结束,等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前执行
yield return new WaitForSeconds(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间会受到Time.timeScale的影响);
yield return new WaitForSecondsRealtime(0.3f);//等待0.3秒,一段指定的时间延迟之后继续执行,在所有的Update函数完成调用的那一帧之后(这里的时间不受到Time.timeScale的影响);
yield return WaitForFixedUpdate();//等待下一次FixedUpdate开始时再执行后续代码
yield return new WaitUntil()//将协同执行直到 当输入的参数(或者委托)为true的时候....如:yield return new WaitUntil(() => frame >= 10);
yield return new WaitWhile()//将协同执行直到 当输入的参数(或者委托)为false的时候.... 如:yield return new WaitWhile(() => frame < 10);携程受对象和组件失活的影响
- 携程开启后 组件和物体销毁 携程不执行
- 物体失活携程不执行 组件失活 携程执行
携程的本质
- 携程的本质是一个C#的迭代器方法
- 携程的本体就是一个能够中间暂停返回的函数
//1.协程函数本体
//如果我们不通过 开启协程方法执行协程
//Unity的协程调度器是不会帮助我们管理协程函数的
IEnumerator ie = Test();
//但是我们可以自己执行迭代器函数内容
ie.MoveNext();//会执行函数中内容遇到 yield return为止的逻辑
print(ie.Current);//得到 yield return 返回的内容- 协程调度器 相当于是把一个协程函数(迭代器)放入Unity的协程调度器中帮助我们管理进行执行
- 根据yield return 返回的内容 决定了下一次在何时继续执行迭代器函数中的"下一部分