【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.rhkb.cn/news/299581.html

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

相关文章

数据结构和算法:分治

分治算法 分治(divide and conquer),全称分而治之,是一种非常重要且常见的算法策略。分治通常基于递归实现,包括“分”和“治”两个步骤。 1.分(划分阶段):递归地将原问题分解为两个…

爬虫部署平台crawlab使用说明

Crawlab 是一个基于 Go 语言的分布式网络爬虫管理平台,它支持 Python、Node.js、Jar、EXE 等多种类型的爬虫。 Crawlab 提供了一个可视化的界面,并且可以通过简单的配置来管理和监控爬虫程序。 以下是 Crawlab 的一些主要优点: 集中管理&am…

数据库不用mmap

你确定你想用 MMAP 实现数据库么?_哔哩哔哩_bilibili MMAP 的随机读与顺序读的性能表现不好,以及对于写主要是不可控的刷入时机以及代码冗余,所以 MMAP 不适合在数据库中使用。 mmap是posix系统调用,它提供由操作系统管理内存映…

自定义实现shell/bash

文章目录 函数和进程之间的相似性shell打印提示符,以及获取用户输入分割用户的输入判断是否是内建命令执行相关的命令 全部代码 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默&#…

GIT版本管理使用示例

一、创建好远程代码仓库后,复制远程仓库的地址 二、新建一个文件夹,在文件夹里打开Git Bash Here 三、输入git clone 远程仓库地址,仓库就初始化完成了 四、新建一个文本文件,假设这是我们开发的代码 五、打开文本,假设…

【深度学习】海洋生物数据集,图片分类

文章目录 任务描述数据收集数据处理模型训练指标评测web app代码和帮助 任务描述 收集9种以上的海洋生物图片,然后基于深度学习做一个分类模型,训练完成后,分类模型就可以对未知图片进行分类。 在之后随便传一张图片,分类模型就…

《乡土中国》中国基层传统社会里的一种体系,支配着社会生活的各方面 - 三余书屋 3ysw.net

乡土中国 大家好,今天我们要解读的是费孝通先生的经典著作《乡土中国》。这本书的中文版大约有10万字,我将用30分钟左右的时间为你解读书中的精髓。为什么说中国的根基在于乡土社会?我们应该从哪些方面来理解乡土社会的特征及其重要性&#…

解压缩软件哪个好用 Mac免费解压软件哪个好 解压软件推荐 beeterzip免费下载

解压缩软件在Mac办公中是必不可少的,不仅能够节省时间和内存,更能提升传输效率。虽然Mac自带的解压缩软件归档实用工具可以对zip文件进行解压,但是对于他格式文件就无能为力了。 因此,想要满足多类型文件解压缩需求,可…

HarmonyOS4.0 ArkTS基本语法

一、项目目录结构 二、HelloWorld 当我们创建一个新的page时,IDE会给我们生成一个HelloWorld的模板 新建page 开启预览器 三、ArkTS基本组成 装饰器: 用于装饰类、结构、方法以及变量,并赋予其特殊的含义。如上述示例中Entry、Component…

centos7部分桥接网络ping不通解决方案

更改网络模式 将部分网络模式改为NAT 查看NAT之后的ip地址 我们可以在虚拟网络配置里面看 或者在我们的cmd里面 输入 ipconfig,进行查看 更改网络配置文件 就是去寻找新的地址,然后,这里注意我们 网关和我们DNS地址一样 网关和我们DNS…

自动驾驶_交通标志识别:各目标检测算法评测

自动驾驶|交通标志识别:各目标检测算法评测 论文题目:Evaluation of Deep Neural Networks for traffic sign detection systems 开源代码:https://github.com/aarcosg/traffic-sign-detection 附赠自动驾驶学习资料和量产经验:…

【C语言自定义类型之----结构体,联合体和枚举】

一.结构体 1.结构体类型的声明 srruct tag {nemer-list;//成员列表 }varible-list;//变量列表结构体在声明的时候,可以不完全声明。 例如:描述一个学生 struct stu {char name[20];//名字int age;//年龄char sex[20];//性别 };//分号不能省略2.结构体…

44.网络游戏逆向分析与漏洞攻防-角色管理功能通信分析-角色创建服务器反馈数据包分析

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 现在的代码都是依据数据包来写的,如果看不懂代码,就说明没看懂数据包…

瑞_Redis_商户查询缓存_添加Redis缓存缓存更新策略

文章目录 项目介绍1 短信登录2 商户查询缓存2.1 什么是缓存2.1.1 缓存的应用场景2.1.2 为什么要使用缓存2.1.3 Web应用中缓存的作用2.1.4 Web应用中缓存的成本 2.2 添加Redis缓存2.2.1 背景2.2.2 缓存模型和思路2.2.3 代码实现2.2.4 测试附:IDEA控制台输出自动换行设…

C# 分布式自增ID算法snowflake(雪花算法)

文章目录 1. 概述2. 结构3. 代码3.1 IdWorker.cs3.2 IdWorkerTest.cs (测试) 1. 概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长&#xff0c…

【realme x2手机解锁BootLoader(简称BL)】

realme手机解锁常识 https://www.realme.com/cn/support/kw/doc/2031665 realme手机解锁支持型号 https://www.realmebbs.com/post-details/1275426081138028544 realme x2手机解锁实践 参考:https://www.realmebbs.com/post-details/1255473809142591488 1 下载apk…

【研发管理】产品经理知识体系-数字化战略

导读: 数字化战略对于企业的长期发展具有重要意义。实施数字化战略需要企业从多个方面进行数字化转型和优化,以提高效率和创新能力,并实现长期竞争力和增长。 目录 1、定义 2、数字化战略必要性 3、数字战略框架 4、数字化转型对产品和服务设计的影响…

虚幻UE5数字孪生蓝图开发教程

一、背景 这几年,智慧城市/智慧交通/智慧水利等飞速发展,骑士特意为大家做了一个这块的学习路线。 二、这是学习大纲 1.给虚幻UE5初学者准备的智慧城市/数字孪生蓝图开发教程 https://www.bilibili.com/video/BV1894y1u78G 2.UE5数字孪生蓝图开发教学…

【微信小程序】【小程序样式加载不出来】

微信小程序配置sass 第一步:找配置文件 在项目中找到 project.config.json文件,在setting属性中添加 useCompilerPlugins属性,值为sass即可,若是 less,将数组里面的值改为less即可 "useCompilerPlugins": ["sas…

PyTorch之计算模型推理时间

一、参考资料 如何测试模型的推理速度 Pytorch 测试模型的推理速度 二、计算PyTorch模型推理时间 1. 计算CPU推理时间 import torch import torchvision import time import tqdm from torchsummary import summarydef calcCPUTime():model torchvision.models.resnet18()…