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()
,现在如果我检查我的控制台,我会看到这个顺序:
我的问题是,为什么 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() 函数之后结束?的主要内容,如果未能解决你的问题,请参考以下文章