👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:unity每日一记
⭐🅰️推荐文章⭐⭐【软件设计师高频考点暴击】
⭐【Unityc#专题篇】之c#系统化大礼包】
⭐【unity数据持久化】数据管理类_PlayerPrfs
⭐【unity本站最全系列】unity常用API大全一篇文章足以
⭐⭐
文章目录 ⭐🅰️推荐文章⭐⭐⭐🎶 Unity协程介绍和区别协程主要作用协程API相关协程的本质 ⭐🅰️系统路线学习点击跳转⭐
🎶 Unity协程
介绍和区别
Unity中的多线程
Unity支持多线程,但是操作相关对象还得在主线程中实现,要注意关闭线程最后但是可以作为复杂算法或逻辑运算计算的复线程,(线程是独立运行的管道)——专门用一个线程来做这些复杂的运算协程和多线程的区别
1.协程不是多线程,并且在继承 Mononabehavar类下使用2.多线程是和主线程区分开来的3.协程是在主线程中运行的,只是分时分布将逻辑进行处理协程主要作用
协程主要作用
1.延时调用
IEnumerator ChangeState() //协程迭代器的定义{//暂停几秒(协程挂起)yield return new WaitForSeconds(2);//暂停两秒后再切入走路的动画animator.Play("Walk");` }2.和其他逻辑一起协同执行
,比如一些很耗时的工作,在这个协程中执行异步操作,比如下载文件,加载文件,异步生成怪物等
*资源加载一般是一个比较耗时的操作,如果直接放在主线程中会导致游戏卡顿,通常会放到异步线程中去执行。
3.分布分时执行复杂算法或繁杂逻辑
比如创建随机创建一万个球不卡帧
float time = 0;IEnumerator CreatCorutine( int number){for (int i = 0; i < number; i++){GameObject ball = GameObject.CreatePrimitive(PrimitiveType.Sphere);ball.transform.position = new Vector3(Random.Range(0, 100), Random.Range(0, 100), Random.Range(0, 100));if(i % 1000 == 0){yield return new WaitForSeconds(1);} } }private void Update(){if(Input.GetKeyDown (KeyCode.Space)){StartCoroutine(CreatCorutine(10000));} }协程API相关
协程的声明
返回值为IEnumerator类型及其子类函数中通过 yield return 进行返回 // MyCoroutine为自定义协程名IEnumerator MyCoroutine(int i, string str){//分时分布执行。先打印i然后暂停1秒之后再打印3242print(i); yield return new WaitForSeconds(1f);print("3242"); }协程的开启和停止
开启 StartCoroutine(MyCoroutine(1, “123”));
关闭所有协程 StopAllCoroutines();
关闭指定协程 StopCoroutine(c1);
只有当组件失活时协程不会失活,对象失活时协程也会失活
void start(){启动方法一 String:StartCoroutine("ChangeState"); //括号内的是协程名启动方法二 函数:StartCoroutine(ChangeState());启动方法三 接口: //有参协程只能用该方法开启IEnumerator ie = ChangeState();StartCoroutine(ie);停止方法一 String:StopCoroutine("ChangeState");停止方法二 函数:StopCoroutine(ChangeState());停止方法三 接口: StopCoroutine(ie);停止方法四 协程: Coroutine c1 = StartCoroutine( ChangeState());StopCoroutine(c1);停止所有协程:StopAllCoroutines();}-------------协程中的 yield------------//1.下一帧执行yield return 数字;yield return null;//在Update和LateUpdate之间执行//表示在本帧帧末执行以下逻辑yield return new WaitForEndOfFrame();//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;👨💻👍4.协程中的协程和有参协程
StartCoroutine("CreateBoss"); //启动协程//协程1 功能实时实例化游戏物体 IEnumerator CreateBoss() {StartCoroutine(SetCreateCount(5));while (true) //功能实时实例化游戏物体{if (BossNum>=BossCount){yield break; //在协程中break前面要加 yield}Instantiate(animator.gameObject);BossNum++;yield return new WaitForSeconds(2);}}//协程2 功能实时实例化游戏物体 IEnumerator SetCreateCount(int num) {BossCount =num;yield return null; //暂停一帧---------------------此时如果这里只是暂停一帧的话,那么上面调该有参协程的协程体中,后面的语句并未生效,因为暂停一帧后,后面的方法已经执行了,所以此时的BossCount并不等于有参传递的5(当然BossCount是全局变量)---------------------} --- 协程的本质
协程的本质
1.本体为迭代器2.协程调度器(可自己实现) //Ieunmrator接口中的两个成员:MoveNext_移动下一个 Current——当前返回值while(ie.MoveNext()){print(ie.Current);}⭐🅰️系统路线学习点击跳转⭐
⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、