【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秒之后再打印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#专题篇】—核心章题单实践练习


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


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/137038.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

msvcp120.dll丢失的6种解决方法,教你如何修复dll文件丢失

“找不到msvcp120dll,无法继续执行代码的6个修复方案”。我相信很多朋友在运行某些程序时&#xff0c;可能会遇到这样的错误提示&#xff1a;“找不到msvcp120dll&#xff0c;无法继续执行代码”。那么&#xff0c;msvcp120dll究竟是什么&#xff1f;为什么会丢失呢&#xff1f…

发布订阅者模式(观察者模式)

目录 应用场景 1.结构 2.效果 3.代码 3.1.Main方法的类【ObserverPatternExample】 3.2.主题&#xff08;接口&#xff09;【Subject】 3.3.观察者&#xff08;接口&#xff09;【Observer】 3.4.主题&#xff08;实现类&#xff09;【ConcreteSubject】 3.5.观察者&a…

qemu 之 uboot、linux 启动

目录 编译uboot、kernel 编译启动从 uboot 中引导启动 linux注参考 本文主要说明 arm64 在 qemu 上的相关启动。 编译 使用的是 qemu-8.1.1 版本&#xff0c;编译命令如下: ../configure --cc/usr/local/bin/gcc --prefix/home/XXX/qemu_out --enable-virtfs --enable-slir…

Three.js——基于原生WebGL封装运行的三维引擎

文章目录 前言一、什么是WebGL&#xff1f;二、Three.js 特性 前言 Three.js中文官网 Three.js是基于原生WebGL封装运行的三维引擎&#xff0c;在所有WebGL引擎中&#xff0c;Three.js是国内文资料最多、使用最广泛的三维引擎。既然Threejs是一款WebGL三维引擎&#xff0c;那么…

RAG相关内容介绍

本文记录在查找RAG相关内容时所整合的一些资料与内容&#xff0c;还有一个组会报告的PPT 文章目录 定义LLM的知识更新难题 RAG是什么&#xff1f;-“开卷考试”RAG原理与技术RAG技术细节一、数据索引• 数据提取• 分块&#xff08;Chunking&#xff09;分块方式确定应用程序的…

摊牌 了,我不藏了,上线了一年多的网站还是广而告之吧!

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列文章创作的程序员。 本文已收录到我的小站&#xff1a;https://skjava.com。 从去年开始一直有小伙伴问我&#xff0c;大明哥&#xff0c;你的网站怎么打不开了&#xff1f;我只能苦涩地跟他说&#xff0c;没…

DevChat智能编程助手:小白也能轻松上手的开发利器

DevChat智能编程助手&#xff1a;小白也能轻松上手的开发利器 一、DevChat介绍1.1 DevChat简介1.2 DevChat特点1.3 DevChat官网 二、注册DevChat账号2.1 访问DevChat官网2.2 注册账号2.3 复制Access Key2.4 登录DevChat 三、安装DevChat3.1 打开VS Code软件3.2 安装DevChat3.3 …

(免费领源码)java#ssm#mysql在线学习平台85204-计算机毕业设计项目选题推荐

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;在线学习平台当然也不能排除在外。在线学习平台是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#x…

Linux下C++调用python脚本实现LDAP协议通过TNLM认证连接到AD服务器

1.前言 首先要实现这个功能&#xff0c;必须先搞懂如何通过C调用python脚本文件最为关键&#xff0c;因为两者的环境不同。本质上是在 c 中启动了一个 python 解释器&#xff0c;由解释器对 python 相关的代码进行执行&#xff0c;执行完毕后释放资源。 2 模块功能 2.1python…

基于樽海鞘群算法优化概率神经网络PNN的分类预测 - 附代码

基于樽海鞘群算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于樽海鞘群算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于樽海鞘群优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。

CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。 概述 时空函数是一种用于描述时空结构和演化的函数。它在物理学、数学和计算机科学等领域中都有广泛的应用。时空函数可以描述物体在时空中的位置、速度、加速度以及其他相关属性。 用法 CnosDB 将使用一种全新的…

基于蜉蝣算法优化概率神经网络PNN的分类预测 - 附代码

基于蜉蝣算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于蜉蝣算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于蜉蝣优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

腾讯域名优惠卷领取

腾讯域名到到期了&#xff0c;听说申请此计划&#xff0c;可获得优惠卷&#xff0c;看到网上5年域名只需要10元&#xff0c;姑且试试看。 我的博客即将同步至腾讯云开发者社区&#xff0c;邀请大家一同入驻&#xff1a;https://cloud.tencent.com/developer/support-plan?in…

Vue3+NodeJS 接入文心一言, 发布一个 VSCode 大模型问答插件

目录 一&#xff1a;首先明确插件开发方式 二&#xff1a;新建一个Vscode 插件项目 1. 官网教程地址 2. 一步一步来创建 3. 分析目录结构以及运行插件 三&#xff1a;新建一个Vue3 项目&#xff0c;在侧边栏中展示&#xff0c;实现vscode插件 <> vue项目 双向消息传…

模型部署:量化中的Post-Training-Quantization(PTQ)和Quantization-Aware-Training(QAT)

模型部署&#xff1a;量化中的Post-Training-Quantization&#xff08;PTQ&#xff09;和Quantization-Aware-Training&#xff08;QAT&#xff09; 前言量化Post-Training-Quantization&#xff08;PTQ&#xff09;Quantization-Aware-Training&#xff08;QAT&#xff09; 参…

Python---字符串 lstrip()--删除字符串两边的空白字符、rstrip()--删除字符串左边的空白字符、strip()--删除字符串右边的空白字符

strip() 方法主要作用&#xff1a;删除字符串两边的空白字符&#xff08;如空格&#xff09; lstrip() 方法 left strip&#xff0c;作用&#xff1a;只删除字符串左边的空白字符 left 英 /left/ 左 rstrip() 方法 right strip&#xff0c;作用&#xff1a;只删除字符…

阿里云严重故障,影响阿里系、淘宝、饿了么、语雀等都崩了...

作者&#xff1a;JavaPub 编程学习一条龙&#xff1a;http://luxian.javapub.net.cn 就在一年一度的双十一剁手节火热进行时&#xff0c;阿里云服务出现了严重故障。 关键是前不久刚发生了语雀事件&#xff0c;不了解的朋友阅读这里 阿里语雀突发P0级事故&#xff0c;一度崩溃…

Vector - CANoe - Vector Hardware Manager基础介绍

经常使用CANoe的人都知道&#xff0c;我们之前使用配置VN系列硬件通道的时候使用的是Vector Hardware Config&#xff0c;非常的方便&#xff0c;不过在Vector Driver Setup驱动版本大于22.14后&#xff0c;为了更好的适用车载以太网相关的配置&#xff0c;以及各个配置之间继承…

【Qt之Model/View】编程

Model/View编程介绍 Qt包含一组使用模型/视图架构来管理数据和用户呈现的关系的视图类。此架构引入的功能分离使开发人员可以更灵活地自定义项的呈现方式&#xff0c;并提供标准的模型接口&#xff0c;以允许各种数据源与现有项视图一起使用。在本文档中&#xff0c;我们简要介…

Leetcode—20.有效的括号【简单】

2023每日刷题&#xff08;二十七&#xff09; Leetcode—20.有效的括号 C实现代码 class Solution { public:bool isValid(string s) {stack<char> arr;int len s.size();if(len 1) {return false;}for(int i 0; i < len; i) {if(s[i] ( || s[i] [ || s[i] {)…