从网格中掉落的方块(俄罗斯方块风格)



我的网格在一个数组上,我遍历每个网格图块以查看它是否为 null,如果上面的那个不是,它会将块放到下面的一个。

当我立即执行此操作时,代码运行良好,但是一旦我添加了一个协程,所以我慢慢地删除了块,它就停止了工作。我相当确定这是因为循环在正确设置块之前正在检查块,但我不确定如何解决这个问题。

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;     
}

这是两个重要的功能。现在可能有点混乱,但它奏效了。

现在发生的事情是,第一个区块会倒下,但上面的方块不会。不过,这在瞬间就起作用了。

尝试在协程中运行整个循环,或者在协程的开头使用"yield return new WaitForEndOfFrame();"。也许这样你会发现问题所在。

协程不与 unity 更新函数同步,以防您在 Update()、FixedUpdates()...您可能会因此而遇到问题。

好的,我解决了这个问题,我想我没有提供足够的信息来解决问题,但我会添加我所做的。

我有一个包含当前块信息的 activeLetter 变量。我将我的 UpdateBoard() 移动到 FixedUpdate 函数中,然后设置一个检查以确保它忽略了 activeLetter 位置。

它现在工作得很好。

最新更新