【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里

编程入门 行业动态 更新时间:2024-10-14 20:24:06

【Unity每日一记】“调皮的协程”,协程和<a href=https://www.elefans.com/category/jswz/34/1767532.html style=多线程的区别在哪里"/>

【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 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#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!



更多推荐

【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里

本文发布于:2023-11-15 04:17:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1593510.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:多线程   调皮   区别   Unity

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!