首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Cooutine是Unity3D中的一个新线程吗?

Cooutine是Unity3D中的一个新线程吗?
EN

Stack Overflow用户
提问于 2018-05-28 05:15:54
回答 1查看 0关注 0票数 0

协同线是一个函数,它可以暂停其执行(产生),直到给定的yieldInstructure结束为止。

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    void Start() {
        print("Starting " + Time.time);
        StartCoroutine(WaitAndPrint(2.0F));
        print("Before WaitAndPrint Finishes " + Time.time);
    }
    IEnumerator WaitAndPrint(float waitTime) {
        yield return new WaitForSeconds(waitTime);
        print("WaitAndPrint " + Time.time);
    }
}

我对这个例子有很多疑问:

  1. 在上面的例子中,哪一行是协同线?是WaitAndPrint()一条协同线?是WaitForSeconds()一条协同线?
  2. 在这一行:yield return new WaitForSeconds(waitTime);,为什么两者都是yieldreturn在场吗?这是一种特殊的返回类型,它确保函数在下一次调用产语句后从行中继续。如果yield是一种特殊的return,什么是return在这里干什么?
  3. 为什么要把IEnumerator?
  4. StartCoroutine开始新的线索?
  5. 有多少次WaitAndPrint()在上面的例子中被调用了吗?做yield return new WaitForSeconds(waitTime);真的回来了?如果是,那我猜WaitAndPrint()在上面的代码中调用了两次。我猜StartCoroutine()打电话WaitAndPrint()好几次了。
EN

回答 1

Stack Overflow用户

发布于 2018-05-28 15:00:48

yield单独无效,并且后面总是有任意一种。returnbreak

考虑一个标准的IEnDigator(不产生流控制消息)。

IEnumerator YieldMeSomeStuff()
{
    yield "hello";
    Console.WriteLine("foo!");
    yield "world";
}

现在:

IEnumerator e = YieldMeSomeStuff();
while(e.MoveNext())
{
    Console.WriteLine(e.Current);
}

输出结果是什么?

hello
foo!
world

注意,我们第二次调用MoveNext,在枚举数生成“World”之前,会在枚举数中运行一些代码。这意味着,在枚举数中,我们可以编写执行的代码,直到它到达yield return语句,然后简单地暂停直到有人调用。MoveNext(轻松地捕获所有状态/变量,这样我们就可以找到我们停止的地方)。在.之后MoveNext调用之后的下一段代码。yield return语句可以运行到另一个yield return到达了。因此,我们现在可以控制代码在yield return语句的MoveNext调用枚举数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档