Unity實(shí)現(xiàn)俄羅斯方塊(二)
本文實(shí)例為大家分享了Unity實(shí)現(xiàn)俄羅斯方塊第2部分,供大家參考,具體內(nèi)容如下
代碼部分
1. 實(shí)現(xiàn)物體自由降落(在有關(guān)于物體的腳本中編寫)
1)、使用循環(huán)調(diào)用方法實(shí)現(xiàn)
public float speed = 0.3f;//物體下落 // Start is called before the first frame update void Start() { InvokeRepeating("Move", 0, speed); } void Move() { transform.position += new Vector3(0, -1, 0); }
2)、使用時(shí)間差進(jìn)行自由降落(在這里使用的該方法)
float lastFail=0; else if (Input.GetKeyDown(KeyCode.DownArrow)||Time.time-lastFail>=1) { transform.position += new Vector3(0, -1, 0); lastFail = Time.time; }
2. 處理碰邊界問題
邏輯部分:
1)、得到游戲區(qū)域的寬度和高度,分析寬度和高度能放多少個(gè)格子,用一個(gè)二維數(shù)組來保存信息。如果占據(jù)了這個(gè)格子將其設(shè)置為非空。
2)、編寫格子的腳本,處理格子的邏輯。
代碼部分:
//設(shè)置變量 public static int width = 10;//游戲窗口的寬度 public static int height = 20;//游戲窗口的高度 public static Transform[,] grid=new Transform[width,height]; //*注:變量應(yīng)設(shè)置成static 否則無法引用
3. 處理物體是否還能下降問題(物體腳本)
邏輯部分:
1)、在一個(gè)格子剛產(chǎn)生的時(shí)候,就要判斷是否能繼續(xù)下落,如果還可以繼續(xù)下落,說明游戲仍可進(jìn)行,如果不能繼續(xù)下落,說明游戲結(jié)束。
2)、所以判斷能都繼續(xù)下落的重要條件依據(jù)就是下方的格子是否被占據(jù)。也可以先移動(dòng)位置,判斷移動(dòng)后的位置是否有效,如果有效,物體進(jìn)行移動(dòng),否則不移動(dòng)。
3)、編寫是否組成物體的格子是否在邊界內(nèi),防止超出邊界(游戲區(qū)域格子腳本),每一個(gè)格子的x要大于左邊界且小于右邊界,y要大于下邊界。
4)、當(dāng)其在uodate不能下落時(shí),應(yīng)該產(chǎn)生一個(gè)新的物體,并且將當(dāng)前的物體的腳本進(jìn)行關(guān)閉,避免腳本還發(fā)生作用。
代碼部分:
格子腳本:
public static Vector2 roundVec2(Vector2 v) { return new Vector2(Mathf.Round(v.x), Mathf.Round(v.y)); } public static bool insideBorder(Vector2 pos) { //注寬是小于否則會出邊界 if ((int)pos.x >= 0 && (int)pos.x <width && (int)pos.y >= 0) return true; else return false; }
物體腳本:
void Start() { if (!isValidGridPos())//剛產(chǎn)生就無效 { Debug.Log("GAME OVER"); } } float lastFail=0; // Update is called once per frame void Update() { //控制物體向左移 if (Input.GetKeyDown(KeyCode.LeftArrow)) { transform.position += new Vector3(-1, 0, 0); if (isValidGridPos()) { } else { transform.position += new Vector3(1, 0, 0); } } //控制物體右移 else if (Input.GetKeyDown(KeyCode.RightArrow)) { transform.position += new Vector3(1, 0, 0); if (isValidGridPos()) { } else { transform.position += new Vector3(-1, 0, 0); } } //控制物體旋轉(zhuǎn) else if (Input.GetKeyDown(KeyCode.UpArrow)) { //可在unity編輯器中通過旋轉(zhuǎn)可得是對z軸進(jìn)行旋轉(zhuǎn) transform.Rotate(0, 0, -90); if (isValidGridPos()) { } else { transform.Rotate(0, 0, 90); } } else if (Input.GetKeyDown(KeyCode.DownArrow)||Time.time-lastFail>=1) { transform.position += new Vector3(0, -1, 0); if (isValidGridPos()) { } else { transform.position += new Vector3(0, 1, 0); FindObjectOfType<Spawner>().spawnNext(); enabled = false; } lastFail = Time.time; } } bool isValidGridPos()//判斷是否有效 { foreach (Transform child in transform) { Vector2 v=Grid.roundVec2(child.position); //判斷是否在邊界之間 if (!Grid.insideBorder(v)) return false; if (Grid.grid[(int)v.x, (int)v.y] != null) return false; } return true; }
更多俄羅斯方塊精彩文章請點(diǎn)擊專題:俄羅斯方塊游戲集合 進(jìn)行學(xué)習(xí)。
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
c#實(shí)現(xiàn)簡單控制臺udp異步通信程序示例
這篇文章主要介紹了c#實(shí)現(xiàn)簡單控制臺udp異步通信程序示例,需要的朋友可以參考下2014-04-04C#實(shí)現(xiàn)一個(gè)控制臺的點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)一個(gè)控制臺的點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11c#?理解csredis庫實(shí)現(xiàn)分布式鎖的詳細(xì)流程
這篇文章主要介紹了c#?理解csredis實(shí)現(xiàn)分布式鎖,該庫本身已經(jīng)足夠完善,這里我畫蛇添足一下,為了方便自己的使用,本文通過實(shí)例代碼給大家詳細(xì)介紹,需要的朋友可以參考下2022-02-02Unity游戲開發(fā)之射擊小游戲的實(shí)現(xiàn)
本篇文章為大家?guī)硪粋€(gè)橫版2D射擊小游戲,游戲制作超級簡單,玩法一學(xué)就會。文中的示例代碼講解詳細(xì),快跟隨小編一起動(dòng)手試一試2022-03-03Unity中的PostProcessBuild實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity中的PostProcessBuild實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05