Unity--协程--Coroutine
Unity–协程–Coroutine
1. 协程的基本概念
-
基本概念:不是线程,将代码按照划分的时间来执行,这个时间可以是具体的多少秒,也可以是物理帧的时间,也可以是一帧的绘制结束的时间。
-
协程的写法:通过返回
IEnumerator的函数实现,使用yield return语句暂停执行。 -
等待时间:使用
WaitForSeconds等待特定时间,在Update和LateUpdate之间执行 -
其他等待选项:
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. 开启协程
-
开启方法:使用
StartCoroutine方法。 -
开启方式:可以直接传递方法名或先获取
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. 关闭协程
-
关闭所有协程:使用
StopAllCoroutines。 -
关闭特定协程:使用
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. 特殊情况
协程当组件或游戏对象失效或者失活的时候怎么办???
协程开启后
- 组件和物体销毁,协程不执行
- 物体失活协程不执行,组件失活协程执行
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. 协程的基本概念 基本概念:不是线程,将代码按照划分的时间来执行,这个时间可以是具体的多少秒,也可以是物理帧的时间,也可以是一帧的绘制结束的时间。 协程的写法:通过返回IEnumerator的函数实现,使用yield return语句暂停执…...
详解COB显示屏的技术特点
COB(Chip on Board)显示屏作为一种采用倒装COB封装技术的LED显示屏,在显示效果以及使用稳定性跟防护性方面,拥有更大优势,今天跟随COB显示屏厂家中品瑞科技一起来看看,COB显示屏的技术特点: 1、…...
富唯智能推出的AMR复合机器人铝板CNC上下料方案
随着科技的不断进步,CNC加工行业正面临着前所未有的变革。传统的CNC上下料方式已无法满足现代生产对效率、精度和安全性的高要求。在这样的背景下,富唯智能推出的AMR复合机器人铝板CNC上下料方案,以其智能化、自动化的特点,引领了…...
springcloud-config服务器,同样的配置在linux环境下不生效
原本在windows下能争取的获取远程配置但是部署到linux上死活都没有内容,然后开始了远程调试,这里顺带讲解下获取配置文件如果使用的是Git源,config service是如何响应接口并返回配置信息的。先说问题,我的服务名原本是abc-abc-abc…...
写代码,为什么还需要作图?
引言 古人云 :一图胜千言,闲人说:无图无真相。 在日常的聊天工具当中,无论是使用微信,还是钉钉。使用图片或表情包的频次越来越高,那是为什么呢?其实在互联网没有那么发达的时候,我…...
一句话介绍什么是AI智能体?
什么是AI智能体? 一句话说就是利用各种AI的功能的api组合,完成你想要的结果。 例如你希望完成一个关于主题为啤酒主题的小红书文案图片,那么它就可以完成 前面几个步骤类似automa的组件,最后生成一个结果。...
32.哀家要长脑子了!
1.299. 猜数字游戏 - 力扣(LeetCode) 公牛还是挺好数的,奶牛。。。妈呀,一朝打回解放前 抓本质抓本质,有多少位非公牛数可以通过重新排列转换公牛数字,意思就是,当这个数不是公牛数字时&#x…...
Vue2 - 项目上线后生产环境中去除console.log的输出以及断点的解决方案
前言 当你准备将Vue.js应用程序部署到生产环境时,一个关键的优化步骤是移除代码中的所有 console.log 语句以及断点。在开发阶段,console.log 是一个非常有用的调试工具,但在生产环境中保留它们可能会影响性能和安全性。在本文中,我将向你展示如何通过使用Vue CLI 2来自动…...
phpword生成PDF
接上一篇phpword生成word文档,如有不明白的问题可以先查看上一篇文章 首先,生成PDF需要先生成word文档,而后通过word文档生成HTML文档,最后才可以通过HTML文档生成PDF文件,详细代码如下。 执行命令安装phpword&#…...
Linux进程优先级
1. 基本概念 cpu 资源分配的先后顺序,就是指进程的优先权( priority )。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 linux 很有用,可以改善系统性能。还可以把进程运行到指定的CPU 上,这样一来&a…...
每日一题——Python实现PAT乙级1096 大美数(举一反三+思想解读+逐步优化)3千字好文
一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度分析 空间复杂度分析 总结 哲学和编程思想 1. 抽象与具体化 …...
无锁编程——从CPU缓存一致性讲到内存模型(1)
一.前言 1.什么是有锁编程,什么是无锁编程? 在编程中,特别是在并发编程的上下文中,“无锁”和“有锁”是描述线程同步和资源访问控制的两种不同策略。有锁(Locked): 有锁编程是指使用锁(例如互…...
C++编程(七)继承
文章目录 一、继承(一)概念(二)语法格式(三)通过子类访问父类中的成员1. 类内2. 类外 (四)继承中的特殊成员函数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仿真
实验报告:基于ATmega16单片机的简易计算器设计 1. 实验背景 计算器是日常生活和工作中不可或缺的工具,通过按键输入即可实现基本的四则运算。通过本实验,我们将利用ATmega16单片机、矩阵键盘和LCD1602显示屏,设计并实现一个简易…...
C++的IO流操作
文章目录 C语言的输入与输出流是什么CIO流C标准IO流C文件IO流二进制读写文本读写 stringstream的简单介绍 C语言的输入与输出 C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放…...
MacOS升级指定Python版本的pip
场景: 系统默认是Python2.7,已经通过brew install python3.11 python3.12安装了多个版本的Python 执行: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? 顾名思义,Balance及平衡,平衡也就是涉及多方,音频左右甚至四通道,调节所有通道的音量比,使用户在空间内听到各个通道的音频大小不一,好似置身于真实环境…...
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 中,-l 的英文全称是 lines。这个选项用于指定 wc(word count,单词计数)命令来统计文件的行数。 例如,当你运行 wc -l load_user_100w_sort.sql 时&…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
