`yield return false;`在Unity3d C#脚本中是否有特殊含义?


17

在Unity中,协程还有一些特殊的东西,它们是普通C#之外的。

例如,我们可以使用

yield return WaitForSeconds(5.f);

让协程等待5秒钟,然后继续。

做什么yield return false;yield return true;做什么?


嗯,我不确定是否yield return true有特殊之处。但是yield return null只是停顿一帧,所以我怀疑它yield return false具有完全相同的效果(而且yield return 0由于0 false null在引擎盖下都是相同的)
嘲笑

@jhocking“由于0 false null完全相同”,为什么这么重要?C#是一种强类型的语言,因此在大多数情况下,“内幕”的外观并不重要。例如,与C和C ++不同,您不能只是做if (0)if (null)
2014年

耸耸肩然后没关系。我所知道的是yield return 0可行;显然是因为MLM解释的原因
猛烈抨击

2
不是普通C#的补充。所述yield关键字至少自C#2.0一直围绕。Unity所做的只是将其称为协程,并处理生成的迭代器和从迭代器返回的值,从而可以在代码执行过程中引起非阻塞延迟。
OR Mapper 2014年

1
@Almo:那是因为WaitForSeconds没有声明。声明一个WaitForSeconds带有float参数并返回要实现的枚举的元素类型的方法后,它将再次编译。因此,yield对于Unity而言并不特殊。如果有的话,该WaitForSeconds方法是Unity特有的,但即使这样,它也不会扩展C#语言,而只是使用标准C#编写的一种额外方法。
OR Mapper 2014年

Answers:


19

调度程序只能识别的产量值是:

  • 从派生类YieldInstructionWaitForSecondsWaitForEndOfFrameWaitForFixedUpdateAssetBundleCreateRequestAssetBundleRequest和协程
  • 一个WWW对象
  • 不是上述之一的“任何其他值”

如果产生“任何其他值”(包括“ null”字符串值)任何其他基本类型,例如int,bool,...或对不是上述对象之一的任意对象的引用,则调度程序将将协程“安排”到下一帧

- Bunny83答案:在统一的答案重要成员

WaitForEndOfFrame和其他人等,都只是空白的函数标签YieldInstruction,以决定如何在发动机做。

默认情况似乎是WaitForEndOfFrame。因此,如果您yield return没有特殊含义的内容(例如bool),则与相同WaitForEndOfFrame

似乎没有任何有关此行为的官方文档。


更新资料

罗特评论了另一种特殊情况:yield return null

yield return null除以外的所有Unity协程,包括,运行在帧渲染之前WaitForEndOfFrame。你可以找到拉特真棒回答了在统一答案解释这个进一步(图好看含税)。


6
通常会假定yield null和和WaitForEndOfFrame相同,但是实际上却稍有不同,如执行顺序手册页所述。
罗特2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.