1.协同程序和线程的区别
首先需要弄明白协程和线程的区别 因为两个从字面意思上比较相像 但其实本质上是完全不同的
协程又称之为协同程序 它本质上是"假" 的多线程,不是多线程
它的主要作用是:将代码分时分步的执行,不卡主线程
新开一个线程是独立的一个管道,和主线程并行执行
新开一个协程是在原线程之上开启,进行逻辑分时分步执行
比如我们在代码中需要创建十万个Cube,这个操作必定是费时的,当在游戏中执行到这一步时,游戏必定会因为创建这个十万个Cube需要等待,带来的体验直接就是卡顿,所以通过协程可以解决这个问题,我们不需要让代码一次性生成十万个Cube,可以逐帧生成或者逐秒生成,在这一帧生成一批,下一帧再生成一批,虽然十万个Cube到最后是一定会生成的,只是采取两种不同的方式,带量的体验是截然不同的,这就是协程的好处之一
2.使用协程
继承MonoBehavior的类 都可以开启 协程函数
声明协程的两个关键点
一个是IEnumerator类型和子类
函数中通过 yield return 返回值; 进行返回
StartCoroutine() 开启协程
传入对象或协程函数的字符串都可以
StopAllCoroutines(); //关闭所有协程
StopCoroutine(c1);//关闭指定协程 通过返回的类对象来准确的关闭具体哪一步的协程
3.yield return 不同内容的含义
//1.下一帧执行
//yield return 数字;
//yield return null;
//在Update和LateUpdate之间执行
//2.等待指定秒后执行
//yield return new WaitForSeconds(秒);
//在Update和LateUpdate之间执行
//3.等待下一个固定物理帧更新时执行
//yield return new WaitForFixedUpdate();
//在FixedUpdate和碰撞检测相关函数之后执行
//4.等待摄像机和GUI渲染完成后执行
//yield return new WaitForEndOfFrame();
//在LateUpdate之后的渲染相关处理完毕后之后
//5.一些特殊类型的对象 比如异步加载相关函数返回的对象
//之后讲解 异步加载资源 异步加载场景 网络加载时再讲解
//一般在Update和LateUpdate之间执行
//6.跳出协程
//yield break;
//协程开启后
//组件和物体销毁,协程不执行
//物体失活协程不执行,组件失活协程执行