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.pswp.cn/diannao/92866.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92866.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/92866.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ string:准 STL Container

历史STL 最初是一套独立的泛型库&#xff08;Alexander Stepanov 等人贡献&#xff09;&#xff0c;后来被吸纳进 C 标准库&#xff1b;std::basic_string 则是早期 C 标准&#xff08;Cfront / ARM 时代&#xff09;就存在的“字符串类”&#xff0c;并非 STL 原生物。std::st…

Golang学习笔记--语言入门【Go-暑假学习笔记】

目录 基础语法部分相关概念 基础语法部分概念详解 可见性 导包 内部包 运算符 转义字符 函数 风格 函数花括号换行 代码缩进 代码间隔 花括号省略 三元表达式 数据类型部分相关概念 数据类型部分概念详解 布尔类型 整型 浮点型 复数类型 字符类型 派生类型…

linux中kill 命令使用详解

在Linux系统里&#xff0c;kill命令的主要功能是向进程发送信号&#xff0c;以此来控制进程的运行状态。下面为你详细介绍它的使用方法&#xff1a; 基础语法 kill [选项] [进程ID]进程ID也就是PID&#xff0c;可通过ps、pgrep或者top等命令来获取。 常用信号及其含义 信号可以…

Nginx 安装与 HTTPS 配置指南:使用 OpenSSL 搭建安全 Web 服务器

Nginx 安装与 HTTPS 配置指南:使用 OpenSSL 搭建安全 Web 服务器 一、Nginx安装 1. 安装依赖项 sudo yum groupinstall "Development Tools" -y # 非必须 sudo yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel -y2.下载Nginx wget http://n…

写个 flask todo app,简洁,实用

- 此项目虽然看起来简单&#xff0c;实际上&#xff0c;修改成自己喜欢的样子&#xff0c;也是费时间的。 - 别人都搞AI 相关的项目&#xff0c;而我还是搞这种基础的东西。不要灰心。 - 积累。不论项目大小&#xff0c;不论难易&#xff0c;只看是否有用。项目地址&#xff1a…

4麦 360度定位

要在 ESP32 上用 4 个麦克风实现 360 声源定位&#xff0c;通常思路是通过 时延估计&#xff08;TDOA&#xff09; 几何计算&#xff0c;核心流程&#xff1a;阵列布置将 4 个麦克风等间距布置成正方形&#xff08;或圆形&#xff09;。记阵列中心为原点&#xff0c;麦克风编号…

使用yolov10模型检测视频中出现的行人,并保存为图片

一、使用yolov10模型检测视频中出现的行人&#xff0c;并保存为图片&#xff0c;detect_person.py代码如下&#xff1a;from ultralytics import YOLOv10 import glob import os import cv2 import argparsedef detect_person(videoPath, savePath):if not os.path.exists(save…

现在希望用git将本地文件crawler目录下的文件更新到远程仓库指定crawler目录下,命名相同的文件本地文件将其覆盖

git checkout main git pull origin main $source “D:\黑马大数据学习\crawler” $dest Join-Path (Get-Location) “crawler” if (-not (Test-Path $dest)) { New-Item -ItemType Directory -Path $dest | Out-Null } Copy-Item -Path $source* -Destination $dest -Recur…

网络调制技术对比表

&#x1f4ca; 网络调制技术全维度对比表​调制技术​​简称​​频谱效率​​抗噪性​​功率效率​​复杂度​​关键特性​​典型应用场景​​幅度键控​ASK低差高低/低电路简单&#xff0c;易受干扰遥控器、光通信(OOK)​频移键控​FSK低-中中中中/中抗噪较好&#xff0c;频谱…

优化 Elasticsearch JVM 参数配置指南

一、概述 Elasticsearch 是基于 JVM 的搜索和分析引擎。JVM 参数的合理配置直接影响着 Elasticsearch 的性能和稳定性。尽管 Elasticsearch 已经提供了默认的 JVM 设置&#xff0c;但在某些特定场景下&#xff0c;我们可能需要进行适当的调整和优化。 本文将详细讲述如何安全、…

Python, Go 开发如何进入心流状态APP

要开发一款基于Python和Go语言、帮助用户进入“心流”状态&#xff08;高度专注、高效愉悦的心理状态&#xff09;的应用&#xff0c;需结合两种语言的技术优势&#xff08;Go的高并发与性能、Python的灵活性与AI生态&#xff09;及心流触发机制&#xff08;清晰目标、即时反馈…

一文详解手机WiFi模块与连接

目录 1 硬件模块 1.1 Wifi射频模 1.2 电源管理模块 2 软件与协议栈 2.1 系统服务层 2.2 认证与协议处理 3 连接流程 3.1 开启WiFi与扫描 3.2 选择网络与认证 3.3 连接与IP分配 4 特殊连接方式 4.1 WPS快速连接 4.2 热点模式&#xff08;AP模式&#xff09; 4.3 U…

Java 网络编程详解:从基础到实战,彻底掌握 TCP/UDP、Socket、HTTP 网络通信

作为一名 Java 开发工程师&#xff0c;你一定在实际开发中遇到过需要与远程服务器通信、实现客户端/服务端架构、处理 HTTP 请求、构建分布式系统等场景。这时&#xff0c;Java 网络编程&#xff08;Java Networking&#xff09; 就成为你必须掌握的核心技能之一。Java 提供了丰…

Java面试题(中等)

1. 计算机网络传输层有哪些协议&#xff1f;分别适用于什么场景&#xff1f;TCP协议(传输控制协议)​&#xff1a;面向连接、可靠传输&#xff0c;流量控制、拥塞控制。适用于要求数据完整性的场景&#xff0c;如文件传输、网页浏览、电子邮件等。UDP协议 (用户数据报协议)​&a…

Apache 消息队列分布式架构与原理

消息队列 基本概念 定义 消息队列&#xff08;Message Queue, MQ&#xff09;是一种分布式中间件&#xff0c;通过异步通信、消息暂存和解耦生产消费双方的机制&#xff0c;提供消息的顺序性保证、可靠投递和流量控制能力&#xff0c;广泛应用于微服务解耦、大数据流处理等场景…

ModernBERT如何突破BERT局限?情感分析全流程解析

自2018年推出以来&#xff0c;BERT 彻底改变了自然语言处理领域。它在情感分析、问答、语言推理等任务中表现优异。借助双向训练和基于Transformer的自注意力机制&#xff0c;BERT 开创了理解文本中单词关系的新范式。然而&#xff0c;尽管成绩斐然&#xff0c;BERT 仍存在局限…

股票Level2逐笔成交及十档订单簿分钟级Tick历史行情数据详细解析

本地股票数据处理与分析实战指南 在量化投资与金融数据分析领域&#xff0c;高效处理本地存储的股票数据是核心能力之一。本文将从数据类型定义、解析流程及实际应用角度&#xff0c;系统介绍如何基于CSV文件管理股票分钟数据、高频Tick数据、逐笔数据、Level2历史行情等多样化…

面向互联网2C业务的分布式类Manus Java框架

本文介绍了阿里巴巴推出的分布式类ManusAgent框架——ali-langengine-dflow&#xff0c;旨在解决现有Agent架构在互联网2C业务场景中的局限性。文章从背景出发&#xff0c;分析了当前主流Agent架构&#xff08;如Manus、字节TARS、AutoGLM&#xff09;存在的问题&#xff0c;如…

Java-82 深入浅出 MySQL 内部架构:服务层、存储引擎与文件系统全覆盖

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; AI炼丹日志-30-新发布【1T 万亿】参数量大模型&#xff01;Kim…

开发避坑短篇(6):Vue+Element UI 深度选择器实现表单元素精准对齐的技术实践

需求 el-form 表单的el-input和el-select默认宽度度不一致&#xff0c;导致不对齐&#xff0c;如下图。那么如何设置让el-input和el-select的宽度度一致并对齐&#xff1f;<el-form class"page-form" :model"addForm" :rules"rules" :disable…