Unity携程Coroutine用法

news2024/11/13 9:19:04

一.携程概述

官方的解释是,携程允许你可以在多个帧中执行任务。在Unity中,携程是一个可以暂停并在后续帧中从暂停处继续执行的方法。

二.携程写法

下面示例使用携程和Update打印前5帧的时间间隔,展示了携程的基础写法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class demo2 : MonoBehaviour
{
    private int frameNum = 1;
    void Start()
    {
        StartCoroutine("coroutine");
    }

    public IEnumerator coroutine()
    {
        Debug.Log("coroutine frame1:" + Time.deltaTime);
        yield return null;
        Debug.Log("coroutine frame2:" + Time.deltaTime);
        yield return null;
        Debug.Log("coroutine frame3:" + Time.deltaTime);
        yield return null;
        Debug.Log("coroutine frame4:" + Time.deltaTime);
        yield return null;
        Debug.Log("coroutine frame5:" + Time.deltaTime);
        yield return null;
    }
    void Update()
    {
        if (frameNum <= 5)
        {
            Debug.Log("------ Update:" + frameNum + "  " + Time.deltaTime);
            frameNum++;
        }
    }
}

  • 从打印结果来看,携程和Update一样会每帧调用一次
  • StartCoroutine用于开启携程
  • 返回值类型固定为IEnumerator
  • 返回值yield return null表示下一帧从此处之后开始执行,等同于yield return 一个数字

这里IEnumerator接口和yield关键字是C#的,不了解的可查看前两篇文章

三.Unity规定的携程返回值含义(标红的较为常用)

代码含义
yield return null;  yield retun x(x代表任意数字)下一帧再执行后续代码

yield return new WaitForSeconds(0.1f);

yield return new WaitForSecondsRealtime(0.1f); //不受timescale影响

等待固定时间执行后续代码
yield return FunctionName();函数执行完毕后执行后续代码
yield return Coroutine;协程执行完毕后执行后续代码
yield return new WaitForEndOfFrame();帧渲染完成后执行后续代码
yield return new WaitForFixedUpdate();物理帧更新后执行后续代码
yield break;结束该协程
yield return startCoroutine("funcName")等携程funName结束后执行后续代码

四.携程在事件函数中的执行顺序

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class demo1 : MonoBehaviour
{
    private bool logStart = true;
    void Start()
    {
        StartCoroutine("coroutine1");
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            logStart = !logStart;
            Debug.Log(logStart);
        }
        if (logStart)
        {
            Debug.Log("-------------------");
            Debug.Log("Update:" + Time.deltaTime);
        }
    }
    void LateUpdate()
    {
        if (logStart)
        {
            Debug.Log("LateUpdate:" + Time.deltaTime);
        }
    }

    public IEnumerator coroutine1()
    {
        while (true)
        {
            if (Input.GetKeyDown(KeyCode.S))
            {
                yield break;
            }
            else
            {
                Debug.Log("coroutine1:" + Time.deltaTime);
                yield return null;
            }
        }
    }
}

从打印结果来看,携程在Update之后,LateUpdate之前执行,官网的事件函数示意图也说明了这一点

五.携程的作用

1.替代Update处理一些耗时,按帧执行的任务,避免Update过于复杂

2.处理调用耗时API(比如切换场景)完成后在做什么的情况

六.携程可以传参可以嵌套

下面例子演示了crt1等待crt2结束后再执行后续,并给crt2传递参数

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class demo2 : MonoBehaviour
{
    void Start()
    {
        StartCoroutine("crt1");
    }

    public IEnumerator crt1()
    {
        Debug.Log("crt1 do task1");
        //携程2传参,等待携程2执行完成后,再执行后续代码
        yield return StartCoroutine("crt2", 3.0f);
        Debug.Log("crt1 do task2");
    }
    public IEnumerator crt2(float time)
    {
        yield return new WaitForSeconds(time);
        Debug.Log("crt2 do task after " + time + "sec");
        yield return new WaitForSeconds(2);
        Debug.Log("crt2 finish");
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            StopCoroutine("crt2");
            Debug.Log("crt2 is stopped");
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            StopAllCoroutines();
            Debug.Log("All crt stopped");
        }
    }
}

七.停止携程

StopCoroutine("funcName");  //停止携程funcName
StopAllCoroutines();        //停止脚本内所有携程

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

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

相关文章

vmware + ubuntu + 初始配置(超级用户权限、vim安装、ssh登陆、共享文件夹、git)

1 VMware Ubuntu下载与安装 下载与安装 2 使用超级用户权限 &#xff08;1&#xff09;执行命令&#xff1a;sudo passwd root 然后在弹出的密码中输入密码即可&#xff0c;具体如下&#xff1a; 第一个密码是当前用户密码 后面两个是root用户密码 //推荐使用一个密码 3 vi…

SEMIDRIVE X9E Flash 调试要点

一、前言 客户采用芯驰 X9E 平台做的 T-BOX 产品&#xff0c;因为客户选用的 Flash 型号不在 SemiDrive_Memory 支持列表里面&#xff0c;出现机器能烧录不能启动的问题。接下来我们对这个问题进行调试。 二、SEMIDRIVE X9E Flash 调试要点 ① 客户的板子 Flash 型号为 GD25LQ…

43集 ESP32 编译调试出错的解决方法汇总

43集 ESP32 编译调试出错的解决方法汇总 1、提示找不到如下头文件&#xff0c;分别对应adf的component #include “esp_peripherals.h” esp_peripherals #include “audio_element.h” audio_pipeline #include “audio_common.h” audio_pipeline 这几个头文件都是esp-adf里…

【全网首发】2024华为OD机试 E卷D卷抽中题库清单(全真题库,持续更新)含考点说明

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

Git 原理(提交对象)(结合图与案例)

Git 原理&#xff08;提交对象&#xff09; 这一块主要讲述下 Git 的原理。 在进行提交操作时&#xff0c;Git 会保存一个提交对象&#xff08;commit object&#xff09;&#xff1a; 该提交对象会包含一个指向暂存内容快照的指针&#xff1b; 该提交对象还包含了作者的姓…

【MYSQL中数据库的约束以及表的设计】

MYSQL中数据库的约束和表的设计 一、数据库的约束1.1 NULL约束1.2 UNIQUE&#xff1a;唯一约束1.3 DEFAULT&#xff1a;默认值约束1.4 PRIMARY KEY&#xff1a;主键约束1.5 FOREIGN KEY &#xff1a;外键约束1.6 CHECK 约束 二、表的设计2.1 第一范式&#xff08;1NF&#xff0…

Python面试宝典第49题:字符串压缩

题目 给你一个字符数组chars &#xff0c;请使用下述算法进行压缩。 1、从一个空字符串s开始&#xff0c;对于chars中的每组连续重复字符 &#xff1a; &#xff08;1&#xff09;如果这一组长度为1 &#xff0c;则将字符追加到s中。 &#xff08;2&#xff09;否则&#xff0c…

易灵思FPGA开发(一)——软件安装

一、资料下载 VF-T20F256-深圳市奥唯思科技有限公司_FPGA图像开发_MIPI (szovs.com) 二、软件安装 安装USB下载器驱动 双击第一个.msi文件进行安装 奥唯思FPGA网盘汇总 (szovs.com) 下载Gtkwave软件

初始MYSQL数据库(5)—— 索引

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 目录 索引的概念 索引选择的数据结构 MySQL中的页的相关知识 索引的分类 主键索引 普通索引 唯一索引 非聚集索引 回表查询…

基于python+django+vue的宠物服务管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的宠…

云原生(Cloud Native)简介及相关技术

云原生&#xff08;Cloud Native&#xff09;简介及相关技术 什么是云原生&#xff1f; 云原生&#xff08;Cloud Native&#xff09;是一种设计和开发应用程序的方法&#xff0c;旨在充分利用云计算的弹性、可扩展性和分布式架构优势。通过采用微服务架构、容器化、持续集成…

【自动驾驶】决策规划算法(一)决策规划仿真平台搭建 | Matlab + Prescan + Carsim 联合仿真基本操作

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

Java | Leetcode Java题解之第413题等差数列划分

题目&#xff1a; 题解&#xff1a; class Solution {public int numberOfArithmeticSlices(int[] nums) {int n nums.length;if (n 1) {return 0;}int d nums[0] - nums[1], t 0;int ans 0;// 因为等差数列的长度至少为 3&#xff0c;所以可以从 i2 开始枚举for (int i …

硬件工程师笔试面试——集成电路

目录 17、集成电路 17.1 基础 集成电路实物图 17.1.1 概念 17.1.2 集成电路的发展历程 17.1.3 集成电路的分类 17.1.4 集成电路的制造工艺 17.1.5 集成电路的应用 17.2 相关问题 17.2.1 集成电路的制造工艺中,光刻技术是如何实现的? 17.2.2 在集成电路设计中,如何…

【Python百日进阶-Web开发-FastAPI】Day801 - FastAPI是什么

文章目录 一、官网二、FastAPI是什么三、FastAPI特性3.1 基于开放标准3.2 自动生成文档3.3 更主流的 Python3.4 编辑器支持3.5 简洁3.6 验证3.7 安全性及身份验证3.8 依赖注入3.9 无限制"插件"3.10 测试四、Starlette 特性五、Pydantic 特性六、Python 类型提示简介6…

DERP靶机详解

靶机下载地址 https://www.vulnhub.com/entry/derpnstink-1,221/ 靶机配置 默认是桥接模式&#xff0c;切换为NAT模式后重启靶机 主机发现 arp-scan -l 端口扫描 nmap -sV -A -T4 192.168.229.158 访问网页 http://192.168.229.158/ 目录扫描 python dirsearch.py -u htt…

css边框修饰

一、设置线条样式 通过 border-style 属性设置&#xff0c;可选择的一些属性如下&#xff1a; dotted&#xff1a;点线 dashed&#xff1a;虚线 solid&#xff1a;实线 double&#xff1a;双实线 效果如下&#xff1a; 二、设置边框线宽度 ① 通过 border-width 整体设置…

量化在密集向量检索中的权衡:深入分析索引时间、查询效率与召回效果

在现代信息检索系统中&#xff0c;向量搜索已成为提升检索质量和效率的关键技术。随着数据量的激增&#xff0c;如何高效地处理和检索大规模向量数据集&#xff0c;成为了一个重要课题。最近&#xff0c;我在研究一篇关于密集和稀疏检索器的论文——《Operational Advice for D…

【图像匹配】基于Harris算法的图像匹配,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于基于Harris算法的图像匹配&#xff0c;用matlab实现。 一、案例背景和算法介绍 …

无人机培训机构技术股份合作探讨

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、物流、环境监测、应急救援等多个领域展现出巨大潜力&#xff0c;市场对无人机专业人才的需求急剧增加。鉴于此&#xff0c;多家致力于无人机培训教育的机构决定携手合作&#xff0c;通过技术股份合作模式&#xff0c;共同…