【发布时间】:2015-08-11 13:21:07
【问题描述】:
我场景中的一个脚本涉及创建一个立方体网格。这个过程确实需要相当长的时间,我一直在尝试实现它,而不会导致 Unity 变得无响应。
目前的代码 - 有效 - 您可以在生成网格时进行观察。但是,场景中的其他脚本同时执行它们的任务并导致异常(它们正在访问网格上尚未创建的图块)。
下面的脚本是唯一具有“唤醒”功能的脚本 - 在第一个脚本完成唤醒之前,其他脚本正在执行“更新”和“OnGUI”。
GridGenerator.cs
public GameObject[,] tiles = new GameObject[Constants.BOARD_WIDTH, Constants.BOARD_HEIGHT];
// Run a double loop to create each tile.
void Awake ()
{
StartCoroutine(doSetup());
}
IEnumerator doSetup()
{
yield return StartCoroutine (loadLevel());
DoOtherStuff();
}
IEnumerator loadLevel()
{
for (int i = 0; i < Constants.BOARD_WIDTH; i++)
{
for (int j = 0; j < Constants.BOARD_HEIGHT; j++)
{
tiles[i,j] = newTile();
yield return(0);
}
}
}
如何让 doOtherStuff() 方法等到协程完成?
我尝试了一个布尔切换(冻结统一) 我试过使用锁(没用)
或者有更有效的方法吗?
编辑:生成网格后,代码成功完成 OtherStuff()。 doOtherStuff() 的一部分是将网格的引用传递给单独的类。 尝试在 Update 方法中访问网格时,单独的类会引发异常。这表明,在 GridGenerator.cs 中的 Awake 完成之前调用了 update 方法。
【问题讨论】:
-
所以其他东西正在寻找瓷砖,有没有一种方法可以让他们在寻找瓷砖时知道它们是否已经生成并且是否可用?可能需要提供更多代码来显示其他例程如何存储/访问图块
-
是的,这是一个解决方案 - 检查以确保首先生成图块。但是将涉及向所有需要瓷砖的地方添加额外的条件......啊,瓷砖存储在游戏对象的多维数组中。更新了主帖 - 谢谢。