You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity开发俄罗斯方块:GameObject无法限制在指定区域求助

解决你的俄罗斯方块边界与下落停止问题

嘿,我来帮你搞定这两个问题!咱们先拆解现有代码里的问题,再给出针对性的修改方案:

问题1:方块能移出目标区域

你的ValidMove方法边界判断存在疏漏:

  • x轴方向:你只检查了children.transform.position.x > width,但每个方块是20x20的尺寸,如果方块的position对应左下角坐标,那么方块的右边缘是x + 20,正确的右边界应该是x + 20 > width,否则方块会半移出甚至完全超出区域。
  • 上边界:你没做顶部限制,若初始位置过高,方块会超出目标区域顶部,所以需要补充y + 20 > height的判断。

问题2:方块持续下落直至移出屏幕

自动下落逻辑里没有调用ValidMove验证合法性,导致即使方块碰到底部(y<0),代码仍会继续让它向下移动。我们需要在下落移动后检查合法性,不合法就还原位置并停止自动下落。

修改后的完整代码

private float previousTime;
public float fallTime = 0.8f;
public static int height = 280;
public static int width = 160;
private readonly float blockSize = 20f; // 用常量替代魔法数字,后续修改更便捷

// Start is called before the first frame update
void Start()
{
    
}

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.LeftArrow))
    {
        transform.position += new Vector3(-blockSize, 0, 0);
        if (!ValidMove())
        {
            transform.position += new Vector3(blockSize, 0, 0);
        }
    }
    else if (Input.GetKeyDown(KeyCode.RightArrow))
    {
        transform.position += new Vector3(blockSize, 0, 0);
        if (!ValidMove())
        {
            transform.position += new Vector3(-blockSize, 0, 0);
        }
    }

    if(Time.time - previousTime > (Input.GetKey(KeyCode.DownArrow) ? fallTime / 10 : fallTime))
    {
        // 尝试执行下落移动
        transform.position += new Vector3(0, -blockSize, 0);
        
        if (!ValidMove())
        {
            // 移动无效,还原到之前的位置
            transform.position += new Vector3(0, blockSize, 0);
            // 这里可以后续扩展:生成新方块、锁定当前方块等逻辑
            return; // 跳过时间更新,停止自动下落
        }
        
        previousTime = Time.time;
    }

    bool ValidMove()
    {
        foreach (Transform children in transform)
        {
            Vector3 pos = children.transform.position;
            // 检查四个方向的边界,确保方块完全在目标区域内
            if (pos.x < 0 || 
                pos.x + blockSize > width || 
                pos.y < 0 || 
                pos.y + blockSize > height)
            {
                return false;
            }
        }

        return true;
    }
}

关键修改点说明

  • 新增blockSize常量,替换代码里的硬编码数字20,后续调整方块尺寸只需修改这一处。
  • 修复ValidMove的边界判断逻辑,确保方块整体被限制在宽160、高280的目标区域内。
  • 在自动下落流程中加入合法性检查,一旦移动无效就还原位置,并通过return跳过时间更新,让方块停止自动下落。

内容的提问来源于stack exchange,提问作者mycelium net

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:25:14