【Unity游戲】——1.俄羅斯方塊

搭建場景

使用任意方塊、純色瓦片或者其他圖形作為背景,設置其大小與目標大小一致或者更大,設置左下角為場景頂點,并放置在(0,0)處。調整攝像機至合適位置。

制作游戲預制體

每個方塊預制體包含有4個小方塊以及一個圍繞旋轉的節點。先設置一個小方塊的坐標為(0,0),在此基礎上擺放其他小方塊,設置一個合適的旋轉節點。

腳本

思路

實現方塊自由下落? ? ? ? ->?Block.cs

實現方塊左右移動、加速下落、旋轉??????? ->?Block.cs

限制方塊移動范圍???????? ->?Block.cs

把方塊加入到場景中????????->?Board.cs

禁用該方塊的腳本 ? ? ? ->?Block.cs

檢測方塊是否滿行?????????->?Board.cs

滿行則消除該行?????????->?Board.cs

下移該行上面的方塊????????->?Board.cs

實現代碼

Block.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum MoveType
{Move,Rotate,MoveDown,MoveRight,MoveLeft,Stop
}public class Block : MonoBehaviour
{private float timer = 0;private float moveSpeed = 0.8f;private float moveDownSpeed = 0.2f;private bool isCanMove = true;private Transform rotatePoint = null;private MoveType moveType = MoveType.Move;private void Start(){Init();}private void Update(){if (isCanMove){if (Input.GetKeyDown(KeyCode.W)){controlMove(MoveType.Rotate);}if (Input.GetKeyDown(KeyCode.S)){controlMove(MoveType.MoveDown);}if (Input.GetKeyUp(KeyCode.S)){controlMove(MoveType.Move);}if (Input.GetKeyDown(KeyCode.A)){controlMove(MoveType.MoveLeft);}if (Input.GetKeyDown(KeyCode.D)){controlMove(MoveType.MoveRight);}TryMove(MoveType moveType);}}// 初始化方塊public void Init(){// 初始化旋轉點rotatePoint = transform.GetChild(transform.childCount - 1);}// 改變移動類型private void controlMove(MoveType moveType){if (isCanMove){this.moveType = moveType;}}// 方塊移動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;}}// 檢查方塊是否可以移動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;}// 檢查是否與其他方塊重疊if (Board.grid[roundX, roundY] != null){return false;}}return true;}// 方塊下落private void MoveFall(){timer += Time.deltaTime;if (timer >= moveSpeed){transform.position += Vector3.down;if (!IsCanMove()){transform.position -= Vector3.down;moveType = MoveType.Stop;}timer = 0;}}// 方塊加快下落private void MoveDown(){timer += Time.deltaTime;if (timer >= moveDownSpeed){transform.position += Vector3.down;if (!IsCanMove()){transform.position -= Vector3.down;moveType = MoveType.Stop;}timer = 0;}}// 方塊向左移動private void MoveLeft(){transform.position += Vector3.left;if (!IsCanMove()){transform.position -= Vector3.left;}moveType = MoveType.Move;}// 方塊向右移動private void MoveRight(){transform.position += Vector3.right;if (!IsCanMove()){transform.position -= Vector3.right;}moveType = MoveType.Move;}// 方塊旋轉private void Rotate(){transform.RotateAround(rotatePoint.position, Vector3.forward, -90);if (!IsCanMove()){transform.RotateAround(rotatePoint.position, Vector3.forward, 90);}moveType = MoveType.Move;}// 方塊停止private void Stop(){isCanMove = false;// Debug.Log("Stop");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);// 添加方塊到Board中Board.Instance.AddBlock(roundX, roundY, transform.GetChild(i));}// 檢查游戲是否結束Debug.Log("檢查游戲是否結束!");Board.Instance.IsGameOver(transform);// 消除行Debug.Log("檢查是否消除行!");Board.Instance.CheckLine();// 生成新方塊Board.Instance.SpawnBlock();enabled = false;}
}

Board.cs

這里繼承了一個單例模式的泛型類,簡而言之就是這里需要創建單例模式。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Board : SingletonMono<Board>
{public static int width = 10;public static int height = 15;public static Transform[,] grid = new Transform[width, height + 5];private int randIndex;       // 隨機生成方塊的索引private float timer = 0f;         // 計時器private float countdown = 1f;// 倒計時private GameObject generatorPoint;private Vector3 createPos;private GameObject[] blocks;private List<GameObject> blockList;protected override void Awake(){base.Awake();Init();}private void Start(){// Debug.Log(blockList.Count);SpawnBlock();}private void Update(){timer += Time.deltaTime;if (timer >= countdown){ClearNullBlock();timer = 0;}}// 初始化private void Init(){generatorPoint = new GameObject();createPos = new Vector3(width / 2 - 1, height + 1, 0);generatorPoint.transform.position = createPos;// generatorPoint.transform.parent = transform;blockList = new List<GameObject>();blocks = Resources.LoadAll<GameObject>("Prefabs/Block");foreach (GameObject block in blocks){blockList.Add(block);}}// 生成方塊public void SpawnBlock(){randIndex = Random.Range(0, blockList.Count);if (blockList[randIndex].GetComponent<Block>() == null){blockList[randIndex].AddComponent<Block>();}Instantiate(blockList[randIndex], generatorPoint.transform.position, Quaternion.identity, transform);}// 添加方塊public void AddBlock(int x, int y, Transform block){grid[x, y] = block.transform;}// 檢查游戲是否結束public void IsGameOver(Transform block){if (block.position.y >= createPos.y){Debug.Log("Game Over");}}// 檢查是否有可以消除的行public void CheckLine(){for (int i = height - 1; i >= 0; i--){if (IsLineFull(i)){RemoveLine(i);}}}// 檢查行是否滿private bool IsLineFull(int y){for (int i = 0; i < width; i++){if (grid[i, y] == null){return false;}}return true;}// 消除方塊public void RemoveLine(int x){for (int i = 0; i < width; i++){Destroy(grid[i, x].gameObject);grid[i, x] = null;}MoveBlockdown(x);}// 下移方塊public void MoveBlockdown(int h){for (int i = h; i < height; i++){for (int j = 0; j < width; j++){if (grid[j, i] != null){grid[j, i - 1] = grid[j, i];grid[j, i] = null;grid[j, i - 1].position += Vector3.down;}}}}// 清理空對象private void ClearNullBlock(){for (int i = 1; i < transform.childCount; i++){if (transform.GetChild(i).childCount == 1){Destroy(transform.GetChild(i).gameObject);}}}
}

了解更多

【日志】unity俄羅斯方塊(一)——邊界限制檢測-CSDN博客【日志】unity俄羅斯方塊(二)——方塊碰撞檢測-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90903.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90903.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90903.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C++進階】---- 二叉搜索樹

1.二叉搜索樹的概念 ?叉搜索樹?稱?叉排序樹&#xff0c;它或者是?棵空樹&#xff0c;或者是具有以下性質的?叉樹: ? 若它的左?樹不為空&#xff0c;則左?樹上所有結點的值都?于等于根結點的值 ? 若它的右?樹不為空&#xff0c;則右?樹上所有結點的值都?于等于根結…

基于 OpenCV 與 sklearn 的數字識別:KNN 算法實踐

在計算機視覺領域&#xff0c;數字識別是一個經典問題&#xff0c;廣泛應用于郵政編碼識別、車牌識別等場景。本文將介紹如何使用 OpenCV 進行圖像處理&#xff0c;并結合 KNN&#xff08;K 近鄰&#xff09;算法實現數字識別&#xff0c;同時對比 OpenCV 內置 KNN 與 scikit-l…

利用徑向條形圖探索華盛頓的徒步旅行

利用徑向條形圖探索華盛頓的徒步旅行 import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np import pandas as pdfrom matplotlib.cm import ScalarMappable from matplotlib.lines import Line2D from mpl_toolkits.axes_grid1.inset_locator impor…

火狐瀏覽器中國特供版關閉,如何下載 Firefox 國際版?如何備份數據?

火狐瀏覽器中國特供版關閉&#xff0c;如何下載 Firefox 國際版&#xff1f;如何備份數據&#xff1f;各位火狐老用戶注意了&#xff01;7 月 27 日北京謀智火狐正式發布公告&#xff1a;2025 年 9 月 29 日 24:00 起&#xff0c;中國特供版賬戶服務將徹底關閉&#xff0c;所有…

C語言操作符詳解:從基礎到進階

在C語言中&#xff0c;操作符是構建表達式的基礎&#xff0c;掌握各類操作符的用法、優先級及特性&#xff0c;對寫出高效且正確的代碼至關重要。本文將系統梳理C語言操作符的核心知識點&#xff0c;包含實例代碼與詳細解析&#xff0c;助你徹底搞懂操作符。 1. 操作符的分類 C…

鴻蒙平臺運行Lua腳本

1. 目標 使用 rust 在移動端實現 Lua 腳本的運行。 2. 核心步驟 [Rust Host App]│├── [mLua VM] (通過 mlua 或 rlua 庫嵌入)│ ├── 獨立Lua狀態&#xff08;隔離執行&#xff09;│ ├── 受限標準庫&#xff08;禁用危險函數&#xff09;│ └── 內存/CPU限…

【Ubuntu】發展歷程

Ubuntu 是一個基于 Debian 的 Linux 發行版&#xff0c;由 Canonical 公司開發和維護。它以其易用性、穩定性和強大的社區支持而著稱。以下是 Ubuntu 從發布以來的主要版本和發展歷程&#xff1a;1. Ubuntu 4.10 "Warty Warthog" (2004)發布日期&#xff1a;2004年10…

k8s下springboot-admin 監控服務部署,客戶端接入

踩坑及解決以下問題 1、客戶端監控信息不顯示,需要暴露監控檢查接口路徑 2、服務端不顯示客戶端日志,需要啟用日志,并指定日志路徑 3、解決在k8s下,客戶端多實例注冊id相同,如2個實例只顯示一個 整體架構 springboot-admin 由服務端和客戶端組成 服務端負責 1、提供 We…

git刪除遠程分支和本地分支

1. git刪除遠程分支 git push origin --delete [branch_name]2. 刪除本地分支 2.1 git branch -d 會在刪除前檢查merge狀態&#xff08;其與上游分支或者與head&#xff09;。 git branch -d [branch_name] 2.2 git branch -D 直接刪除 git branch -D 是 git branch --delete…

Go 的時間包:理解單調時間與掛鐘時間

Go 的時間包&#xff1a;理解單調時間與掛鐘時間 &#x1f4c5; 引言 Go 語言自版本 1.9 起在 time.Time 中同時支持 “掛鐘時間&#xff08;wall?clock&#xff09;” 和 “單調時間&#xff08;monotonic clock&#xff09;”&#xff0c;用于分別滿足時間戳與時間間隔測量…

Android啟動時間優化大全

1 修改Android mksh默認的列長度 不修改這個參數&#xff0c;adb shell后&#xff0c;輸入超過80個字符&#xff0c;就不能看到完整的命令行。external/mksh/src/sh.h EXTERN mksh_ari_t x_cols E_INIT(80); EXTERN mksh_ari_t x_lins E_INIT(24);2 Kernel優化 2.1 內核驅動模塊…

matplotlib.pyplot: 底層原理簡析與進階技巧

文章目錄 1 底層實現原理 1.1 核心架構 1.1 渲染流程 2 基礎用法 2.1 基本繪圖 2.2 多子圖系統 2.3 高階用法 2.3.1 自定義Artist對象 2.3.2 高級動畫技術 2.3.3 事件處理系統 2.3.4 混合渲染技術 3 性能優化技巧 4 擴展模塊 5 總結 5.1 底層原理關鍵點 5.2 進階技巧 1 底層實現…

深入理解現代前端開發中的 <script type=“module“> 與構建工具實踐

引言&#xff1a;模塊化開發的演進在早期的前端開發中&#xff0c;JavaScript 缺乏原生的模塊化支持&#xff0c;開發者不得不依賴 IIFE&#xff08;立即調用函數表達式&#xff09;或第三方庫&#xff08;如 RequireJS&#xff09;來實現代碼組織。隨著 ES6&#xff08;ES2015…

yolo--qt可視化開發

qt5可能不支持我們的cuda版本&#xff0c;改用qt6 YOLO11QT6OpencvC訓練加載模型全過程講解_yolov11 模型轉換成opencv c模型-CSDN博客 下面是qt5版本的案例&#xff0c;和yolo及cuda有沖突 安裝qt 切換到虛擬環境&#xff0c;例如pyqt&#xff0c;conda activate pyqt pip …

SQL性能優化

show [session|global] status : 查看服務器狀態 show global status like Com_ : 查看各種語句的執行次數 開啟慢查詢: 在 MySQL 配置文件&#xff08;/etc/my.cnf&#xff09;配置: #開啟MySQL慢日志查詢開關 slow_query_log1 #設置慢日志的時間為2秒&#xff0c;SQL語句執…

ctfshow pwn40

目錄 1. 分析程序 2. 漏洞編寫 3. 漏洞驗證 1. 分析程序 首先檢查程序相關保護&#xff0c;發現程序為32位且只開啟了一個NX保護 checksec pwn 使用IDA進行逆向分析代碼&#xff0c;查看漏洞觸發點&#xff1a; 在main函數中&#xff0c;有一個ctfshow函數&#xff0c;這里…

SQL173 店鋪901國慶期間的7日動銷率和滯銷率

SQL173 店鋪901國慶期間的7日動銷率和滯銷率 SQL題解&#xff1a;店鋪動銷率與滯銷率計算 關鍵&#xff1a;只要當天任一店鋪有任何商品的銷量就輸出該天的結果&#xff0c;即使店鋪901當天的動銷率為0。 潛臺詞&#xff1a;?輸出邏輯與店鋪901的銷售情況無關&#xff0c;只取…

PytorchLightning最佳實踐基礎篇

PyTorch Lightning&#xff08;簡稱 PL&#xff09;是一個建立在 PyTorch 之上的高層框架&#xff0c;核心目標是剝離工程代碼與研究邏輯&#xff0c;讓研究者專注于模型設計和實驗思路&#xff0c;而非訓練循環、分布式配置、日志管理等重復性工程工作。本文從基礎到進階&…

Apache Flink 實時流處理性能優化實踐指南

Apache Flink 實時流處理性能優化實踐指南 隨著大數據和實時計算需求不斷增長&#xff0c;Apache Flink 已經成為主流的流處理引擎。然而&#xff0c;在生產環境中&#xff0c;高并發、大吞吐量和低延遲的業務場景對 Flink 作業的性能提出了更高要求。本文將從原理層面深入解析…

ubuntu上將TempMonitor加入開機自動運行的方法

1.新建一個TempMonitor.sh文件&#xff0c;內容如下&#xff1a;#!/bin/bashcd /fjrobot/ ./TempMonitor &2.執行以下命令chmod x TempMonitor chmod x TempMonitor.sh rm -rf /etc/rc2.d/S56TempMonitor rm -rf /etc/init.d/TempMonitor cp /fjrobot/TempMonitor.sh /etc/…