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

Unity协程的简单应用

Unity协程是一种特殊的函数,可以让你在Unity中创建一种类似于多线程的异步操作。它可以在需要等待某个操作完成时,暂停执行当前代码,等待某个条件满足后再继续执行。
在一般情况下 unity中调用函数时,函数将运行到完成状态,然后返回。这实际上意味着在函数中发生的任何动作都必须在单帧更新内发生;函数调用不能用于包含程序性动画或随时间推移的一系列事件。例如,假设需要逐渐减少对象的 Alpha(不透明度)值,直至对象变得完全不可见。

void Fade() 
{for (float ft = 1f; ft >= 0; ft -= 0.1f) {Color c = renderer.material.color;c.a = ft;renderer.material.color = c;}
}

就目前而言,Fade 函数不会产生期望的效果。因为该函数将完全在单个帧更新中执行为了使淡入淡出过程可见,必须通过一系列帧降低 Alpha 以显示正在渲染的中间值。这种情况下,永远不会看到中间值,对象会立即消失。

可以通过向 Update 函数添加代码(此代码逐帧执行淡入淡出)来处理此类情况。但是,使用协程来执行此类任务通常会更方便。

协程就像一个函数,能够暂停执行并将控制权返还给 Unity,然后在下一帧继续执行。在 C# 中,声明协程的方式如下:

IEnumerator Fade() 
{for (float ft = 1f; ft >= 0; ft -= 0.1f) {Color c = renderer.material.color;c.a = ft;renderer.material.color = c;yield return null;}
}

此协程本质上是一个用返回类型 IEnumerator 声明的函数,并在主体中的某个位置包含 yield return 语句。yield return null 行是暂停执行并随后在下一帧恢复的点。要将协程设置为运行状态,必须使用 StartCoroutine 函数:
通过以上学习 我们可以实现一些具体的功能了,比如UI闪烁的功能:本质就是透明度(a值)的改变
以下是一个UI闪烁类 直接挂载到button上即可

using UnityEngine;
using UnityEngine.UI;
using System.Collections;public class UIFlash : MonoBehaviour
{public float flashInterval = 0.5f; // 闪烁时间间隔public float minAlpha = 0f; // 最小透明度public float maxAlpha = 1f; // 最大透明度private Image image;private Coroutine flashCoroutine;void Awake(){image = GetComponent<Image>();}void OnEnable(){if (flashCoroutine == null){flashCoroutine = StartCoroutine(Flash());}}void OnDisable(){if (flashCoroutine != null){StopCoroutine(flashCoroutine);flashCoroutine = null;image.color = new Color(image.color.r, image.color.g, image.color.b, maxAlpha); // 恢复初始透明度}}IEnumerator Flash(){while (true){image.color = new Color(image.color.r, image.color.g, image.color.b, minAlpha);yield return new WaitForSeconds(flashInterval);image.color = new Color(image.color.r, image.color.g, image.color.b, maxAlpha);yield return new WaitForSeconds(flashInterval);}}
}

当然也有更简单的方法,Mathf.PingPong轻易的实现这个效果

public class NewBehaviourScript : MonoBehaviour
{private Color HintColor;//自己定义一个想要的颜色,默认是黑色Image image;private void Start(){image = GetComponent<Image>();}private void Update(){// HintColor=new Color(Random.Range(0f,1f),Random.Range(0f,1f),Random.Range(0f,1f));//随机颜色HintColor.a = Mathf.PingPong(5 * Time.time, 1F);image.color = HintColor;}
}

在Unity中,协程并不是真正的多线程,而是一种协作式的多任务处理方式
协程实际上是一种函数,它可以被中断和恢复执行。当协程执行到yield return语句时,它会暂停执行并将控制权交给协程管理器,让其他协程或主线程有机会执行。当等待的条件满足后,协程管理器会恢复执行该协程。 比如一个简单的计时器程序。

 public IEnumerator StartTime() {while (secound > 0){yield return new WaitForSeconds(1);secound--;changeText();Debug.Log(secound);}if (secound == 0){button_xuzi.interactable = true;}}

尽管协程是在单个线程中执行的,但协程可以在主线程和后台线程之间切换执行。例如,当协程等待某个耗时操作完成时,它可以暂停执行并将控制权交给主线程或后台线程去执行其他任务,待耗时操作完成后再恢复执行该协程。
因此,尽管协程并不是真正的多线程,但它可以让我们在单线程中实现类似于多线程的异步操作,从而提高程序的效率和响应性。同时,使用协程也可以简化代码实现,使得程序更易于理解和维护。
协程通常用于场景加载,在Unity中,场景加载通常是一个比较耗时的操作,需要花费一定的时间来读取场景数据并进行初始化。如果在主线程中直接进行场景加载,会导致程序卡顿,用户体验不佳。因此,Unity提供了异步加载场景的功能,可以使用协程来实现。可以使用slider.value=progress制作进度条 进度 可以防止“卡”在当前场景,(并不是真的卡 而是在加载)。

 IEnumerator LoadSceneAsync(){AsyncOperation asyncOperation = SceneManager.LoadSceneAsync("场景名");asyncOperation.allowSceneActivation = false; // 禁止自动跳转到加载的场景while (!asyncOperation.isDone){Debug.Log("场景加载进度:" + asyncOperation.progress);if (asyncOperation.progress >= 0.9f){asyncOperation.allowSceneActivation = true; // 加载完成后允许自动跳转到加载的场景}yield return null;}// 在加载完成后执行的代码Debug.Log("场景加载完成");}

1.加载场景数据:使SceneManager.LoadSceneAsync()AssetBundle.LoadAssetAsync()等异步加载场景数据。

2.显示加载进度:在加载场景数据的过程中,可以显示一个加载进度条或动画,让用户知道加载的进度和状态。

3.初始化场景:在场景数据加载完成后,需要对场景中的对象进行初始化和设置,例如设置摄像机位置、激活游戏对象等。

4.等待一段时间:在场景初始化完成后,可以暂停一段时间,让场景中的对象有时间进行启动和初始化,以避免场景加载完成后仍然出现卡顿现象。

5.完成场景加载:在等待一段时间后,可以通知主线程场景加载完成,从而让主线程进行后续处理


注意:协程不是多线程!!!!

相关文章:

Unity协程的简单应用

Unity协程是一种特殊的函数&#xff0c;可以让你在Unity中创建一种类似于多线程的异步操作。它可以在需要等待某个操作完成时&#xff0c;暂停执行当前代码&#xff0c;等待某个条件满足后再继续执行。 在一般情况下 unity中调用函数时&#xff0c;函数将运行到完成状态&#x…...

LeetCode 1250. Check If It Is a Good Array【数论】

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

ETHDenver 2023

ETHDenver是全球最大、持续时间最长的以太坊活动之一&#xff0c;今年的活动定于2月24日至3月5日在美国科罗拉多州丹佛市盛大举行。这次活动将面向以太坊和其他区块链协议爱好者、设计者和开发人员。Moonbeam作为ETHDenver 2023的Meta赞助商&#xff0c;将在本次活动中展示令人…...

React架构演变

老版React架构 React 16之前的架构 其实就分为两个部分&#xff1a; Reconciler协调器Render渲染器 Reconciler协调器负责本次更新有什么组件需要被渲染&#xff0c;diff算法就发生在这个步骤中&#xff0c;在diff算法中会将上次更新的组件和本次更新的组件做一个对比&…...

安全认证--JWT介绍及使用

安全认证--JWT介绍及使用1.无状态登录原理1.1.什么是有状态&#xff1f;1.2.什么是无状态1.3.如何实现无状态1.4.JWT1.4.1.简介1.4.2.数据格式2.编写JWT工具2.1.添加JWT依赖2.2.载荷对象2.3.工具2.4.测试2.4.1.配置秘钥2.4.2.测试类1.无状态登录原理 有状态登录和无状态登录详…...

【计算机组成原理】计算机硬件的基础组成、认识各个硬件部件

计算机组成原理&#xff08;一&#xff09; 计算机内部是通过电信号传递数据 电信号&#xff1a;分为高电平和低电平&#xff0c;分别代表1/0 数字、文字、图像如何用二进制表示? CPU如何对二进制数进行加减乘除? 如何存储这些二进制数的? 如何从内存中取出想要的数…...

使用ChIPSeeker进行ChIP-seq, ATAC-seq,cuttag等富集峰的基因组注释

二代测序产生的数据类型 常规的下一代高通量测序&#xff08;next generation sequencing, NGS&#xff09;实验通常产生大量短片段(reads)&#xff0c;通常我们需要将这些reads比对到参考基因组/转录组上&#xff0c;即将它们置于生物学上有意义的基因背景下&#xff0c;才能…...

第九届蓝桥杯省赛——7缩位求和

题目&#xff1a;在电子计算机普及以前&#xff0c;人们经常用一个粗略的方法来验算四则运算是否正确。比如&#xff1a;248 * 15 3720把乘数和被乘数分别逐位求和&#xff0c;如果是多位数再逐位求和&#xff0c;直到是1位数&#xff0c;得2 4 8 14 > 1 4 5;1 5 65…...

【c++】STL常用容器5—list容器

文章目录list基本概念list构造函数list赋值和交换list大小操作list插入和删除list数据存取list反转和排序list基本概念 功能&#xff1a;将数据进行链式存储。 链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链…...

【牛客刷题专栏】0x0D:JZ5 替换空格(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录前言问题…...

聚观早报 | 苹果2024年放弃高通;腾讯回应进军类 ChatGPT

今日要闻&#xff1a;苹果2024年放弃高通&#xff1b;腾讯回应进军类 ChatGPT&#xff1b;小米发布无线AR眼镜探索版&#xff1b;50%的美国企业已在使用ChatGPT&#xff1b;Snap推出ChatGPT驱动的聊天机器人 苹果2024年放弃高通 高通公司 CEO 兼总裁克里斯蒂亚诺・安蒙&#xf…...

Elasticsearch:如何正确处理 Elasticsearch 摄取管道故障

在我之前的文章 “Elastic&#xff1a;开发者上手指南” 中的 “Ingest pipeline” 章节中个&#xff0c;我有很多文章是关于 ingest pipeline 的。在今天的文章中&#xff0c;我将重点介绍如何处理在摄取管道中的错误。在我之前的文章 “Elasticsearch&#xff1a;如何处理 in…...

指标体系—北极星指标体系

北极星指标体系 每个产品都有很多指标,每个指标都反映了对应业务的经营情况。但是在实际业务经营中,却要求我们在不同的产品阶段寻找到合适的指标,让这个指标可以代表当前产品阶段的方向和目标,让这个指标不仅对业务经营团队,而且对产品的用户、对产品的价值都能有很好的…...

【操作系统】内存管理

虚拟内存 虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存&#xff0c;从而让程序获得更多的可用内存。 为了更好的管理内存&#xff0c;操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间&#xff0c;这个地址空间被分割成多个块&#xff0c;每一块称为一页。…...

家庭消耗品跟踪管理软件HomeLists

什么是 HomeLists &#xff1f; HomeLists 是一款自托管耗材统计软件&#xff0c;能通过提醒等帮助您跟踪家庭消耗品。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 homelists &#xff0c;选择第一个 aceberg/homelists&#xff0c;版本选择 latest。 本文写作时&…...

django模型简要(1)

1. AbstractUser(内置用户模型类)的使用 ### 需要在settings.py中添加如下&#xff1a; AUTH_USER_MODEL app.MyUser 说明&#xff1a;这是为了覆盖django默认的User model&#xff1b;app即模型所属app&#xff0c;MyUser即AbstractUser实现类。 2.on_delete选项 从django3.…...

【shell 编程大全】sed详解

sed详解1. 概述 今天单独拉出一章来讲述下sed命令。因为sed命令确实内容太多&#xff0c;不过也是比较灵活的&#xff0c;好了不废话了。我们开始吧 1.2 原理解析 shell脚本虽然功能很多&#xff0c;但是它最常用的功能还是处理文本文件&#xff0c;尤其是在正常的业务操作流程…...

关于sudo配置

前言这里做一个小补充&#xff0c;主要讲一下关于利用sudo对指令提权以及普通用户无法使用sudo指令的问题。在前面的文章【Linux】一文掌握Linux权限中&#xff0c;我们讲到了关于权限的一些问题。我们知道root身份下&#xff0c;一切畅通无阻&#xff0c;而权限只是用来限制我…...

EEGLAB处理运动想象脑电数据

最近在看论文时&#xff0c;经常看到作者处理数据的过程&#xff0c;之前都是一代而过&#xff0c;知道怎么处理就可以了&#xff0c;一直没有实践&#xff0c;最近需要一些特殊的数据&#xff0c;需要自己处理出来&#xff0c;这里尝试着自己用MATLAB处理数据&#xff0c;记录…...

span标签的使用场景

目录 前言 一、span标签是什么&#xff1f; 二、span常用 1.可以嵌套a标签。 2.直接使用 3.加样式使用 4.加按钮使用 5.加a标签的综合使用 6.跟table结合使用 总结 前言 本篇章主要记录一下开发日常中&#xff0c;所常遇见的使用span标签的场景。 一、span标签是什么…...

基于Godot与Roslyn构建现代化.NET IDE:SharpIDE架构解析与实践

1. 项目概述&#xff1a;一个为.NET开发者打造的现代IDE如果你是一个.NET开发者&#xff0c;尤其是长期使用C#进行开发&#xff0c;那么你肯定对Visual Studio和Visual Studio Code这两款工具又爱又恨。Visual Studio功能强大但略显笨重&#xff0c;VS Code轻快但针对.NET的原生…...

Windows10系统V-rep安装避坑指南:从百度网盘资源到环境配置

1. 为什么选择V-rep以及准备工作 如果你是机器人学或仿真技术的初学者&#xff0c;V-rep&#xff08;现更名为CoppeliaSim&#xff09;绝对是一个值得尝试的仿真平台。它轻量级、跨平台&#xff0c;而且对硬件要求不高&#xff0c;特别适合在个人电脑上进行算法验证和教学演示…...

别再乱加电阻了!手把手教你用SI9000搞定PCB阻抗匹配(附50欧姆计算实例)

高速PCB设计实战&#xff1a;用SI9000精准计算阻抗匹配的工程方法 当信号频率突破百兆赫兹时&#xff0c;PCB走线就不再是简单的电气连接——它们变成了需要精密控制的传输线。去年参与一个千兆以太网项目时&#xff0c;我曾目睹团队因阻抗失配导致信号完整性崩溃的惨痛案例&am…...

AI编程助手效率革命:结构化配置与提示词工程实战

1. 项目概述&#xff1a;一个为AI编程时代量身定制的开发者工具箱如果你和我一样&#xff0c;日常开发已经离不开像 Cursor 和 Claude 这样的 AI 编程助手&#xff0c;那你肯定也遇到过类似的困扰&#xff1a;每次开启一个新项目&#xff0c;或者在不同项目间切换时&#xff0c…...

PiliPlus:用Flutter重新定义你的B站观影体验

PiliPlus&#xff1a;用Flutter重新定义你的B站观影体验 【免费下载链接】PiliPlus PiliPlus 项目地址: https://gitcode.com/gh_mirrors/pi/PiliPlus 在众多视频平台中&#xff0c;B站以其独特的社区文化和丰富内容生态深受用户喜爱。然而&#xff0c;官方客户端的一些…...

半导体行业数据分析:从WSTS报告解读市场趋势与从业者应对策略

1. 从一份行业快报说起&#xff1a;如何解读半导体市场的“水温”早上刚冲好咖啡&#xff0c;习惯性地扫了一眼行业新闻&#xff0c;看到EE Times上这篇关于2013年第一季度全球半导体销售额的简报。标题很直接&#xff1a;“Chip sales up 1% through Q1”。1%的增长&#xff0…...

回归分析:机器学习预测建模的基石与工业实践

1. 项目概述&#xff1a;为什么回归分析是机器学习的“定海神针” 如果你刚接触机器学习&#xff0c;可能会被各种炫酷的算法名字搞得眼花缭乱——神经网络、支持向量机、随机森林……但在所有这些“明星”算法背后&#xff0c;有一个基础得不能再基础&#xff0c;却又重要得不…...

终极SQLC资源管理指南:轻松优化内存、CPU和磁盘使用的7个实用策略

终极SQLC资源管理指南&#xff1a;轻松优化内存、CPU和磁盘使用的7个实用策略 【免费下载链接】sqlc Generate type-safe code from SQL 项目地址: https://gitcode.com/gh_mirrors/sq/sqlc sqlc是一个强大的工具&#xff0c;能够从SQL生成类型安全的代码&#xff0c;帮…...

3分钟快速上手:91160-cli医疗预约自动化助手完整指南

3分钟快速上手&#xff1a;91160-cli医疗预约自动化助手完整指南 【免费下载链接】91160-cli 健康160全自动挂号脚本&#xff0c;捡漏神器 项目地址: https://gitcode.com/gh_mirrors/91/91160-cli 还在为医院挂号难而烦恼吗&#xff1f;91160-cli是一款专为医疗预约设计…...

如何快速破解Cursor Pro限制:一键激活AI编程助手的完整指南

如何快速破解Cursor Pro限制&#xff1a;一键激活AI编程助手的完整指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached you…...