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");
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忽然602

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值