首页 > 解决方案 > 从网格中落下的块(俄罗斯方块样式)

问题描述

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

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

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;     

}

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

现在发生的情况是,第一个块会掉下来,但上面的块不会。不过,那是即时的。

标签: c#unity3dtetris

解决方案


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

如果您在 Update()、FixedUpdates()... 中有代码,协程不会与统一更新函数同步,因此您可能会遇到问题。


推荐阅读