我得到了这个方法(统一C#脚本中),但我不明白的“产量”部分实际上是如何工作的。

我从MSDN知道该函数将返回一个IEnumerator,我可以遍历throught,但是这个代码等待1.5秒,不会被重复,因为这将意味着,内部创建的对象被创建多次。 任何人在这里谁可以给我解释一下这是如何工作的代码?

IEnumerator DestroyShip()
{
    // create new gameobject
    Instantiate(ExplosionPrefab, transform.position, transform.rotation);
    // make current gameobject invisible
    gameObject.renderer.enabled = false;
    // set new position for the current gameobject
    transform.position = new Vector3(0f, transform.position.y, transform.position.z);
    // wait for 1,5 seconds 
    yield return new WaitForSeconds(1.5f);
    // make the current gameobject visible again
    gameObject.renderer.enabled = true;
}
有帮助吗?

解决方案

在枚举的编译器生成你正在重复。一次。

,编译器会生成一个类,它实现了IEnumerator,其具有的MoveNext()函数和电流特性。这个类将所有存储调用之间的函数的状态所需要的成员。的确切细节可以被认为是“编译器魔术”。

此生成的类的对象时,将被处理并且由Unity3d引擎管理。该Unity3d引擎将调用的MoveNext()上的每个有源协程一次,每帧(除非另有指示)。

此使Unity3d编程到被在一个时间播出一个帧写入脚本。的C#编译器魔术和Unity3d引擎魔术导致非常强大,但是易使用的脚本。

一个组合

要回答你的问题:在你的函数的代码会被执行一次,但它会在“收益率return”语句暂停

如上所述,实现了IEnumerator由C#编译器创建一个特殊的对象说明。

在所述第一呼叫对MoveNext(),您的函数创建一个爆炸和设置当前对象到“新WaitForSeconds(1.5F)”。

在Unity3d发动机检查该目的,认为它是特殊类“WaitForSeconds”,所以放枚举一些等待队列的一个实例,并直至1.5秒已经过去了将不要求第二元件。在此期间,许多帧将被提供,而该爆炸将被播放。

1.5秒后,将统一GRAP从队列中枚举,和()再次调用MoveNext的。你的函数的第二部分现在执行,但将无法生成第二对象。的MoveNext()将返回false,以表明它未能获得新的元素,这是信号Unity3d抛出此枚举了。垃圾收集器将在某个时间点回收内存。

作为表示:大量编译Unity3d魔的回事。只要你记住,你的功能将被搁置,直到在每个yield return语句下一帧,你就会知道从这些特殊功能足以受益。

其他提示

如果yield使用一次,这是因为如果你用一个元素返回一个IEnumerator,这就是为什么你得到的印象是它没有迭代。

这是一个相当奇怪的使用yield关键字的,这是很难理解它为什么被实现,从而没有看到整个来龙去脉。

这是更好地回报IEnumerable而不是IEnumerator因为它是更flaxible和易于使用。它甚至更好的使用IEnumerable<T>。产量返回只是用于实现迭代器块语法糖,编译器生成,因为它是可编程容易地产生基本上标准锅炉板的培训相关的代码。您通常使用收益回报时要进行一系列单一的行动apear是一个集合,e.g:

public IEnumerable<Thing> GetThings()
{
    yield return GetNextThing();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top