Unity学习笔记-2-在Unity中yield和return的作用以及它与c++的不同点

文章发布时间:

最后更新时间:

页面浏览: 加载中...

作者:白章

在 Unity 中使用 yieldreturn 是为了实现协程(Coroutine)的暂停和分步执行。这和 C++ 中的 yield 语法和行为有所不同。我们可以分析 Unity 中 yieldreturn 的区别和关系,以及为什么它们需要一起使用。

在 Unity 中,yield 和 return 的作用

  • yield:用于暂停当前协程的执行,直到某个条件满足。它并不是返回一个结果,而是告诉 Unity 在未来的某个时间点继续执行当前的方法。

  • return:在协程中,return 用于返回一个值或对象,告诉 Unity 如何继续执行协程。通常,yield return 会配合使用。

yield 与 return 配合使用的原因

在 Unity 的协程中,yield 关键字和 return 关键字并不是直接冲突的,它们是协作的:

  • yield return:在 Unity 协程中,yield 是告诉协程暂停执行,而 return 则返回一个对象或条件,表示什么时候再继续执行。例如,yield return new WaitForSeconds(2f) 表示协程将在 2 秒后继续执行,Unity 会在 2 秒后恢复该协程的执行。

    • yield return null:表示在下一帧继续执行。
    • **yield return new WaitForSeconds(2f)**:表示暂停 2 秒。
    • **yield return new WaitUntil(() => someCondition)**:表示暂停直到某个条件为 true

在 Unity 中,yield return 使得协程能够分阶段执行,避免阻塞主线程。

C++ 中的 yield 与 return 的区别

C++ 本身没有内建的协程机制,C++ 中的 yield 一般出现在 生成器迭代器 中,通常用于产生一个序列的值,并且会把控制权交还给调用者。它和 C# 中的协程机制有所不同。在 C++ 中,yield 可能意味着暂停函数的执行,并将执行权交还给调用者,或者返回一个生成的值。

C++ 的 return 语法用于返回一个函数的结果,它与 yield 并不共同使用。

在 C# 和 Unity 中,yield returnreturn 并不是返回方法的结果,而是作为协程的机制,它表示一个暂停的操作,并指示协程应该何时恢复执行。因此,yieldreturn 必须一起使用,以完成协程的控制。

总结

在 Unity 中,yield return 用于实现协程的分步执行和暂停。yield 是告诉 Unity 暂停当前执行的协程,而 return 则指定了暂停的条件或延迟时间。C++ 中的 yieldreturn 不太相同,它们分别用于生成器的控制和函数结果的返回。

因此,Unity 中的 yield return 是协程机制的一部分,是为了在多个帧之间控制代码的执行,避免阻塞主线程。而 C++ 中,yieldreturn 的作用不同,通常不需要一起使用。

Coroutine

在 Unity 中,Coroutine(协程)是一种用于在多个帧之间延迟执行代码的机制。它允许你在一段时间内暂停代码的执行,而不阻塞整个程序。你可以用它来做一些需要时间的操作,比如等待某个事件发生、逐帧变化或执行一些复杂的动画等。

基本概念

Coroutine 使得我们能够在多个帧中分步执行任务,而不需要将代码写成一个单一的长时间运行的函数。这样可以避免程序阻塞,并让游戏的其他部分继续运行。

创建和启动 Coroutine

在 Unity 中,协程通常使用 StartCoroutine 来启动。协程方法需要返回一个 IEnumerator 类型,因为它允许在执行过程中使用 yield 来暂停。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour
{
// 一个简单的协程函数
IEnumerator Start()
{
// 等待 2 秒
yield return new WaitForSeconds(2f);

// 输出提示信息
Debug.Log("2秒过去了");

// 等待直到下一帧
yield return null;

Debug.Log("下一帧");

// 等待直到指定条件为真
yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space));

// 输出提示信息,表示用户按下了空格键
Debug.Log("空格键被按下");
}
}

解释

  1. **IEnumerator Start()**:Start() 是 Unity 的生命周期方法之一,它在脚本开始时调用。如果你想使用协程,你可以将它定义为返回 IEnumerator 的方法。

  2. **yield return new WaitForSeconds(2f)**:这表示协程在执行到这里时会暂停 2 秒。Unity 会继续执行其他操作,直到 2 秒过去。

  3. **yield return null**:表示暂停到下一帧。Unity 会在下一个更新循环继续执行协程。

  4. **yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space))**:表示暂停执行,直到玩家按下空格键。

常用的 yield 返回值

  • **WaitForSeconds**:等待指定的秒数。
  • **WaitForEndOfFrame**:等待当前帧渲染完成后再继续执行。
  • **WaitUntil**:等待某个条件为真(比如 Input.GetKeyDown)。
  • **WaitForFixedUpdate**:等待下一次物理更新。

启动和停止协程

  • 启动协程:使用 StartCoroutine 启动协程,例如:

    1
    StartCoroutine(ExampleCoroutine());
  • 停止协程:你可以使用 StopCoroutineStopAllCoroutines 来停止一个或所有的协程。

    1
    2
    StopCoroutine(ExampleCoroutine());
    StopAllCoroutines(); // 停止所有协程

总结

协程是 Unity 中一种非常强大的功能,允许你执行需要等待的操作而不阻塞游戏的主线程。它通过 yield 语句在多个帧之间分配工作,使得代码执行更加灵活且不会影响游戏的性能。