【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 update
    void Start()
    {
        StartCoroutine(DelayInstantiate());//正常方法是不会等协程的
    }

    // Update is called once per frame
    void 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 update
    void Start()
    {
        Invoke("LoadScene",2);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    private void LoadScene()
    {
        SceneManager.LoadScene(1);//加载第1个场景
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拦截器抛出异常无法被全局异常处理器捕获问题

文章目录 基本说明问题描述问题原因解决方法前端执行的所有请求都通过Controller,而不是直接访问html定义一个/error路径的方法 总结 基本说明 我的前后端项目是放在一起的,前后端都是由springMVC进行控制,但是现在我在拦截器的preHandle方法…

HAL STM32主从定时器联级使用

HAL STM32主从定时器联级使用 具体介绍参考STM32参考手册 🌿主从定时器联级:使用一个定时器作为另一个定时器的预分频器。 🍁时钟关系: 🌿TIM1 和TIM8 控制寄存器 2(TIMx_CR2)相关位: 🔖主…

Redis性能管理及主从复制、哨兵的配置与部署

一、redis性能管理 1.1 查看Redis内存使用 1.2 内存碎片率 1.3 内存使用率 1.3.1 避免内存交换发生的方法 1.4 内回收key 1.4.1 配置文件中修改 maxmemory-policy 属性值 1.5 缓存穿透 1.5.1 原因 1.5.2 条件 1.5.3 解决方案 1.6 缓存击穿 1.6.1 原因 1.6.2 现象…

移位运算与乘法

描述 题目描述: 已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输入的d有效(d给出的信号的上升沿表示写入有效) 信号示意图: 波形示意图: 输入描述&#…

Leetcode 215. 数组中的第K个最大元素

心路历程: 这道题本质上是排序不完全的过程,而且这道题有bug,直接用python的排序算法其实就能AC。 可以按照快排排到找到k-1个large元素的思维去做,不过这道题需要考虑空间复杂度,所以需要用指针快排。 其实也可以考虑…

SUPS:一种用于自动驾驶的仿真地下泊车场景数据集

SUPS:一种用于自动驾驶的仿真地下泊车场景数据集 附赠自动驾驶学习资料和量产经验:链接 摘要 本文介绍了SUPS:一种用于自动驾驶的仿真地下泊车场景数据集。随着自动驾驶的范围扩大,自动地下泊车引起了人们极大的关注。自动驾驶汽…

【stm32】软件I2C读写MPU6050

软件I2C读写MPU6050(文章最后附上源码) 编码 概况 首先建立通信层的.c和.h模块 在通信层里写好I2C底层的GPIO初始化 以及6个时序基本单元 起始、终值、发送一个字节、接收一个字节、发送应答、接收应答 写好I2C通信层之后,再建立MPU6050的.c和.h模块 基于I2C通…

京东云幻兽帕鲁4核16G服务器优惠价格26元1个月、398元一年

京东云幻兽帕鲁4核16G服务器优惠价格26元1个月、658元1年、三年3098元,配置为:轻量云主机4C16G-100G SSD系统盘-5M带宽-1000G月流量 华北-北京,京东云优惠活动 yunfuwuqiba.com/go/jd 活动链接打开如下图: 幻兽帕鲁4核16G服务器优…

计算机网络-TCP重传、滑动窗口、流量控制、拥塞控制

重传机制 超时重传:超时重传时间(RTO)设定为略大于RTT(动态)。触发场景包括自己发送的数据包丢失和别人给自己的回应数据包丢失。启动重传机制后如果还没有收到数据包,则RTO设置为上次的两倍,直…

双连通分量算法

1. 连通图概念 连通图:无向图任意两点之间存在通路。 强连通:有向图(前提)中,任意两点都有至少一条通路,则此图为强连通图。 弱连通图:将有向图的有向边换成无向边得到的图是连通图&#xff0c…

Tomcat管理配置

Tomcat管理配置 1 host-manager项目2 manager项目 Tomcat 提供了Web版的管理控制台,位于webapps目录下。Tomcat 提供了用于管理Host的host-manager和用于管理Web应用的manager。 1 host-manager项目 Tomcat启动之后,可以通过 http://localhost:8080/ho…

Cortex-M7 外设(peripherals)总览

1 PPB内存映射总览 由Cortex-M7的内存映射模型可知,0xE000_0000~0xE00F_FFFF地址空间为私有外设总线 (Private peripheral bus,PPB)的内存区域,其具体的地址映射如表1所示。 表1 PPB寄存器内存映射 其中,注释后缀的相关含义如…

5.5.1MFC对话框——文件对话框

本文仅供学习交流,严禁用于商业用途,如本文涉及侵权请及时联系将于24小时内删除 目录 1.实验原理 2.示例说明 1.实验原理 CFileDialog类 用CFileDialog类提供的通用文件对话框,实现Windows标准的【打开】和【另存为】功能。 CFileD…

前端canvas项目实战——在线图文编辑器(八):复制、删除、锁定、层叠顺序

目录 前言一、效果展示二、实现步骤1. 复制2. 删除3. 锁定4. 层叠顺序 三、实现过程中发现的bug1. clone方法不复制自定义属性2. 复制「锁定」状态的对象,得到的新对象也是「锁定」状态 四、Show u the code后记 前言 上一篇博文中,我们细致的讲解了实现…

如何在没有备份的情况下从 iPad 恢复照片?

有很多操作都可能导致iPad照片丢失,包括误删除、出厂设置、iPad的iOS更新等。如果没有备份,似乎没有办法找回它们。然而,即使您将备份保留在 iCloud 或iTunes上,这些方式也需要您的 iPad 首先重置,从而用备份内容覆盖当…

Java-类型转换

Java数据类型转换的规则掌握后,将使我们对以后的学习事半功倍,下面是我列出的一些重点。 类型转换 由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。底到高依次是:byte,short,char->int->lo…

AJAX 原理

一、AJAX原理 - XMLHttpRequest 定义: 关系:axios 内部采用 XMLHttpRequest 与服务器交互。 好处:掌握使用 XHR 与服务器进行数据交互,了解 axios 内部原理。 1.1 使用 XMLHttpRequest: 步骤: 1. 创建 XM…

OpenHarmony开发-系统烧录

本文详细介绍了烧录OpenHarmony系统到开发板的操作流程。从基础的硬件准备和软件环境设置入手,详细说明了如何配置开发环境、构建系统镜像等过程,详细描述了烧录过程中的关键步骤,以及如何使用专用工具将OpenHarmony系统镜像传输到开发板。同…

ffmpeg 将多个视频片段合成一个视频

ffmpeg 将多个视频片段合成一个视频 References 网络视频 6 分钟的诅咒。 新建文本文件 filelist.txt filelist.txtfile output_train_video_0.mp4 file output_train_video_1.mp4 file output_train_video_2.mp4 file output_train_video_3.mp4 file output_train_video_4.m…

PowerJob 分布式任务调度简介

目录 适用场景 设计目标 PowerJob 功能全景 任务调度 工作流 分布式计算 动态容器 什么是动态容器? 使用场景 可维护性和灵活性的完美结合 实时日志&在线运维 PowerJob 系统组件 PowerJob 应用场景 PowerJob 的优势 PowerJob(原OhMyScheduler&…