How does this function with a amp;quot;yieldamp;quot; work in detail?(详细说明此功能如何与amp;Yearamp;Quot;一起工作?)
问题描述
我获得此方法(在Unity C#脚本中),但我不理解"Year"部分的实际工作方式。
我从MSDN得知该函数将返回一个我可以迭代的IEnumerator,但是该代码等待了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()函数和一个Current属性。该类将拥有在两次调用之间存储函数状态所需的所有成员。确切的细节可以认为是"编译器魔术"。
此生成类的对象将由Unity3D引擎处理和管理。Unity3D引擎将每帧对每个活动协程调用一次MoveNext()(除非另有说明)。 这使Unity3D程序员能够编写一次播放一帧的脚本。C#编译器魔术和Unity3D引擎魔术的组合产生了功能非常强大但易于使用的脚本。回答您的问题:函数中的代码将执行一次,但它将在"Year Return"语句处暂停。
如上所述,实现IEnumerator的特殊对象由C#编译器创建。
第一次调用MoveNext()时,您的函数创建分解并将当前对象设置为"new WaitForSeconds(1.5f)"。
Unity3D引擎检查此对象,发现它是特殊类"WaitForSeconds"的实例,因此将枚举器放在某个等待队列中,直到1.5秒后才会请求第二个元素。同时,将渲染多个帧并播放爆炸。1.5秒后,Unity将从队列中获取枚举器,并再次调用MoveNext()。现在将执行函数的第二部分,但无法生成第二个对象。MoveNext()将返回false以指示它未能获取新元素,这是向Unity3D发出的丢弃此枚举器的信号。垃圾回收器将在某个时间点回收内存。
如前所述:大量编译器和Unity3D魔术正在上演。只要您记住,您的函数将在每个YILD RETURN语句的下一帧之前被搁置,您就会知道足够多的信息来从这些特殊函数中获益。
这篇关于详细说明此功能如何与&;Year&;Quot;一起工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:详细说明此功能如何与&;Year&;Quot;一起工作?
基础教程推荐
- c# Math.Sqrt 实现 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- rabbitmq 的 REST API 2022-01-01