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
相关产品推荐
相关产品推荐

