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

news2024/11/18 10:57:08

文章目录

  • 什么是协程
  • 协程的应用 - 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个场景
    }
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android14应用启动流程(源码+Trace)

1.简介 应用启动过程快的都不需要一秒钟,但这整个过程的执行是比较复杂的,无论是对手机厂商、应用开发来说启动速度也是核心用户体验指标之一,本文采用Android14源码与perfetto工具进行解析。 源码参考地址:Search trace分析工…

【二分查找】Leetcode 在排序数组中查找元素的第一个和最后一个位置

题目解析 34. 在排序数组中查找元素的第一个和最后一个位置 我们使用暴力方法进行算法演化,寻找一个数字的区间,我们可以顺序查找,记录最终结果 首先数组是有序的,所以使用二分法很好上手,但是我们就仅仅使用上一道题…

第四百四十二回 再谈flutter_launcher_icons包

文章目录 1. 概念介绍2. 使用方法3. 示例代码4. 经验与总结4.1 经验分享4.2 内容总结 我们在上一章回中介绍了"overlay_tooltip简介"相关的内容,本章回中将 再谈flutter_launcher_icons包.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 …

配置vscode链接linux

1.安装 remote SSH 2.按F1 ssh ljh服务器公网ip 3. 选择保存远端host到本地 某位置 等待片刻后 4. 切换到远程资源管理器中 应该可以看到一台电脑,右键在当前窗口链接,输入你的服务器用户密码后电脑变绿说明远程连接成功 5.一定要登陆上云服务器后再…

Day:004(2) | Python爬虫:高效数据抓取的编程技术(数据解析)

正则表达式实战-腾讯新闻 需求: 使用正则获取腾讯新闻标题内容 网站:https://sports.qq.com/ 代码: import reimport requests from fake_useragent import UserAgenturl https://sports.qq.com/ # 构建请求头信息 headers {User-Agent:…

【JavaWeb】Day33.MySQL概述

什么是数据库 数据库:英文为 DataBase,简称DB,它是存储和管理数据的仓库。 像我们日常访问的电商网站京东,企业内部的管理系统OA、ERP、CRM这类的系统,以及大家每天都会刷的头条、抖音类的app,那这些大家所…

前端学习之DOM编程星星点灯案例

这个案例的实现逻辑是当你点击屏幕时&#xff0c;会完成一个事件&#xff0c;在你的屏幕上生成一张星星图片。然后再设置星星图片的大小将其改为随机。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><t…

K8S基于containerd做容器从harbor拉取镜

实现创建pod时&#xff0c;通过指定harbor仓库里的镜像来运行pod 检查&#xff1a;K8S是不是用containerd做容器运行时&#xff0c;以及containerd的版本是不是小于1.6.22 kubectl get nodes -owide1、如果containerd小于 1.6.22&#xff0c;需要先升级containerd 先卸载旧的…

C/C++预处理过程

目录 前言&#xff1a; 1. 预定义符号 2. #define定义常量 3. #define定义宏 4. 带有副作用的宏参数 5. 宏替换的规则 6. 宏和函数的对比 7. #和## 8. 命名约定 9. #undef 10. 命令行定义 11. 条件编译 12. 头文件的包含 13. 其他预处理指令 总结&#x…

最新高自定义化的AI翻译(沉浸式翻译),可翻译网页和PDF等文件或者文献(附翻译API总结,Deeplx的api,Deepl的api)

前序 常见问题&#xff1a; 1.有时候想翻译网页&#xff0c;又翻译文献怎么办&#xff1f;下两个软件&#xff1f; 2.什么软件可以翻译视频字幕&#xff1f; 3.什么软件可以翻译PDF文件&#xff1f; 沉浸式翻译介绍 可以翻译文献可以翻译视频字幕可以翻译PDF文件支持OpenAI翻译…

7 个 iMessage 恢复应用程序/软件可轻松恢复文本

由于误操作、iOS 升级中断、越狱失败、设备损坏等原因&#xff0c;您可能会丢失 iPhone/iPad 上的 iMessages。意外删除很大程度上增加了这种可能性。更糟糕的是&#xff0c;这种情况经常发生在 iDevice 缺乏备份的情况下。 &#xff08;iPhone消息消失还占用空间&#xff1f;&…

很多名人让人们警惕人工智能,这是为何?

很多名人让人们警惕人工智能的原因可以从多个角度来理解。首先&#xff0c;人工智能作为一个快速发展的领域&#xff0c;具有巨大的潜力和未知性。它涉及到机器学习、深度学习、神经网络等多个复杂的技术领域&#xff0c;而这些技术正日益渗透到我们的日常生活中&#xff0c;从…

JWT/JWS/JWE

JWT(JSON Web Token)&#xff1a;一种基于JSON格式&#xff0c;用于在Web应用中安全传递用户身份验证和授权信息的标准令牌&#xff0c;可以包含签名(JWS)和加密(JWE)的信息 MacAlgorithm(Message Authentication Code Algorithm)&#xff1a;消息认证码算法 HMAC(Hash-based…

【51单片机入门记录】RTC(实时时钟)-DS1302应用

目录 一、DS1302相关写函数 &#xff08;1&#xff09;Write&#xff3f;Ds1302 &#xff08;2&#xff09;Write&#xff3f;Ds1302&#xff3f;Byte 二、DS130相关数据操作流程及相关代码 &#xff08;1&#xff09;DS1302初始化数据操作流程及相关代码 (shijian[i]/10&…

阿里云4核8G服务器ECS通用算力型u1实例优惠价格

阿里云4核8G服务器优惠价格955元一年&#xff0c;配置为ECS通用算力型u1实例&#xff08;ecs.u1-c1m2.xlarge&#xff09;4核8G配置、1M到3M带宽可选、ESSD Entry系统盘20G到40G可选&#xff0c;CPU采用Intel(R) Xeon(R) Platinum处理器&#xff0c;阿里云活动链接 aliyunfuwuq…

2023年度总结:允许迷茫,破除迷茫;专注自身,把握当下

0、前言 &#x1f4dc;为什么24年已经过了几个月&#xff0c;才提笔写这年度总结呢&#xff1f;毫不羞愧直问我的内心&#xff0c;其实就是懒罢了。直到前几天朋友看到了我去年写的总结&#xff0c;我自己点进那篇总结&#xff0c;完完整整的看了一遍&#xff0c;又翻看我23年…

C#使用Selenium驱动Chrome浏览器

1.Selenium库依赖安装 Selenium WebDriver是Selenium项目的一部分&#xff0c;用于模拟用户在Web应用程序中的交互操作。它支持多种浏览器&#xff0c;如Chrome、Firefox、IE等&#xff0c;且与各种编程语言&#xff08;如Java、Python、C#等&#xff09;兼容&#xff0c;具有…

探索Linux的挂载操作

在Linux这个强大的操作系统中&#xff0c;挂载操作是一个基本而重要的概念。它涉及到文件系统、设备和数据访问&#xff0c;对于理解Linux的工作方式至关重要。那么&#xff0c;挂载操作究竟是什么&#xff0c;为什么我们需要它&#xff0c;如果没有它&#xff0c;我们将面临什…

SQL注入---POST注入

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一. POST提交概述 在Webshell文章中介绍过post提交和get提交的区别&#xff0c;这里不再赘述 post提交和get提交的区别&#xff1a; get方式提交URL中的参数信息&#xff0c;post方式则是将信…

【Frida】【Android】 工具篇:查壳工具大赏

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…