详细说明此功能如何与&Year&Quot;一起工作? [英] How does this function with a "yield" work in detail?

查看:44
本文介绍了详细说明此功能如何与&Year&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;一起工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆