一个有“yield”的函数是如何正常工作的?我得到了这个方法(在UnityC#脚本中),但我不明白“收益”部分是如何工作的。我从MSDN知道该函数将返回一个我可以迭代的IEnumerator,但是这段代码等待1.5秒并且不迭代,因为这意味着内部创建的对象被创建了多次。任何人都可以在这里解释这段代码是如何工作的//使当前游戏对象不可见gameObject.renderer.enabled=false;//为当前游戏对象设置新位置transform.position=newVector3(0f,transform.position.y,transform.position.z);//等待1.5秒yieldreturnnewWaitForSeconds(1.5f);//使当前游戏对象再次可见gameObject.renderer.enabled=true;编译器为您生成的枚举器正在迭代。一次。编译器将生成一个类,该类使用MoveNext()函数和Current属性实现IEnumerator。此类将具有在调用之间存储函数状态所需的所有成员。具体细节可以被认为是“编译器魔术”。这个生成类的对象将由Unity3d引擎处理和管理。Unity3d引擎将在每帧的每个活动协程上调用MoveNext()(除非另有说明)。这使Unity3d程序员能够一次编写一帧的脚本回放。C#编译器魔法和Unity3d引擎魔法的结合使脚本非常强大且易于使用。回答您的问题:函数中的代码将执行一次,但会在“yieldreturn”语句处暂停。如上所述,实现IEnumerator的特殊对象由C#编译器创建。在第一次调用MoveNext()时,您的函数会创建爆炸并将当前对象设置为“newWaitForSeconds(1.5f)”。Unity3d引擎检查这个对象,发现它是特殊类“WaitForSeconds”的一个实例,所以将枚举器放在某个等待队列中,直到1.5秒才会请求第二个元素。同时,将渲染许多帧并播放爆炸。1.5秒后,Unity将从队列中获取枚举器并再次调用MoveNext()。函数的第二部分现在将执行,但无法生成第二个对象。MoveNext()将返回false以指示它无法获取新元素,这是Unity3d丢弃此枚举器的信号。垃圾收集器会在某个时候回收内存。如上所述:大量的编译器和Unity3d魔术正在进行中。只要您记得您的函数将保留到每个yieldreturn语句的下一帧,您就会知道这些特殊函数会受益。如果使用yield一次,就好像您返回一个带有一个元素的IEnumerator,这就是为什么您会觉得它没有迭代。这是yield关键字的一种相当奇怪的用法,如果不查看整个上下文就很难理解为什么要实现它。最好返回IEnumerable而不是IEnumerator,因为它更灵活且易于使用。最好使用IEnumerable。yieldreturn只是实现迭代器块的语法糖,编译器会生成相关代码,因为它本质上是一个标准的船板,可以很容易地通过编程方式生成。yieldreturn通常用在你想把一系列单独的动作作为一个集合来呈现的时候,例如:以上是C#学习教程:Howdoesafunctionwith"yield"workproperly?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注——publicIEnumerableGetThings(){yieldreturnGetNextThing();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
