当前位置: 首页 > news >正文

Unity--协程--Coroutine

Unity–协程–Coroutine

1. 协程的基本概念

  1. 基本概念:不是线程,将代码按照划分的时间来执行,这个时间可以是具体的多少秒,也可以是物理帧的时间,也可以是一帧的绘制结束的时间。

  2. 协程的写法:通过返回IEnumerator的函数实现,使用yield return语句暂停执行。

  3. 等待时间:使用WaitForSeconds等待特定时间,在Update和LateUpdate之间执行

  4. 其他等待选项WaitForEndOfFrame等待当前帧结束,可以用来截取画面,游戏帧画面分析WaitForFixedUpdate等待下一个固定物理帧更新时执行。

    下一帧执行: yield return 数字yield return null; 在Update和LateUpdate之间执行

    public IEnumerator MyCoroutine(int i, string str, float t)
    {print(i);// 返回值IEumerator yield return 来分时函数,即等待多少秒后继续执行函数yield return new WaitForSeconds(5.0f);                // 等待5s后执行print(str);yield return new WaitForSeconds(3.0f);print(t);yield return new WaitForEndOfFrame();               // 等待当前帧绘制完毕后执行print(t);yield return new WaitForFixedUpdate();              // 直到下一个固定更新周期到了执行print(i);// ...
    }
    

2. 开启协程

  1. 开启方法:使用StartCoroutine方法。

  2. 开启方式:可以直接传递方法名或先获取IEnumerator对象再传递。

    	// 2.1 不同于文文普通的函数调用来开启协程// MyCoroutine(3, "不能使用普通方法调用开启/协程", 5.0f);// 2.2 开启方法1public void StartMyCoroutine1(){StartCoroutine(MyCoroutine(1, "开启协程1", 1.0f));}// 2.3 开启方法2public void StartMyCoroutine2(){IEnumerator ie =  MyCoroutine(1, "开启协程2", 1.0f);StartCoroutine(ie);}// 2.4 开启多个协程public void StartMyCoroutine3(){// 开启协程后保留写出对象c1 = StartCoroutine(MyCoroutine(1, "多个协程1", 1.0f));c2 = StartCoroutine(MyCoroutine(1, "多个协程2", 1.0f));c3 = StartCoroutine(MyCoroutine(1, "多个协程3", 1.0f));}
    

3. 关闭协程

  1. 关闭所有协程:使用StopAllCoroutines

  2. 关闭特定协程:使用StopCoroutine,可以传递IEnumerator对象、协程的引用或方法名。

    	// 1. 关闭所有协程public void CloseAllCoroutine(){StopAllCoroutines();}// 2. 关闭指定协程public void CloseSpecialCoroutine(){StopCoroutine(c1);// StopCoroutine(IEnumerator routine); 通过IEnumerator关闭              // StopCoroutine(Coroutine routine);   通过协程名称关闭// StopCoroutine(string methodName);   通过协程函数名关闭}
    

    关闭指定协程的方法有很多,一般不使用协程函数名关闭

    StopCoroutine(IEnumerator routine); 通过IEnumerator关闭

    StopCoroutine(Coroutine routine); 通过协程名称关闭
    StopCoroutine(string methodName); 通过协程函数名关闭

4. 提前跳出协程

使用yield break在满足条件时提前终止执行。

// 提前跳出协程public void BreakCoroutine(){IEnumerator MyNewCoroutine(){Debug.Log("开始执行协同程序");// 执行一些操作yield return new WaitForSeconds(1.0f);Debug.Log("协同程序执行了一秒");// 在这里,我们检查一个条件if (SomeCondition()){Debug.Log("满足条件,提前结束协同程序");yield break; // 提前终止协同程序}// 如果上面的条件不满足,这将不会执行yield return new WaitForSeconds(1.0f);Debug.Log("协同程序又执行了一秒");}StartCoroutine(MyNewCoroutine());}bool SomeCondition(){// 这里是条件的逻辑return true; // 例如,始终返回 true 来终止协同程序}

5. 特殊情况

协程当组件或游戏对象失效或者失活的时候怎么办???

协程开启后

  1. ​ 组件和物体销毁,协程不执行
  2. ​ 物体失活协程不执行,组件失活协程执行

6.建议

  • 协程的使用:适用于处理异步操作和分步骤执行任务,如动画、加载资源。
  • 性能考虑:比多线程轻量,适合游戏开发中的非阻塞操作。
  • 条件检查:在协程中使用条件检查可以灵活控制流程。
  • 资源管理:在使用协程加载资源时,注意资源的释放和内存管理。

7.完成测试代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CoroutineTest : MonoBehaviour
{Coroutine c1;Coroutine c2;Coroutine c3;// 协程程序// 1. 协程的使用// 1.1 协程的写法public IEnumerator MyCoroutine(int i, string str, float t){print(i);// 返回值IEumerator yield return 来分时函数,即等待多少秒后继续执行函数yield return new WaitForSeconds(5.0f);              // 等待5s后执行print(str);yield return new WaitForSeconds(3.0f);print(t);//yield return new WaitForEndOfFrame();               // 等待当前帧绘制完毕后执行//print(t);//yield return new WaitForFixedUpdate();              // 直到下一个固定更新周期到了执行//print(i);}// 2. 开启协程// 2.1 不同用普通的函数调用来开启协程// MyCoroutine(3, "不能使用普通方法调用开启/协程", 5.0f);// 2.2 开启方法1public void StartMyCoroutine1(){StartCoroutine(MyCoroutine(1, "开启协程1", 1.0f));}// 2.3 开启方法2public void StartMyCoroutine2(){IEnumerator ie =  MyCoroutine(1, "开启协程2", 1.0f);StartCoroutine(ie);}// 2.4 开启多个协程public void StartMyCoroutine3(){// 开启协程后保留写出对象c1 = StartCoroutine(MyCoroutine(1, "多个协程1", 1.0f));c2 = StartCoroutine(MyCoroutine(1, "多个协程2", 1.0f));c3 = StartCoroutine(MyCoroutine(1, "多个协程3", 1.0f));}// 3. 关闭协程public void CloseAllCoroutine(){StopAllCoroutines();}// 4. 关闭指定协程public void CloseSpecialCoroutine(){StopCoroutine(c1);StopCoroutine(c2);StopCoroutine(c3);// StopCoroutine(IEnumerator routine); 通过IEnumerator关闭              // StopCoroutine(Coroutine routine);   通过协程名称关闭// StopCoroutine(string methodName);   通过协程函数名关闭}// 5. 提前跳出协程public void BreakCoroutine(){IEnumerator MyNewCoroutine(){Debug.Log("开始执行协同程序");// 执行一些操作yield return new WaitForSeconds(1.0f);Debug.Log("协同程序执行了一秒");// 在这里,我们检查一个条件if (SomeCondition()){Debug.Log("满足条件,提前结束协同程序");yield break; // 提前终止协同程序}// 如果上面的条件不满足,这将不会执行yield return new WaitForSeconds(1.0f);Debug.Log("协同程序又执行了一秒");}StartCoroutine(MyNewCoroutine());}bool SomeCondition(){// 这里是条件的逻辑return true; // 例如,始终返回 true 来终止协同程序}void Start(){StartMyCoroutine1();StartMyCoroutine2();StartMyCoroutine3();CloseSpecialCoroutine();BreakCoroutine();CloseAllCoroutine();}
}

8.应用:计时器(顺序计时和倒计时)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TimeCounter : MonoBehaviour
{IEnumerator TimeConter(int sumSeconds, bool sequence){int time = 0;if (sequence){while (true){// 顺序计时// 抵达终止时间if (time >= sumSeconds){Debug.Log(sumSeconds + "s 时间到(顺序计时)");yield break;}// 延迟一秒执行yield return new WaitForSeconds(1.0f);// 修改时间time++;// 打印时间Debug.Log(time);}}else {// 倒计时time = sumSeconds;while (true){if (time <= 0){Debug.Log(sumSeconds + "s 时间到(倒序计时)");yield break;}Debug.Log(time--);yield return new WaitForSeconds(1.0f);}}}private void Start(){// 开启计时器协程Coroutine c1 = StartCoroutine(TimeConter(10, true));Coroutine c2 = StartCoroutine(TimeConter(3, false));}}

相关文章:

Unity--协程--Coroutine

Unity–协程–Coroutine 1. 协程的基本概念 基本概念:不是线程,将代码按照划分的时间来执行,这个时间可以是具体的多少秒,也可以是物理帧的时间,也可以是一帧的绘制结束的时间。 协程的写法&#xff1a;通过返回IEnumerator的函数实现&#xff0c;使用yield return语句暂停执…...

详解COB显示屏的技术特点

COB&#xff08;Chip on Board&#xff09;显示屏作为一种采用倒装COB封装技术的LED显示屏&#xff0c;在显示效果以及使用稳定性跟防护性方面&#xff0c;拥有更大优势&#xff0c;今天跟随COB显示屏厂家中品瑞科技一起来看看&#xff0c;COB显示屏的技术特点&#xff1a; 1、…...

富唯智能推出的AMR复合机器人铝板CNC上下料方案

随着科技的不断进步&#xff0c;CNC加工行业正面临着前所未有的变革。传统的CNC上下料方式已无法满足现代生产对效率、精度和安全性的高要求。在这样的背景下&#xff0c;富唯智能推出的AMR复合机器人铝板CNC上下料方案&#xff0c;以其智能化、自动化的特点&#xff0c;引领了…...

springcloud-config服务器,同样的配置在linux环境下不生效

原本在windows下能争取的获取远程配置但是部署到linux上死活都没有内容&#xff0c;然后开始了远程调试&#xff0c;这里顺带讲解下获取配置文件如果使用的是Git源&#xff0c;config service是如何响应接口并返回配置信息的。先说问题&#xff0c;我的服务名原本是abc-abc-abc…...

写代码,为什么还需要作图?

引言 古人云 &#xff1a;一图胜千言&#xff0c;闲人说&#xff1a;无图无真相。 在日常的聊天工具当中&#xff0c;无论是使用微信&#xff0c;还是钉钉。使用图片或表情包的频次越来越高&#xff0c;那是为什么呢&#xff1f;其实在互联网没有那么发达的时候&#xff0c;我…...

一句话介绍什么是AI智能体?

什么是AI智能体&#xff1f; 一句话说就是利用各种AI的功能的api组合&#xff0c;完成你想要的结果。 例如你希望完成一个关于主题为啤酒主题的小红书文案图片&#xff0c;那么它就可以完成 前面几个步骤类似automa的组件&#xff0c;最后生成一个结果。...

32.哀家要长脑子了!

1.299. 猜数字游戏 - 力扣&#xff08;LeetCode&#xff09; 公牛还是挺好数的&#xff0c;奶牛。。。妈呀&#xff0c;一朝打回解放前 抓本质抓本质&#xff0c;有多少位非公牛数可以通过重新排列转换公牛数字&#xff0c;意思就是&#xff0c;当这个数不是公牛数字时&#x…...

Vue2 - 项目上线后生产环境中去除console.log的输出以及断点的解决方案

前言 当你准备将Vue.js应用程序部署到生产环境时,一个关键的优化步骤是移除代码中的所有 console.log 语句以及断点。在开发阶段,console.log 是一个非常有用的调试工具,但在生产环境中保留它们可能会影响性能和安全性。在本文中,我将向你展示如何通过使用Vue CLI 2来自动…...

phpword生成PDF

接上一篇phpword生成word文档&#xff0c;如有不明白的问题可以先查看上一篇文章 首先&#xff0c;生成PDF需要先生成word文档&#xff0c;而后通过word文档生成HTML文档&#xff0c;最后才可以通过HTML文档生成PDF文件&#xff0c;详细代码如下。 执行命令安装phpword&#…...

Linux进程优先级

1. 基本概念 cpu 资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08; priority &#xff09;。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 linux 很有用&#xff0c;可以改善系统性能。还可以把进程运行到指定的CPU 上&#xff0c;这样一来&a…...

每日一题——Python实现PAT乙级1096 大美数(举一反三+思想解读+逐步优化)3千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度分析 空间复杂度分析 总结 哲学和编程思想 1. 抽象与具体化 …...

无锁编程——从CPU缓存一致性讲到内存模型(1)

一.前言 1.什么是有锁编程&#xff0c;什么是无锁编程&#xff1f; 在编程中&#xff0c;特别是在并发编程的上下文中&#xff0c;“无锁”和“有锁”是描述线程同步和资源访问控制的两种不同策略。有锁&#xff08;Locked&#xff09;: 有锁编程是指使用锁&#xff08;例如互…...

C++编程(七)继承

文章目录 一、继承&#xff08;一&#xff09;概念&#xff08;二&#xff09;语法格式&#xff08;三&#xff09;通过子类访问父类中的成员1. 类内2. 类外 &#xff08;四&#xff09;继承中的特殊成员函数1. 构造函数2. 析构函数3. 拷贝构造函数4. 拷贝赋值函数 二、多重继承…...

【ACM_2023】3D Gaussian Splatting for Real-Time Radiance Field Rendering

【ACM_2023】3D Gaussian Splatting for Real-Time Radiance Field Rendering 一、前言Abstract1 INTRODUCTION2 RELATED WORK2.1 Traditional Scene Reconstruction and Rendering2.2 Neural Rendering and Radiance Fields2.3 Point-Based Rendering and Radiance Fields 3 O…...

【TB作品】atmega16 计算器,ATMEGA16单片机,Proteus仿真

实验报告&#xff1a;基于ATmega16单片机的简易计算器设计 1. 实验背景 计算器是日常生活和工作中不可或缺的工具&#xff0c;通过按键输入即可实现基本的四则运算。通过本实验&#xff0c;我们将利用ATmega16单片机、矩阵键盘和LCD1602显示屏&#xff0c;设计并实现一个简易…...

C++的IO流操作

文章目录 C语言的输入与输出流是什么CIO流C标准IO流C文件IO流二进制读写文本读写 stringstream的简单介绍 C语言的输入与输出 C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放…...

MacOS升级指定Python版本的pip

场景&#xff1a; 系统默认是Python2.7&#xff0c;已经通过brew install python3.11 python3.12安装了多个版本的Python 执行&#xff1a;pip --version pip 24.1 from /Users/mac10.12/Library/Python/3.11/lib/python/site-packages/pip (python 3.11) 用的是Python3.11…...

音频Balance源码总结

音频Balance源码总结 何为音频Balance&#xff1f; 顾名思义&#xff0c;Balance及平衡&#xff0c;平衡也就是涉及多方&#xff0c;音频左右甚至四通道&#xff0c;调节所有通道的音量比&#xff0c;使用户在空间内听到各个通道的音频大小不一&#xff0c;好似置身于真实环境…...

CesiumJS【Basic】- #043 绘制脉冲线(Entity方式)- 需要自定义着色器

文章目录 绘制脉冲线(Entity方式)- 需要自定义着色器1 目标2 代码2.1 main.ts3 资源文件绘制脉冲线(Entity方式)- 需要自定义着色器 1 目标 使用Entity方式绘制脉冲线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer(cesiumCont…...

Linux命令 wc(word count)-l(lines)用于统计文件中的行数。

文章目录 1、wc -l2、实战3、wc --help 1、wc -l 在命令 wc -l 中&#xff0c;-l 的英文全称是 lines。这个选项用于指定 wc&#xff08;word count&#xff0c;单词计数&#xff09;命令来统计文件的行数。 例如&#xff0c;当你运行 wc -l load_user_100w_sort.sql 时&…...

Python AOT编译迎来分水岭:2026年3大工业级工具实测对比(启动提速8.7×,内存降63%,兼容CPython 3.13+)

第一章&#xff1a;Python AOT编译的范式跃迁与工业落地元年定义长期以来&#xff0c;Python 以解释执行和动态特性见长&#xff0c;但其运行时开销、启动延迟与内存 footprint 成为云原生服务、边缘设备与实时系统规模化部署的关键瓶颈。2024 年&#xff0c;随着 Nuitka 14.x、…...

如何彻底解决Zotero-GPT集成中的AI调用故障:从诊断到优化的完整技术指南

如何彻底解决Zotero-GPT集成中的AI调用故障&#xff1a;从诊断到优化的完整技术指南 【免费下载链接】zotero-gpt GPT Meet Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-gpt Zotero-GPT项目作为文献管理工具与大型语言模型的深度集成方案&#xff0c;为…...

模型安全实践:实时手机检测-通用输入图像异常检测(模糊/过曝/裁剪)

模型安全实践&#xff1a;实时手机检测-通用输入图像异常检测&#xff08;模糊/过曝/裁剪&#xff09; 1. 项目简介与核心价值 在日常的手机检测应用中&#xff0c;我们经常会遇到各种图像质量问题&#xff1a;图片模糊看不清手机细节、光线过曝导致手机轮廓丢失、或者图片被…...

告别BibTeX混乱:在LaTeX中精准控制单条参考文献格式(颜色、字体)的实战技巧

告别BibTeX混乱&#xff1a;在LaTeX中精准控制单条参考文献格式&#xff08;颜色、字体&#xff09;的实战技巧 学术写作中&#xff0c;参考文献的视觉呈现往往被忽视。当审稿人要求"突出显示新增文献"时&#xff0c;当需要区分自己的前期工作与奠基性研究时&#x…...

革新UE4资源管理:UnrealPakViewer全攻略

革新UE4资源管理&#xff1a;UnrealPakViewer全攻略 【免费下载链接】UnrealPakViewer 查看 UE4 Pak 文件的图形化工具&#xff0c;支持 UE4 pak/ucas 文件 项目地址: https://gitcode.com/gh_mirrors/un/UnrealPakViewer 作为UE4开发者&#xff0c;你是否曾为Pak文件的…...

Youtu-VL-4B-Instruct步骤详解:Supervisor日志查看、错误定位与常见启动失败修复

Youtu-VL-4B-Instruct步骤详解&#xff1a;Supervisor日志查看、错误定位与常见启动失败修复 部署一个强大的多模态AI模型&#xff0c;最让人头疼的往往不是使用&#xff0c;而是启动。你满怀期待地拉取镜像、启动服务&#xff0c;结果浏览器里只显示一个冰冷的“无法访问此网…...

如何分析竞争对手的seo关键词

<h2>如何分析竞争对手的SEO关键词</h2> <p>在当今竞争激烈的互联网市场中&#xff0c;了解和分析竞争对手的SEO关键词是提升自己网站排名的关键。SEO关键词分析不仅可以帮助你发现市场上的机会&#xff0c;还能让你更好地了解竞争对手的策略&#xff0c;从而…...

手把手教学:用SiameseAOE从海量文本中提取“属性-观点”对

手把手教学&#xff1a;用SiameseAOE从海量文本中提取"属性-观点"对 1. 为什么需要属性观点抽取&#xff1f; 在日常工作中&#xff0c;我们经常遇到这样的场景&#xff1a;面对成千上万条用户评论、社交媒体反馈或调查问卷&#xff0c;如何快速找出有价值的信息&a…...

ChatGLM-6B角色扮演功能开发:基于Prompt的智能对话系统

ChatGLM-6B角色扮演功能开发&#xff1a;基于Prompt的智能对话系统 1. 引言 想象一下&#xff0c;你正在开发一个智能客服系统&#xff0c;需要让AI能够扮演不同角色的专业人士来回答用户问题。或者你正在创建一个教育应用&#xff0c;希望AI能够化身历史人物、科学导师或文学…...

互联网产品创新:基于Qwen3-ASR-0.6B的在线教育实时字幕解决方案

互联网产品创新&#xff1a;基于Qwen3-ASR-0.6B的在线教育实时字幕解决方案 1. 引言 想象一下&#xff0c;你正在上一节重要的在线直播课&#xff0c;老师讲得飞快&#xff0c;有些专业术语没听清&#xff0c;或者因为网络波动声音断断续续。又或者&#xff0c;你身处一个嘈杂…...