当前位置: 首页 > ops >正文

【日志】unity俄罗斯方块——边界限制检测

Bug修复记录

项目场景

尝试使用Unity独自制作俄罗斯方块(也许很没有必要,网上随便一搜就有教程)

问题描述

俄罗斯方块的边缘检测出错了,对方块进行旋转后,无法到达最左侧或者最下侧的位置,以及其他问题。演示图如下所示:

 边缘检测代码如下所示:

    // 检查方块是否可以移动private bool IsCanMove(){// 检查是否超出边界for (int i = 0; i < transform.childCount - 1; i++){Vector3 pos = transform.GetChild(i).position;if (pos.y < 0 || pos.x < 0 || pos.x >= 10){return false;}}return true;}

修复方案

怀疑在旋转该物体的时候位置发生了轻微偏移,导致检测结果为超出边界,但是在视觉上看不出来。通过对坐标的值进行取整处理可以解决这个问题,修复代码如下:

    // 检查方块是否可以移动private bool IsCanMove(){// 检查是否超出边界for (int i = 0; i < transform.childCount - 1; i++){int roundX = Mathf.RoundToInt(transform.GetChild(i).position.x);int roundY = Mathf.RoundToInt(transform.GetChild(i).position.y);if (roundY < 0 || roundX < 0 || roundX >= 10){return false;}}return true;}

今日收获

场景摆放

关于场景摆放这真的是一个很头疼的问题,想必跟我一样的新手都会考虑如何使方块每步的移动与方块的大小一致,然后考虑各种计算方块大小、这个场景要做多大以及这个场景该怎么限制。

其实这个问题不用想那么多,把每个素材都做成1unity单位的大小就好了,场景先设置成10x15的大小,同时把左下角的位置移到(0,0)的位置,调整相机位置。这样就把一个没方向没大小没标准的问题变成了一个二维数组的问题,之后的问题就是对这个二维数组进行操作。

方块创建

方块的创建有太多种方式了,但是考虑到配置并创建每一种方块以及旋转,我选择了使用预制体,这样方便旋转,还能更直观了解这些方块在二维数组中的变化。

状态列表

这个是目前项目中最令人满意的地方,因为我只是用了一个方法就把输入系统和方块的操作联系了起来(没错,这里使用了之前提到的事件系统:Unity笔记——事件中心-CSDN博客)

// 方块的状态
public enum MoveType
{Move,Rotate,MoveDown,MoveRight,MoveLeft,Stop
}// 具体的方块控制逻辑private void Start(){EventCenter.AddListener(EventName.CONTROL_MOVE, controlMove);}private void OnDestroy(){EventCenter.RemoveListener(EventName.CONTROL_MOVE, controlMove);}// 改变移动类型private void controlMove(object[] args = null){moveType = (MoveType)args[0];}// 方块移动private void TryMove(MoveType moveType = MoveType.Move){switch (moveType){case MoveType.Move:MoveFall();break;case MoveType.Rotate:Rotate();break;case MoveType.MoveDown:MoveDown();break;case MoveType.MoveLeft:MoveLeft();break;case MoveType.MoveRight:MoveRight();break;case MoveType.Stop:Stop();break;}}
   // 输入系统if (Input.GetKeyDown(KeyCode.W)){EventCenter.TriggerEvent(EventName.CONTROL_MOVE, MoveType.Rotate);}if (Input.GetKeyDown(KeyCode.S)){EventCenter.TriggerEvent(EventName.CONTROL_MOVE, MoveType.MoveDown);}if (Input.GetKeyUp(KeyCode.S)){EventCenter.TriggerEvent(EventName.CONTROL_MOVE, MoveType.Move);}if (Input.GetKeyDown(KeyCode.A)){EventCenter.TriggerEvent(EventName.CONTROL_MOVE, MoveType.MoveLeft);}if (Input.GetKeyDown(KeyCode.D)){EventCenter.TriggerEvent(EventName.CONTROL_MOVE, MoveType.MoveRight);}

动态加载组件

这一块就没有太多可说的地方了,直接new一个新对象,AddComponent相关脚本或者组件。不过,在动态将所有方块预制体加入GameObject[]的时候发现其实用List存储这些预制体其实也都是一样的,感觉没有太多差别,直接GameObject[]能直接导入该文件下所有的预制体。

    private GameObject[] blocks;private List<GameObject> blocklist;private void Awake(){blockList = new List<GameObject>();generatorPoint = new GameObject();generatorPoint.transform.position = new Vector3(0, 0, 0);generatorPoint.transform.parent = transform;}private void Start(){generatorPoint.transform.position = createPos;blocks = Resources.LoadAll<GameObject>("Prefabs/Block");foreach (GameObject block in blocks){blockList.Add(block);}SpawnBoard();}// 生成方块public void SpawnBoard(){randomIndex = Random.Range(0, blockList.Count);blockList[randomIndex].AddComponent<Block>();Instantiate(blockList[randomIndex], generatorPoint.transform.position, Quaternion.identity, transform);}
http://www.xdnf.cn/news/16245.html

相关文章:

  • Zookeeper学习专栏(十):核心流程剖析之服务启动、请求处理与选举协议
  • Java测试题(上)
  • 《设计模式之禅》笔记摘录 - 10.装饰模式
  • gig-gitignore工具实战开发(四):使用ai辅助生成gitignore
  • AI图像编辑能力评测的8大测评集
  • ComfyUI中运行Wan 2.1工作流,电影级视频,兼容Mac, Windows
  • Elasticsearch-9.0.4安装教程
  • 05.原型模式:从影分身术到细胞分裂的编程艺术
  • RAG、Function Call、MCP技术笔记
  • 1 51单片机-C51语法
  • 免模型控制
  • Android Camera setRepeatingRequest
  • c语言-数据结构-沿顺相同树解决对称二叉树问题的两种思路
  • 算法:数组part02: 209. 长度最小的子数组 + 59.螺旋矩阵II + 代码随想录补充58.区间和 + 44. 开发商购买土地
  • KNN算法
  • 构建敏捷运营中枢:打通流程、部署与可视化的智能引擎
  • 【前端工程化】前端项目开发过程中如何做好通知管理?
  • 数仓主题域划分
  • FreeRTOS-中断管理
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘streamlit’问题
  • 与 TRON (波场) 区块链进行交互的命令行工具 (CLI): tstroncli
  • ISAAC ROS 在Jetson Orin NX上的部署
  • Mkdocs相关插件推荐(原创+合作)
  • 目标导向的强化学习:问题定义与 HER 算法详解—强化学习(19)
  • 双非上岸985!专业课140分经验!信号与系统考研专业课140+上岸中南大学,通信考研小马哥
  • Zookeeper 3.6.3【详细技术讲解】整
  • Day 3: 机器学习进阶算法与集成学习
  • GPU服务器与PC 集群(PC农场):科技算力双子星
  • IPv6网络排障详细步骤指南(附工具命令+配置检查点+典型案例)
  • Jenkins中HTML文件显示样式问题解决方案