上海古都建筑设计集团,上海办公室装修设计公司,上海装修公司高质量的内容分享社区,上海装修公司我们不是内容生产者,我们只是上海办公室装修设计公司内容的搬运工平台

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

guduadmin663月前

【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里,在这里插入图片描述,第1张


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

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:unity每日一记

🅰️推荐文章


⭐【软件设计师高频考点暴击】

⭐【Unityc#专题篇】之c#系统化大礼包】

⭐【unity数据持久化】数据管理类_PlayerPrfs

⭐【unity本站最全系列】unity常用API大全一篇文章足以

【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里,在这里插入图片描述,第2张



文章目录

    • 🅰️推荐文章
    • 🎶 Unity协程
      • 介绍和区别
      • 协程主要作用
      • 协程API相关
      • 协程的本质
      • 🅰️系统路线学习点击跳转

        【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里,在这里插入图片描述,第3张


        🎶 Unity协程


        介绍和区别


        Unity中的多线程

        • Unity支持多线程,但是操作相关对象还得在主线程中实现,要注意关闭线程最后
        • 但是可以作为复杂算法或逻辑运算计算的复线程,(线程是独立运行的管道)——专门用一个线程来做这些复杂的运算

          协程和多线程的区别

          • 1.协程不是多线程,并且在继承 Mononabehavar类下使用
          • 2.多线程是和主线程区分开来的
          • 3.协程是在主线程中运行的,只是分时分布将逻辑进行处理

            协程主要作用


            协程主要作用


            1.延时调用

             IEnumerator ChangeState()  //协程迭代器的定义
                {
                    //暂停几秒(协程挂起)
                    yield return new WaitForSeconds(2);
                    //暂停两秒后再切入走路的动画
                    animator.Play("Walk");`    
               }
            

            2.和其他逻辑一起协同执行

            ,比如一些很耗时的工作,在这个协程中执行异步操作,比如下载文件,加载文件,异步生成怪物等

            *资源加载一般是一个比较耗时的操作,如果直接放在主线程中会导致游戏卡顿,通常会放到异步线程中去执行。

            【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里,在这里插入图片描述,第4张

            3.分布分时执行复杂算法或繁杂逻辑

            比如创建随机创建一万个球不卡帧

            【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里,在这里插入图片描述,第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秒之后再打印3242
                      print(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每日一记】“调皮的协程”,协程和多线程的区别在哪里,在这里插入图片描述,第2张


网友评论

搜索
最新文章
热门文章
热门标签
 
 梦见钓鱼钓到乌龟  梦到牙齿掉了好几颗  掏粪工