我的网格在一个数组上,我遍历每个网格图块以检查它是否为空,如果上面的那个不为空,它将把块放到下面的那个。
当我立即执行此操作时,代码工作得非常好,但是一旦添加了协程,我就慢慢放下了块,它就停止了工作。我相当确定这是因为循环会在正确设置块之前检查它们,但是我不确定如何解决该问题。
private void UpdateBoard()
{
// Need to figure out how to adjust my grid objects when a word has been destroyed.
for (int x = 0; x < grid.width; x++)
{
for (int y = 0; y < grid.height - 1; y++)
{
if (grid.tiles[x, y] == null && grid.tiles[x, y + 1] != null)
{
StartCoroutine(BlockFall( x, y + 1 ));
// grid.tiles[x, y + 1].transform.position = new Vector2(grid.tiles[x, y + 1].transform.position.x, grid.tiles[x, y + 1].transform.position.y - 1);
}
}
}
}
public IEnumerator BlockFall(int posX, int posY)
{
float startY = 1;
grid.tiles[posX, posY].pos.y = grid.tiles[posX, posY].pos.y - 1;
grid.tiles[posX, posY - 1] = grid.tiles[posX, posY];
while(startY > 0)
{
startY -= 0.25f;
grid.tiles[posX, posY].transform.position = new Vector2(grid.tiles[posX, posY].transform.position.x, grid.tiles[posX, posY].transform.position.y - 0.25f);
yield return new WaitForSeconds(0.1f);
}
grid.tiles[posX, posY] = null;
}
这是重要的两个功能。也许现在有点混乱,但它确实有效。
现在发生的是,第一个方块将掉落,但上方的那个不会倒下。不过,那是即时的。
答案 0 :(得分:1)
尝试在协同程序中运行整个循环或使用“ yield return new WaitForEndOfFrame();”在协程的开始。也许这样,您会发现问题所在。
如果在Update(),FixedUpdates()中有代码,则协程不与统一更新功能同步,因此您可能会遇到问题。
答案 1 :(得分:0)
好的,我解决了这个问题,我想我没有提供足够的信息来解决问题,但是我将添加所做的事情。
我有一个activeLetter变量,其中包含当前块的信息。我将UpdateBoard()移到FixedUpdate函数中,然后进行检查以确保它忽略了activeLetter位置。
现在可以正常使用了。