【日志】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.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…