【unity知识点】Unity 协程Coroutine

news2024/11/25 23:48:15

文章目录

  • 前言
  • 使用协程的步骤:
  • 使用场景示例:
  • yield return new WaitForSeconds和yield return new WaitForFixedUpdate的区别
  • 开始和停止携程
  • 完结

前言

Unity 协程是一种特殊的函数,可以在游戏中实现延迟执行、按顺序执行和异步操作等功能。它使用了迭代器(Iterator)的概念,通过 yield 关键字来控制执行流程。下面是 Unity 协程的使用和使用场景的详细介绍。

使用协程的步骤:

  1. 在脚本中定义一个协程方法,返回值类型为 IEnumerator
  2. 在协程方法内部使用 yield 关键字来控制执行流程。
  3. 通过调用 StartCoroutine 方法来启动协程。

使用场景示例:

  1. 延迟执行:

    IEnumerator DelayedAction()
    {
        yield return new WaitForSeconds(2.0f); // 等待2秒
        Debug.Log("Delayed action executed after 2 seconds");
    }
    
    void Start()
    {
        StartCoroutine(DelayedAction());
    }
    

    在上述示例中,协程 DelayedAction 会在等待 2 秒后执行延迟操作。

  2. 按顺序执行:

    IEnumerator SequentialActions()
    {
        Debug.Log("Action 1");
        yield return new WaitForSeconds(1.0f); // 等待1秒
        Debug.Log("Action 2");
        yield return new WaitForSeconds(2.0f); // 等待2秒
        Debug.Log("Action 3");
    }
    
    void Start()
    {
        StartCoroutine(SequentialActions());
    }
    

    在上述示例中,协程 SequentialActions 会按顺序执行三个动作,并在每个动作之间等待指定的时间。

  3. 异步操作:

    IEnumerator AsyncOperation()
    {
        AsyncOperation asyncOp = SceneManager.LoadSceneAsync("NextScene");
        asyncOp.allowSceneActivation = false; // 禁止自动切换场景
    
        while (!asyncOp.isDone)
        {
            float progress = Mathf.Clamp01(asyncOp.progress / 0.9f); // 获取加载进度(注意:进度在 0.9 时切换场景)
            Debug.Log("Loading progress: " + (progress * 100) + "%");
    
            if (progress >= 0.9f)
            {
                asyncOp.allowSceneActivation = true; // 允许切换场景
            }
    
            yield return null;
        }
    }
    
    void Start()
    {
        StartCoroutine(AsyncOperation());
    }
    

    在上述示例中,协程 AsyncOperation 会异步加载场景,并打印加载进度。在加载进度达到 0.9 时,允许切换场景。

Unity 协程的使用场景非常广泛,可以用于实现动画效果、延迟操作、按顺序执行多个任务、异步加载资源等。它提供了一种简洁、易于理解和管理的方式来处理需要延迟或异步执行的逻辑。

yield return new WaitForSeconds和yield return new WaitForFixedUpdate的区别

yield return new WaitForSecondsyield return new WaitForFixedUpdate 是用于控制协程执行的两种不同方式,它们的使用场景和效果有所不同。

  1. yield return new WaitForSeconds

    • 用法:这个语句用于在协程中等待一定的时间间隔后再继续执行后续代码。
    • 示例用法:
      IEnumerator MyCoroutine()
      {
          Debug.Log("Start");
          yield return new WaitForSeconds(2.0f); // 等待2秒
          Debug.Log("After 2 seconds");
      }
      
    • 效果:在上述示例中,协程会在执行到yield return new WaitForSeconds(2.0f)时暂停 2 秒,然后再继续执行后续代码。
  2. yield return new WaitForFixedUpdate

    • 用法:这个语句用于在协程中等待下一帧更新后再继续执行后续代码。
    • 示例用法:
      IEnumerator MyCoroutine()
      {
          Debug.Log("Start");
          yield return new WaitForFixedUpdate(); // 等待下一帧更新
          Debug.Log("After FixedUpdate");
      }
      
    • 效果:在上述示例中,协程会在执行到yield return new WaitForFixedUpdate()时等待当前帧更新结束,然后再继续执行后续代码。

总结来说,yield return new WaitForSeconds 用于在协程中控制时间间隔,而 yield return new WaitForFixedUpdate 用于等待下一帧更新。你可以根据实际需求选择合适的等待方式,来实现协程中的逻辑控制。

开始和停止携程

# 开始协程:
private Coroutine myCoroutine;
myCoroutine = StartCoroutine(MyCoroutine());

# 停止协程:
StopCoroutine(myCoroutine);

# 停止名为 "Start" 的协程
StopCoroutine("Start");

# 停止当前对象上所有正在运行的协程
StopAllCoroutines();

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

在这里插入图片描述

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

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

相关文章

多人协同开发git flow,创建初始化项目版本

文章目录 多人协同开发git flow,创建初始化项目版本1.gitee创建组织模拟多人协同开发2.git tag 打标签3.git push origin --tags 多人协同开发git flow,创建初始化项目版本 1.gitee创建组织模拟多人协同开发 组织中新建仓库 推送代码到我们组织的仓库 2…

uni-app设置地图显示

使用前需到**高德开放平台(https://lbs.amap.com/)**创建应用并申请Key 登录 高德开放平台,进入“控制台”,如果没有注册账号请先根据页面提示注册账号 打开 “应用管理” -> “我的应用”页面,点击“创建新应用”&…

Golang leetcode707 设计链表 (链表大成)

文章目录 设计链表 Leetcode707不使用头节点使用头节点 推荐** 设计链表 Leetcode707 题目要求我们通过实现几个方法来完成对链表的各个操作 由于在go语言中都为值传递,(注意这里与值类型、引用类型的而区别),所以即使我们直接在…

8个Python高效数据分析的技巧,不看肯定后悔~

本文介绍的数据分析方法,不仅能够提升运行效率,还能够使代码更加“优美”。 不管是参加Kaggle比赛,还是开发一个深度学习应用,第一步总是数据分析,这篇文章介绍了8个使用Python进行数据分析的方法,不仅能够…

实现CodeWave 低代码开发平台快速应用开发的完整指南

目录 前言1 CodeWave开发流程2 应用创建2.1 新建应用2.2 从应用模板创建应用 3 数据模型设计3.1 实体设计3.2 结构设计3.3 枚举设计 4 逻辑设计4.1 查询数据源设置4.2 组件和属性配置4.3 属性设置与服务端全局变量 5 页面设计5.1 选择页面模板5.2 前端全局变量设计5.3 事件逻辑…

音视频技术开发周刊 | 326

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 全球最强「开源版Gemini」诞生!全能多模态模型Emu2登热榜,多项任务刷新SOTA 最强的全能多模态模型来了!就在近日,智源研究院…

红队打靶练习:SAR: 1

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto 5、whatweb 小结 目录探测 1、gobuster 2、dirsearch WEB CMS 1、cms漏洞探索 2、RCE漏洞利用 提权 get user.txt 本地提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface:…

系统学习Python——装饰器:函数装饰器-[对方法进行装饰:使用嵌套函数装饰方法]

分类目录:《系统学习Python》总目录 如果想要函数装饰器在简单函数和类级别的方法上都能工作,最直接的解决办法在于使用前面文章介绍的状态保持方案之一:把自己的函数装饰器编写为嵌套的def,这样你就不会陷入单一的self实例参数既…

【办公技巧】pdf打印没反应怎么办

正常的PDF文件是可以打印的,如果PDF文件打开之后发现文件不能打印,我们需要先查看一下自己的打印机是否能够正常运行,如果打印机是正常的,我们再查看一下,文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

找火鸡^^

欢迎来到程序小院 找火鸡 玩法:记忆翻牌游戏,不同关卡会有不同数目的火鸡,卡牌自由滚动,记住火鸡的位置, 规定的时间内找到火鸡所在的位置,快去找火鸡吧^^。开始游戏https://www.ormcc.com/play/gameStart…

江西速欣商务咨询有限公司:债务规划重组的专业法务咨询服务

在财务管理中,债务问题往往成为个人和企业面临的一项重要挑战。江西速欣商务咨询有限公司作为债务问题的专业解决者,致力于为客户提供高效而专业的债务规划重组法务咨询服务,帮助他们摆脱负担,重整财务秩序。 深谙债务规划的专业智…

Python 基础语法01

变量声明 #运算 num 1 num 1 print("num 1",num)num - 1 print("num - 1", num)num * 4 print("num * 4",num)num 3 num % 2 print("num%2",num)num ** 2 print("num ** 2", num)num 9 num // 2 print("num // …

JavaScript 中常用事件

前言: 介绍了什么是事件以及原理,还有常用的事件及使用 **如果演示结果不好理解,可以复制代码到自己的电脑中运行,这样你们可以更好理解也可以研究出好玩的,研究出的话顺便发给我也玩玩🤭 文章目录 什么是事件原理鼠标…

针对工行的LockBit勒索软件攻击表明了全球金融系统对网络攻击的脆弱性

内容概要: 11月8日,工行一家美国子公司被勒索软件入侵导致美国国债交易业务瘫痪,暴露了全球金融系统易受网络攻击的脆弱性。LockBit勒索软件集团声称对工行的攻击负责。工行是世界上资产规模最大的银行,管理着5.7万亿美元。这一网…

轻松提升软件性能:快速学习和使用Memcached

目录 1、前言 2、Memcached的简介 3、Memcached的安装与配置 4、Memcached的数据结构 5、Memcached的常用命令 6、Memcached的高级特性 7、Memcached在系统中如何使用 8、结语 1、前言 Memcached是一个广泛用于提升软件性能的开源内存缓存系统。它可以有效地减少对数据…

代码随想Day55 | 392.判断子序列、115.不同的子序列

392.判断子序列 第一种思路是双指针&#xff0c;详细代码如下&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {//双指针if(s.empty()&&t.empty()) return true;int i0,j0;while(i<t.size()){if(s[j]t[i]) j;if(js.size()) return t…

MySQL触发器的创建、查看、删除、存储过程与触发器的区别等

MySQL触发器 1、什么是触发器2、创建触发器3、查看所有的触发器4、删除触发器5、常见的触发器案例6、存储过程与触发器的区别 1、什么是触发器 简单点来说触发器就是一个特殊的存储过程&#xff0c;不过存储过程需要手动调用&#xff0c;而触发器自动调用。 一张图来简单说明…

GPT编程(1)八分类图像数据集转换为二分类

一个核心问题就是要将这八类数据图片全部重命名&#xff0c;尝试了一步到位 有一个图像数据集&#xff0c;有八个类别amusement,anger,awe,contentment,disgust, excitement, fear,sadness的图片&#xff0c;每张图片被命名为“类别数字”。采用遍历的方式&#xff0c;按顺序阅…

架构设计的核心:从多个维度理论分析

文章目录 一、如何实现高内聚低耦合的架构1、确定边界2、内聚的分类3、耦合的分类4、如何实现高内聚低耦合&#xff08;1&#xff09;耦合关注点&#xff08;2&#xff09;低耦合原则&#xff08;3&#xff09;高内聚原则 二、如何实现可扩展性的架构1、扩展性&#xff1a;核心…

OpenHarmony之系统调用

背景 对于运行L0系统的硬件一般是mcu&#xff0c;资源有限&#xff0c;L0系统没有区分内核态和用户态&#xff0c;所有的代码都在内核态运行&#xff0c;所以不需要系统调用 L2系统用的是Linux内核&#xff0c;所以系统调用跟Linux Kernel的是一样的。 所以我们主要来看看L1系…