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协程是一种特殊的函数,可以让你在Unity中创建一种类似于多线程的异步操作。它可以在需要等待某个操作完成时,暂停执行当前代码,等待某个条件满足后再继续执行。 在一般情况下 unity中调用函数时,函数将运行到完成状态&#x…...
LeetCode 1250. Check If It Is a Good Array【数论】
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

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

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

安全认证--JWT介绍及使用
安全认证--JWT介绍及使用1.无状态登录原理1.1.什么是有状态?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.无状态登录原理 有状态登录和无状态登录详…...

【计算机组成原理】计算机硬件的基础组成、认识各个硬件部件
计算机组成原理(一) 计算机内部是通过电信号传递数据 电信号:分为高电平和低电平,分别代表1/0 数字、文字、图像如何用二进制表示? CPU如何对二进制数进行加减乘除? 如何存储这些二进制数的? 如何从内存中取出想要的数…...

使用ChIPSeeker进行ChIP-seq, ATAC-seq,cuttag等富集峰的基因组注释
二代测序产生的数据类型 常规的下一代高通量测序(next generation sequencing, NGS)实验通常产生大量短片段(reads),通常我们需要将这些reads比对到参考基因组/转录组上,即将它们置于生物学上有意义的基因背景下,才能…...

第九届蓝桥杯省赛——7缩位求和
题目:在电子计算机普及以前,人们经常用一个粗略的方法来验算四则运算是否正确。比如:248 * 15 3720把乘数和被乘数分别逐位求和,如果是多位数再逐位求和,直到是1位数,得2 4 8 14 > 1 4 5;1 5 65…...

【c++】STL常用容器5—list容器
文章目录list基本概念list构造函数list赋值和交换list大小操作list插入和删除list数据存取list反转和排序list基本概念 功能:将数据进行链式存储。 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链…...

【牛客刷题专栏】0x0D:JZ5 替换空格(C语言编程题)
前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录前言问题…...

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

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

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

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

家庭消耗品跟踪管理软件HomeLists
什么是 HomeLists ? HomeLists 是一款自托管耗材统计软件,能通过提醒等帮助您跟踪家庭消耗品。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 homelists ,选择第一个 aceberg/homelists,版本选择 latest。 本文写作时&…...
django模型简要(1)
1. AbstractUser(内置用户模型类)的使用 ### 需要在settings.py中添加如下: AUTH_USER_MODEL app.MyUser 说明:这是为了覆盖django默认的User model;app即模型所属app,MyUser即AbstractUser实现类。 2.on_delete选项 从django3.…...

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

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

EEGLAB处理运动想象脑电数据
最近在看论文时,经常看到作者处理数据的过程,之前都是一代而过,知道怎么处理就可以了,一直没有实践,最近需要一些特殊的数据,需要自己处理出来,这里尝试着自己用MATLAB处理数据,记录…...
span标签的使用场景
目录 前言 一、span标签是什么? 二、span常用 1.可以嵌套a标签。 2.直接使用 3.加样式使用 4.加按钮使用 5.加a标签的综合使用 6.跟table结合使用 总结 前言 本篇章主要记录一下开发日常中,所常遇见的使用span标签的场景。 一、span标签是什么…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...