当前位置: 首页 > article >正文

unity,通俗解释什么是协程

文章目录

  • 一、 介绍
  • 二、 举例子
  • 三、 和多线程的区别
  • 四、 常用函数
  • 五、 脚本


一、 介绍

在Unity中,协程是一种轻量级的线程,可以在同一线程中执行多个任务,实现异步等待和延迟执行等效果。协程的执行是基于迭代器的,可以通过yield语句来实现暂停和恢复执行,从而更加灵活地控制协程的执行过程。协程可以在不创建新线程的情况下实现异步等待和延迟执行,避免了线程切换和同步等问题,从而提高了程序的性能和效率。

在Unity中,协程通常用于处理一些异步任务,比如等待一段时间、播放动画、加载资源等。协程的执行过程可以通过yield语句来控制,比如yield return new WaitForSeconds(5)可以让协程等待5秒钟后再继续执行。此外,协程还可以通过yield return null来让协程在下一帧继续执行,从而实现延迟执行的效果。协程可以在MonoBehaviour组件中使用,也可以在普通的C#类中使用。

需要注意的是,协程并不是多线程,协程的执行是在主线程中进行的,因此协程中的操作不应该阻塞主线程的执行。如果协程需要执行一些耗时的操作,可以将其放到后台线程中执行,然后通过yield return null等方式来控制协程的执行过程。


二、 举例子

协程不是顺序!
只有一个线程。
生活中的协程例子:

在做饭的时候,我们需要根据食材的不同,进行不同的烹饪方式,比如先煮汤再放菜,等菜熟了再加调料,这就需要协程来控制。我们可以使用协程来暂停烹饪的过程,等待食材煮熟或煮熟到一定程度后再继续加入其他调料,以达到更好的口感。

在学习的时候,我们需要进行不同的任务,比如先阅读书籍,再做练习题,最后进行总结,这也需要协程来控制。我们可以使用协程来暂停学习的过程,等待某些条件满足或者一定时间后再继续进行下一步的任务。

在旅游的时候,我们需要根据不同的景点和时间,安排不同的行程,比如先去景点A,再去景点B,最后在晚上回到酒店,这也需要协程来控制。我们可以使用协程来暂停旅游的过程,等待到达某个景点或者一定时间后再继续前往下一个景点。

总之,协程是一种在生活中经常出现的流程控制方式,可以帮助我们更加高效地完成任务。


三、 和多线程的区别

协程和多线程都是在编程中用来实现并发执行的技术,但它们有一些区别:

线程是由操作系统调度的,而协程则是由程序员手动调度的。程序员可以在协程中自行决定何时暂停、恢复和切换协程的执行,而线程的调度则是由操作系统来完成的。

线程是在操作系统层面上实现的,并且每个线程都有自己的堆栈,需要占用一定的系统资源。而协程则是在程序层面上实现的,多个协程可以共享同一个线程,并且不需要额外的系统资源。

多线程的切换需要进行上下文切换,需要保存和恢复线程的状态,而协程的切换则不需要进行上下文切换,只需要保存和恢复协程的状态,所以协程的切换速度更快。

多线程的并发执行可能会涉及到线程间的竞态条件和锁,需要使用同步机制来保证线程安全,而协程的并发执行则可以通过协程间的消息传递来实现,不需要使用复杂的同步机制。

总之,协程和多线程都可以实现并发执行,但它们的实现方式和特点都有所不同,需要根据具体的应用场景来选择适合的技术。


四、 常用函数

StartCoroutine:用于启动一个协程,接受一个IEnumerator类型的参数,表示要执行的协程方法。

StopCoroutine:用于停止指定的协程,接受一个Coroutine类型的参数,表示要停止的协程。

WaitForSeconds:用于暂停协程的执行,接受一个float类型的参数,表示暂停的时间,单位是秒。

WaitForEndOfFrame:用于暂停协程的执行,直到当前帧结束后再继续执行。

WaitForFixedUpdate:用于暂停协程的执行,直到下一次FixedUpdate时再继续执行。

WWW:用于异步加载网络资源,接受一个string类型的参数,表示要加载的资源路径。

yield return null:用于暂停协程的执行,直到下一帧再继续执行。

yield return new WaitForSeconds(float time):用于暂停协程的执行,直到指定的时间后再继续执行。

yield return StartCoroutine(IEnumerator routine):用于在协程中启动另一个协程。


五、 脚本

做游戏,我要用协程等待5秒播放动画

using UnityEngine;
using System.Collections;

public class WaitAndPlayAnimation : MonoBehaviour {

    public Animator anim;

    void Start () {
        StartCoroutine (WaitAndPlay ());
    }

    IEnumerator WaitAndPlay () {
        yield return new WaitForSeconds (5f);
        anim.SetTrigger ("playAnimation");
    }
}


http://www.kler.cn/a/7260.html

相关文章:

  • 无人机场景 - 目标检测数据集 - 车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」
  • 快排和归并
  • AI行业动态:AGI预测、模型进化与工具革新
  • Notepad++的完美替代
  • VSCode插件
  • Chrome和Chromium的区别?浏览器引擎都用的哪些?浏览器引擎的作用?
  • 无公网IP,SSH远程连接Linux CentOS服务器【内网穿透】
  • 2023年第十四届蓝桥杯javaB组省赛真题
  • deepin15.11无法正常输入汉字问题的解决
  • UE5实现贴地面效果(RT+Decal)
  • Java设计模式(三)原型模式
  • SpringBoot源码学习系列——自动配置原理(三)
  • SpringBoot:自动配置源码底层原理分析
  • Web漏洞-文件包含漏洞超详细全解(附实例)
  • 章节2 行走数据江湖,只需一行代码
  • windows 解决惠普主机核显无法输入VGA、HDMI信号问题
  • MATLAB结构化程序设计
  • MySQL 存储引擎
  • Java设计模式(九)外观模式
  • mongodb和mysql双写数据一致性问题
  • 如何提高逻辑思维,亲测,这3个方法有效
  • C++封装详解——从原理到实践
  • 实验四 配置OSPF协议
  • 投资大咖说,消费产业3个升级方向
  • java 重试
  • Python怎么学最高效