首页 > 解决方案 > 为什么我的积木会卡住,拒绝掉到最低层?

问题描述

在我的基于网格的积木游戏中,我遇到了游戏积木的下降代码问题。

这是代码片段:

for (int i = (int)transform.position.y; i >= 0; i--)
         {
             if (transform.position.y >= 0 && SpawnBlocks.allBlocks[(int)gameObject.transform.position.x, i] == null)
             {
                 float timeElapsed = 0;
                 int initPos = (int)transform.position.y;
                 int targetPos = (int)transform.position.y - i;
                 timeElapsed += Time.deltaTime * 4;
                 float moveDown = Mathf.Lerp(initPos, targetPos, timeElapsed);
                 transform.position = new Vector2(transform.position.x, moveDown);
 
                 SpawnBlocks.allBlocks[(int)transform.position.x, (int)transform.position.y] = gameObject;
                 gameObject.name = "(" + transform.position.x.ToString() + "," + transform.position.y.ToString() + ")";
             }
         }

每个块检查一个列表以查看它下面是否有一个块。如果没有,那么它应该平滑地向下移动那么多块来填充它。

但是会出现三个问题:

  1. 块不会下降到最低行

  2. 即使在一个块倒下后,同一列中该块上方的块也不会倒下,而是会卡在那里。

  3. 如果块之间只有一个空格,那么上面的块只会移动 .016694 而不是完整的 1

  4. 而不是真正的乐平,方块只会出现在下方的空间中。

我不知道为什么这些块会这样。

这是正在发生的事情的示例图片:

图 1

这是一个经过编辑的版本,显示了应该发生的情况:

图 2

标签: c#unity3d

解决方案


SpawnBlocks.allBlocks[(int)transform.position.x, (int)transform.position.y] = gameObject;可以使这个为 false SpawnBlocks.allBlocks[(int)gameObject.transform.position.x, i] == null,则transform.position = new Vector2(transform.position.x, moveDown);不会被执行,所以 block 只能在停止之前下降一点点。

另外我建议不要float用于索引。尝试使用intfor 逻辑,并触发某种用于删除动画的协程。


推荐阅读