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

这篇具有很好参考价值的文章主要介绍了【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里,# Unity精华一记,unity,游戏引擎


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

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

👨‍💻 本文由 秩沅 原创

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

⭐🅰️推荐文章⭐


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

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

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

⭐【unity本站最全系列】unity常用API大全一篇文章足以
【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里,# Unity精华一记,unity,游戏引擎


⭐⭐



【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里,# Unity精华一记,unity,游戏引擎


🎶 Unity协程


介绍和区别


Unity中的多线程

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

协程和多线程的区别

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

协程主要作用


协程主要作用


1.延时调用

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

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

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

*资源加载一般是一个比较耗时的操作,如果直接放在主线程中会导致游戏卡顿,通常会放到异步线程中去执行。
【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里,# Unity精华一记,unity,游戏引擎

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

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

【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里,# Unity精华一记,unity,游戏引擎

 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每日一记】“调皮的协程”,协程和多线程的区别在哪里,# Unity精华一记,unity,游戏引擎文章来源地址https://www.toymoban.com/news/detail-751499.html


到了这里,关于【Unity每日一记】“调皮的协程”,协程和多线程的区别在哪里的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 的协程的原理

    Unity是一款非常强大的游戏引擎,它支持多种编程语言,其中最常用的语言是C#。在Unity中,协程是一种非常强大的功能,它可以让我们在游戏中实现各种各样的效果。本文将详细介绍Unity协程的原理,并给出示例代码详解。 对啦!这里有个游戏开发交流小组里面聚集了一帮热

    2024年02月02日
    浏览(31)
  • unity 等待事件之协程和Invoke

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: 协程的用法 和 Invoke 的等待事件使用 提示:以下是本篇文章正文内容,下面案例可供参考 代码如下(示例): 好记性不如烂笔头!

    2024年04月13日
    浏览(26)
  • unity协程 Start/StopCoroutine() 结束协程和再次启动协程存在的问题和解决方案

    仅用于记录遇到的问题和解决方案。 快速阅览: 一、结束协程无效: 协程方法需要单独存一份private IEnumerator myTest,再开始和结束不直接传入方法名,而是使用这份保存的myTest进行开始和结束。 二、再次开启协程时少跑了几行代码: 再次开始同一个方法名的协程时,不是从

    2024年02月15日
    浏览(25)
  • [Unity] 基于迭代器的协程底层原理详解

    Unity 是单线程设计的游戏引擎, 所有对于 Unity 的调用都应该在主线程执行. 倘若我们要实现另外再执行一个任务, 该怎么做呢? 答案就是协程. 协程本质上是基于 C# yield 迭代器的, 使用 yield 语法生成的返回迭代器的方法, 其内部的逻辑执行, 是 “懒” 的, 只有在调用 MoveNext 的时

    2024年01月16日
    浏览(28)
  • 【unity每日一记】unity中常见的特性大全

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity每日一记 ⭐【Unityc#专题篇】之c#系统化大礼包】 ⭐【unity数据持久化】数据管理类_PlayerPrfs ⭐【unity本站最全系列】unity常用API大全

    2024年02月11日
    浏览(75)
  • 【unity每日一记】transform类精华之珠

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity每日一记 ⭐【Unityc#专题篇】之c#系统化大礼包】 ⭐【unity数据持久化】数据管理类_PlayerPrfs ⭐【unity本站最全系列】unity常用API大全

    2024年02月11日
    浏览(36)
  • 【Unity每日一记】资源加载相关和检测相关

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity每日一记 ⭐【软件设计师高频考点暴击】 ⭐【Unityc#专题篇】之c#系统化大礼包】 ⭐【unity数据持久化】数据管理类_PlayerPrfs ⭐【u

    2024年02月07日
    浏览(30)
  • 【Unity每日一记】资源加载相关你掌握多少?

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity每日一记 ⭐【软件设计师高频考点暴击】 ⭐【Unityc#专题篇】之c#系统化大礼包】 ⭐【unity数据持久化】数据管理类_PlayerPrfs ⭐【u

    2024年02月12日
    浏览(27)
  • 【unity每日一记】资源和场景加载图文详解

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity每日一记 ⭐【Unityc#专题篇】之c#系统化大礼包】 ⭐【unity数据持久化】数据管理类_PlayerPrfs ⭐【unity本站最全系列】unity常用API大全

    2024年02月10日
    浏览(34)
  • 【Unity每日一记】SceneManager场景资源动态加载

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity每日一记 ⭐【软件设计师高频考点暴击】 ⭐【Unityc#专题篇】之c#系统化大礼包】 ⭐【unity数据持久化】数据管理类_PlayerPrfs ⭐【u

    2024年02月12日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包