我有多个脚本,如:
我在每个中都有Start()end /或Awake()函数。如果我在这些函数中放入Debug.Log(),我会得到类似的东西(为了获得订单):
这个订单没问题。现在我在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()
,现在如果我查看我的控制台,我会看到这个顺序:
我的问题是,为什么Coroutine的结束是在所有Start()
功能之后?在我的示例中,我需要在ConstructItemDatabase()
之前Start : GalaxyGenerator
。
有什么想法吗?
答案 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");
}