【unity】【C#】延时调用(协程)和场景管理

文章目录

  • 什么是协程
  • 协程的应用 - IEnumerator
  • 如何控制协程的暂停
  • 协程的另一种写法 - Invoke
  • 场景管理


多看代码块中的注释

什么是协程

A coroutine alows vou to spreacwhere it left off on the following anc return control toolinencoeframe.
协程允许您将任务分布在多个帧中。在 Unity 中,协程是一种方法可以暂停执行并将控制权返回给 Unity,然后在下一帧中从中断的地方继续。

In most situations,whenyou cal a method,it runs to completion and then retumns control to the caling method,plus any optional return vales.This means that any acion that takes place within amethod must happen within a single frame update.
在大多数情况下,调用方法时,它会运行到完成,然后将控制权返回给调用方法以及任何可选的返回值。这意味着在方法中发生的任何操作都必须在单个帧更新中发生。

n situations where you would like to use a method cal to contain a procedural animation or a seauence of events over time. you can use a coroutine如果希望使用方法调用来包含过程动画或随时间推移的事件序列,则可以使用协程

Howelver its imporeant to rememoerthat coroutines arent threads. Sinchronous operations thatrun within a coroutine stlexecute on the main thread.f you wantorecucethe amountof CpUtimespent on the mainthread,i’sjust as important to avoid blocking perations in coroutines as in any other secript code.fyouwanto use mult;threaded codewithin Uhiy, consider the C# Job System.但是,重要的是要记住协程不是线程。在协程中运行的同步操作仍在主线程上执行。如果要减少在主线程上花费的 CPU 时间,避免在协程中阳塞操作与在任何其他脚本代码中一样重要。如果要在 uniy 中使用多线程代码,请考虑 C# 作业系统,

It’s best to use coroutines if you need to deal with long asynchronous operations, such as waiing for HTTP transfers, asset loads,or file l/0 to complete如果需要处理长时间的异步操作,例如等待 HTTP 传输、资产加载或文件 V/0 完成,最好使用协程。

简单来说
协程,即为协同程序. Unity中的协程由协程函数和协程调度器两部分构成.协程函数使用的是C#的迭代器, 协程调度器则利用了MonoBehaviour中的生命周期函数来实现. 协程函数实现了分步, 协程调度器实现了分时.

注:因为协程分时分步执行的特性,当多个协程的耗时操作挤在同一时间执行也会造成卡顿。


协程的应用 - IEnumerator

我们先建立一个cube一段C#代码一起放进新创建的空件 EP18_01_Delay call

在这里插入图片描述
代码具体如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class EP18_01_Delaycall : MonoBehaviour
{public GameObject cubeGo;// Start is called before the first frame updatevoid Start(){StartCoroutine(DelayInstantiate());//正常方法是不会等协程的}// Update is called once per framevoid Update(){}//IEnumerator DelayInstantiate(){Debug.Log("协程开始了");yield return new WaitForSeconds(3);//等待3秒//yield return 0;//数字0没有意义,多少都一样,都是等待一帧Instantiate(cubeGo);}
}

在保存好源码后运行,等待3秒后就会在场景中原位置克隆一个新的cube
但是这样是不是还没法理解协程的意义

我们先利用一个新的方法名Test,验证一般情况下整个场景的运行情况

    void Start(){Debug.Log(1);Debug.Log(2);Test(0);//调用方法}private void Test(int num){Debug.Log(num);}

它几乎第一时间就把这些信息都打印出来了
在这里插入图片描述
但是换成协程试试

    void Start(){StartCoroutine(DelayInstantiate());//正常方法是不会等协程的Debug.Log(1);Debug.Log(2);Test(0);//调用方法}IEnumerator DelayInstantiate(){Debug.Log("协程开始了");yield return new WaitForSeconds(3);//等待3秒//yield return 0;//数字没有意义,都是等待一帧Debug.Log(3);Instantiate(cubeGo);}

明明是最早的语句,但是3秒后才打印出来(这里差4秒是因为毫秒的存在)
在这里插入图片描述

这样看过来,我们还能意识到一点,就是在携程运行时,主程序不会等待写成程序运行完后在进行,而是一起进行,所以我们可以看成写成程序是一种分支运行方法,不影响主程序进程

如何控制协程的暂停

有的时候,我们在游戏过程中,可能因为一些原因需要停止并关闭掉一些正在运行流程,这种方法在C#中有两种常用的方法

第一种方法是用方法名的字符串形式,在Updata里通过某种操作(笔者通过按下S键)来停止

    void Start(){StartCoroutine("DelayInstantiate");//以字符串名的形式运行Debug.Log(1);Debug.Log(2);Test(0);//调用方法}void Update(){if(Input.GetKeyDown(KeyCode.S))//按下S时{//StopAllCoroutines();//停止整个协程StopCoroutine("DelayInstantiate");}}

第二种方法不用协程方法名的字符串,直接用其本身,不同的是需要定义一个程序内部的全局变量,通过这个变量作为媒介联系协程

    private Coroutine coroutine;//内部全局变量void Start(){coroutine = StartCoroutine(DelayInstantiate());Debug.Log(1);Debug.Log(2);Test(0);//调用方法}void Update(){if(Input.GetKeyDown(KeyCode.S))//按下S时{//StopAllCoroutines();//停止整个协程StopCoroutine(coroutine);}}

协程的另一种写法 - Invoke

这里我们新创建一个方法用来克隆立方体,然后利用Invoke来进行协程

    void Start(){Invoke("InstantantiateCube",3);//3意味着3秒后运行方法}private void InstantantiateCube(){Instantiate(cubeGo);}

最后也是成功克隆(这里将克隆后的立方体进行了移动)
在这里插入图片描述
还有一种循环协程的方法

InvokeRepeating("InstantantiateCube", 3, 1);//1表示等3秒后第一个立方体克隆完后,每1秒后在克隆一次)

成功克隆(为了看得清楚,笔者进行了移动)
在这里插入图片描述


场景管理

我们先创建两个新的场景 test1test2,并在 test2 里创建一个立方体
在这里插入图片描述
然后调出右上角的场景管理器
在这里插入图片描述
全部添加进去
在这里插入图片描述
重新编辑一块代码如下,我们会发现在1秒后将原来默认的SampleScene场景变成了1号场景test1

using System.Collections;
using System.Collections.Generic;
using UnityEngine;using UnityEngine.SceneManagement;//场景的命名空间public class EP18_02_ : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Invoke("LoadScene",2);}// Update is called once per framevoid Update(){}private void LoadScene(){SceneManager.LoadScene(1);//加载第1个场景}
}

同理也是可以进行别的场景替换

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打造你的专属云开发环境:支持任意 IDE,任意云服务 | 开源日报 No.215

loft-sh/devpod Stars: 6.9k License: MPL-2.0 devpod 是一个开源的、仅限客户端的、不受限制的工具,可以与任何集成开发环境(IDE)一起使用,并允许您在任何云端、Kubernetes 或本地 Docker 上进行开发。 使用 devcontainer.json…

Github 2024-04-06Rust开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10HTML项目1Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero General …

基于Whisper的实时语音识别(1): 流式显示视频帧和音频帧

Whistream (微流)是基于openai-whisper 大语音模型下的流式语音识别工具 本期主要介绍实时显示工具Whishow,可以实时逐帧显示视频流(RTSP/RTMP)和离线文件(mp4,avi等) 下载地址:ht…

K8S之Job和CronJob控制器

这里写目录标题 Job概念适用场景使用案例 CronJob概念适用场景使用案例 Job 概念 Job控制器用于管理Pod对象运行一次性任务,例如:对数据库备份,可以直接在k8s上启动一个mysqldump备份程序,也可以启动一个pod,这个pod…

Node.JS多线程PromisePool之promise-pool库实现

什么是Promise Pool Map-like, concurrent promise processing for Node.js. Promise-Pool是一个用于管理并发请求的JavaScript库,它可以限制同时进行的请求数量,以避免过多的请求导致服务器压力过大。使用Promise-Pool可以方便地实现对多个异步操作的并…

阿里云倚天云服务器详解_CPU采用倚天710处理器

阿里云倚天云服务器CPU采用倚天710处理器,租用倚天服务器c8y、g8y和r8y可以享受优惠价格,阿里云服务器网aliyunfuwuqi.com整理倚天云服务器详细介绍、倚天710处理器性能测评、CIPU架构优势、倚天服务器使用场景及生态支持: 阿里云倚天云服务…

Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏,无法打开。您应该将它移到废纸篓

应该是保姆级教程了: Mac苹果电脑air/pro包含m1~m3打开app显示弹框“xxx”已损坏,无法打开。您应该将它移到废纸篓。 我下载的是 Sublime Text 3 for Mac中文直装版,https://www.32r.com/soft/38404.html 安装后打开就gg了: 表现…

计算机网络练习-计算机网络概述与性能指标

计算机网络概述 ----------------------------------------------------------------------------------------------------------------------------- 1. 计算机网络最据本的功能的是( )。 1,差错控制 Ⅱ.路由选择 Ⅲ,分布式处理 IV.传输控制 …

TiDB 组件 GC 原理及常见问题

本文详细介绍了 TiDB 的 Garbage Collection(GC)机制及其在 TiDB 组件中的实现原理和常见问题排查方法。 TiDB 底层使用单机存储引擎 RocksDB,并通过 MVCC 机制,基于 RocksDB 实现了分布式存储引擎 TiKV,以支持高可用分…

docker搭建EFK

目录 elasticsearch1.创建网络2.拉取镜像3.创建容器如果出现启动失败,提示目录挂载失败,可以考虑如下措施 开放防火墙端口4.验证安装成功重置es密码关闭https连接创建kibana用户创建新账户给账户授权 kibana1.创建容器2.验证安装成功3.es为kibana创建用户…

【智能排班系统】雪花算法生成分布式ID

文章目录 雪花算法介绍起源与命名基本原理与结构优势与特点应用场景 代码实现代码结构自定义机器标识RandomWorkIdChooseLocalRedisWorkIdChooselua脚本 实体类SnowflakeIdInfoWorkCenterInfo 雪花算法类配置类雪花算法工具类 说明 雪花算法介绍 在复杂而庞大的分布式系统中&a…

【Flutter】Getx设计模式及Provider、Repository、Controller、View等

本文基于Getx 4,x 本本 1、引入 再次接触到Flutter项目,社区俨然很完善和活跃。pubs.dev 寻找状态管理的时候看到很熟悉的Getx时间,俨然发现Getx的版本已到是4.x版本,看到Getx的功能已经非常强大了,庞大的API俨然成为一种开发框架…