【unity知识点】Unity 协程/携程Coroutine

简介: 【unity知识点】Unity 协程/携程Coroutine

前言

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 秒后执行延迟操作。

  1. 按顺序执行:
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 会按顺序执行三个动作,并在每个动作之间等待指定的时间。

  1. 异步操作:
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 WaitForSeconds 和 yield return new WaitForFixedUpdate 是用于控制协程执行的两种不同方式,它们的使用场景和效果有所不同。

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 秒,然后再继续执行后续代码。

  1. 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();
目录
相关文章
|
3月前
|
存储 Linux 调度
协程(coroutine)的原理和使用
协程(coroutine)的原理和使用
|
27天前
|
调度 Python
python知识点100篇系列(20)-python协程与异步编程asyncio
【10月更文挑战第8天】协程(Coroutine)是一种用户态内的上下文切换技术,通过单线程实现代码块间的切换执行。Python中实现协程的方法包括yield、asyncio模块及async/await关键字。其中,async/await结合asyncio模块可更便捷地编写和管理协程,支持异步IO操作,提高程序并发性能。协程函数、协程对象、Task对象等是其核心概念。
|
5月前
|
PHP 调度 容器
Swoole 源码分析之 Coroutine 协程模块
协程又称轻量级线程,但与线程不同的是;协程是用户级线程,不需要操作系统参与。由用户显式控制,可以在需要的时候挂起、或恢复执行。
78 1
Swoole 源码分析之 Coroutine 协程模块
|
5月前
|
调度 C++ 开发者
C++一分钟之-认识协程(coroutine)
【6月更文挑战第30天】C++20引入的协程提供了一种轻量级的控制流抽象,便于异步编程,减少了对回调和状态机的依赖。协程包括使用`co_await`、`co_return`、`co_yield`的函数,以及协程柄和awaiter来控制执行。它们适合异步IO、生成器和轻量级任务调度。常见问题包括与线程混淆、不当使用`co_await`和资源泄漏。例如,斐波那契生成器协程展示了如何生成序列。正确理解和使用协程能简化异步代码,但需注意生命周期管理。
90 4
|
4月前
|
存储 调度 Python
异步编程概述在 Python中,`asyncio`库提供了对异步I/O、事件循环、协程(coroutine)和任务的支持。
异步编程概述在 Python中,`asyncio`库提供了对异步I/O、事件循环、协程(coroutine)和任务的支持。
|
6月前
|
网络协议 NoSQL API
协程知识点总结
协程知识点总结
|
5月前
|
图形学
【unity知识点】实现延迟调用——InvokeRepeating Invoke CancelInvoke Coroutine使用介绍
【unity知识点】实现延迟调用——InvokeRepeating Invoke CancelInvoke Coroutine使用介绍
227 0
|
6月前
|
调度 Python
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
75 0
|
6月前
|
Python
Python 的异步编程:什么是协程(Coroutine)和生成器(Generator)之间的区别?
Python 的异步编程:什么是协程(Coroutine)和生成器(Generator)之间的区别?
74 0