use*_*292 6 c# coroutine unity-game-engine
我场景中的一个脚本涉及创建立方体网格.这个过程需要相当长的时间,而且我一直在尝试实施它,而不会导致Unity变得反应迟钝.
目前的代码 - 有效 - 您可以在生成网格时观察.但是,场景中的其他脚本正在同时执行其任务并导致异常(它们正在访问尚未创建的网格上的切片).
下面的脚本是唯一具有'Awake'功能的脚本 - 其他脚本在第一个脚本完成唤醒之前执行'Update'和'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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何让doOtherStuff()方法等到协同例程完成?
我尝试过一个布尔切换(冻结统一)我尝试过使用锁(这不起作用)
或者有更有效的方法吗?
编辑:代码在生成网格后成功完成OtherStuff().除了doOtherStuff()之外,将网格的引用传递给单独的类.尝试在Update方法中访问网格时,单独的类会抛出异常.这表明,在GridGenerator.cs中的Awake完成之前,将调用update方法.
最简单的方法是在另一个协程中启动您的协程,以便您可以屈服于它:
void Awake ()
{
StartCoroutine(doSetup());
}
IEnumerator doSetup ()
{
yield return StartCoroutine(createGrid()); // will yield until createGrid is finished
doOtherStuff();
}
IEnumerator createGrid()
{
for (int i = 0; i < Constants.BOARD_WIDTH; i++)
{
for (int j = 0; j < Constants.BOARD_HEIGHT; j++)
{
// Instantiate a new tile
yield return(0);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
365 次 |
最近记录: |