Unity学习笔记-2-在Unity中yield和return的作用以及它与c++的不同点
最后更新时间:
页面浏览: 加载中...
作者:白章
在 Unity 中使用 yield
和 return
是为了实现协程(Coroutine)的暂停和分步执行。这和 C++ 中的 yield
语法和行为有所不同。我们可以分析 Unity 中 yield
和 return
的区别和关系,以及为什么它们需要一起使用。
在 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 return
的 return
并不是返回方法的结果,而是作为协程的机制,它表示一个暂停的操作,并指示协程应该何时恢复执行。因此,yield
和 return
必须一起使用,以完成协程的控制。
总结
在 Unity 中,yield return
用于实现协程的分步执行和暂停。yield
是告诉 Unity 暂停当前执行的协程,而 return
则指定了暂停的条件或延迟时间。C++ 中的 yield
和 return
不太相同,它们分别用于生成器的控制和函数结果的返回。
因此,Unity 中的 yield return
是协程机制的一部分,是为了在多个帧之间控制代码的执行,避免阻塞主线程。而 C++ 中,yield
和 return
的作用不同,通常不需要一起使用。
Coroutine
在 Unity 中,Coroutine(协程)是一种用于在多个帧之间延迟执行代码的机制。它允许你在一段时间内暂停代码的执行,而不阻塞整个程序。你可以用它来做一些需要时间的操作,比如等待某个事件发生、逐帧变化或执行一些复杂的动画等。
基本概念
Coroutine 使得我们能够在多个帧中分步执行任务,而不需要将代码写成一个单一的长时间运行的函数。这样可以避免程序阻塞,并让游戏的其他部分继续运行。
创建和启动 Coroutine
在 Unity 中,协程通常使用 StartCoroutine
来启动。协程方法需要返回一个 IEnumerator
类型,因为它允许在执行过程中使用 yield
来暂停。
示例代码
1 |
|
解释
**
IEnumerator Start()
**:Start()
是 Unity 的生命周期方法之一,它在脚本开始时调用。如果你想使用协程,你可以将它定义为返回IEnumerator
的方法。**
yield return new WaitForSeconds(2f)
**:这表示协程在执行到这里时会暂停 2 秒。Unity 会继续执行其他操作,直到 2 秒过去。**
yield return null
**:表示暂停到下一帧。Unity 会在下一个更新循环继续执行协程。**
yield return new WaitUntil(() => Input.GetKeyDown(KeyCode.Space))
**:表示暂停执行,直到玩家按下空格键。
常用的 yield
返回值
- **
WaitForSeconds
**:等待指定的秒数。 - **
WaitForEndOfFrame
**:等待当前帧渲染完成后再继续执行。 - **
WaitUntil
**:等待某个条件为真(比如Input.GetKeyDown
)。 - **
WaitForFixedUpdate
**:等待下一次物理更新。
启动和停止协程
启动协程:使用
StartCoroutine
启动协程,例如:1
StartCoroutine(ExampleCoroutine());
停止协程:你可以使用
StopCoroutine
或StopAllCoroutines
来停止一个或所有的协程。1
2StopCoroutine(ExampleCoroutine());
StopAllCoroutines(); // 停止所有协程
总结
协程是 Unity 中一种非常强大的功能,允许你执行需要等待的操作而不阻塞游戏的主线程。它通过 yield
语句在多个帧之间分配工作,使得代码执行更加灵活且不会影响游戏的性能。