Unity:为什么coroutine在所有Start()函数之后结束?

时间:2017-03-20 15:08:49

标签: unity3d coroutine

我有多个脚本,如:

  • ItemDatabase
  • 广告
  • GalaxyGenerator

我在每个中都有Start()end /或Awake()函数。如果我在这些函数中放入Debug.Log(),我会得到类似的东西(为了获得订单):

  • 清醒:ItemDatabase
  • 觉醒:GalaxyGenerator
  • 开始:广告资源
  • 开始:GalaxyGenerator

这个订单没问题。现在我在ItemDatabase中添加了一个Coroutine,用于从具有WWW类的数据库获取项目,这就是我所拥有的:

void Awake(){
    Debug.Log("Awake : ItemDatabase");
    StartCoroutine(DoWWW());
}

private IEnumerator DoWWW()
{
    Debug.Log("Before www");
    www = new WWW("http://127.0.0.1:8000/api/items");
    yield return www;

    Debug.Log("After www");

    itemData = JsonMapper.ToObject (www.text);
    ConstructItemDatabase();
}

void ConstructItemDatabase()
{
    Debug.Log("Construct ItemDatabase");
}

你可以看到不同的Debug.Log(),现在如果我查看我的控制台,我会看到这个顺序:

  • 清醒:ItemDatabase
  • 在www
  • 之前
  • 觉醒:GalaxyGenerator
  • 开始:广告资源
  • 开始:GalaxyGenerator
  • www
  • 之后
  • 构建ItemDatabase

我的问题是,为什么Coroutine的结束是在所有Start()功能之后?在我的示例中,我需要在ConstructItemDatabase()之前Start : GalaxyGenerator

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

因为下载WWW需要一些时间。您的WWW呼叫与事物的顺序没有任何关系,您向服务器发送请求并获得响应。如果它是一个很大的响应,它将花费很多时间,但无论哪种方式,它将花费更多的时间比Unity通过你的觉醒和开始。

如果在WWW完成后需要Start方法,则应该从Start()中删除代码并将它们放在您自己的方法中,例如InitializeInventory()InitializeGalaxyGenerator()在WWW完成时调用,就像您使用ConstructItemDatabase一样。

private IEnumerator DoWWW()
{
    Debug.Log("Before www");
    www = new WWW("http://127.0.0.1:8000/api/items");
    yield return www;

    Debug.Log("After www");

    itemData = JsonMapper.ToObject (www.text);
    ConstructItemDatabase();
    InitializeInventory();
    InitializeGalaxyGenerator();
}

void ConstructItemDatabase()
{
    Debug.Log("Construct ItemDatabase");
}