Unity:为啥协程在所有 Start() 函数之后结束?

Posted

技术标签:

【中文标题】Unity:为啥协程在所有 Start() 函数之后结束?【英文标题】:Unity : Why coroutine end after all Start() functions?Unity:为什么协程在所有 Start() 函数之后结束? 【发布时间】:2017-03-20 15:08:49 【问题描述】:

我有多个脚本,例如:

项目数据库 库存 银河发电机

我每个都有 Start() 结束/或 Awake() 函数。如果我在这些函数中放置一个 Debug.Log() 我会得到类似的东西(有订单):

唤醒:ItemDatabase 醒着:银河发电机 开始:库存 开始:银河发电机

这个订单没问题。现在我在ItemDatabase 中添加了一个协程,用于从具有 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 之前 醒着:银河发电机 开始:库存 开始:银河发电机 www 之后 构造项目数据库

我的问题是,为什么 Coroutine 的结尾毕竟是 Start() 函数?在我的示例中,我需要在Start : GalaxyGenerator 之前使用ConstructItemDatabase()

有什么想法吗?

【问题讨论】:

【参考方案1】:

因为下载您的 WWW 需要一些时间。您的 WWW 调用与事物的顺序没有任何关系,您正在向服务器发送请求并获得响应。如果响应很大,则需要很长时间,但无论哪种方式,都需要比 Unity 完成 Awakes and Starts 所需的时间更多。

如果您在 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");

【讨论】:

谢谢,可以解决。所以我需要首先调用一个像 Init.cs 这样的脚本,这里有我所有的协程,以及我所有其他脚本的所有 Initialize() 函数。所以有了这个我停止使用 Start 和 Awake 功能......没问题? 不太确定我理解您的意思,也不太确定您是否理解我的意思,但如果您理解我的回答并认为您的建议可行,请尝试一下!

以上是关于Unity:为啥协程在所有 Start() 函数之后结束?的主要内容,如果未能解决你的问题,请参考以下文章

unity中协程函数没有错误为啥会报错

为啥 LiveData 没有从协程更新?

Kotlin 协程在 Compose 函数中调用了两次而不是一次

Unity脚本编程之——协程(Coroutine)

Unity 之 关于停止协程的五种方式解析

Unity 之 关于停止协程的五种方式解析