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 返回的内容 决定了下一次在何时继续执行迭代器函数中的"下一部分