Unity 3D俄羅斯方塊

2021-06-14 04:49:13 字數 3165 閱讀 9385

學習unity也有一段時間了,從一開始的懵懵懂懂到現在的學有所小成,心裡挺是高興的,不過目前還是處於初學者階段,很多東西還等著自己去發掘去學習。

最近做了乙個3d俄羅斯方塊小遊戲作為練手,花了有兩個多星期吧,感覺話費太多時間了,中間不斷地修改實現的方法,但確實讓自己學到很多東西,可能對有些人來說,俄羅斯方塊根本算不上什麼,不過對於初學者來說,練手還是能學到很多東西的,好了,廢話不多說,接下來說說我如何完成的吧,先貼上最終的效果圖

其實對於3d的俄羅斯方塊,我覺得可以用多種方法實現的,一開始,我嘗試用unity提供的碰撞機制去做這個遊戲,結果問題乙個個接踵而來,解決了乙個又出現了另乙個,最後只能上網找教程,網上是有網友實現了的,有一種unity實現方法是直接用gui,把button當作方塊,雖然也能做出很好的效果,但是我覺得這樣就不算3d了吧。另外我還找到乙份**,它實現了真正意義上的3d俄羅斯方塊,不過它是js寫的,我試著看了一下**,然後自己用c#寫了乙個自己的,看**裡面的注釋,應該是外國的,看完它的**,著實讓我學到很多東西,我之前想通過真正的碰撞去完成這個遊戲,結果問題多多,但是網上的這份**提出了一種很聰明的解決方法,用兩個布林型別的陣列分別存放已經固定下來的方塊和正在掉落的方塊,通過判斷下落方塊下乙個位置對應座標的布林值的真假,為真則停止下落,固定位置。另外可以將邊界對應的值設為真,從而方塊在碰到邊界無法繼續運動。在檢測滿一行方塊消除的時候也相當的方便,可以直接對布林陣列進行操作。這種思維讓我恍然大悟,才發現自己真的是有待提高啊。

好了,開始動手,首先你需要乙個正方體模型,它的邊界需要經過一些處理,在多個相連的時候才能顯現出接痕,這個我自己用maya做了乙個,很簡單的。然後匯入模型的fbx檔案到你的專案中。

接著建立乙個新場景,在場景中建立邊界,如效果圖中所示,用unity自帶的cube就可以了,改一下一些引數就可以有圖中的效果,當然你也可以自己製作邊界物體。設定左邊界x座標為3,右邊界為14,這不是硬性規定說得設定成這樣的,這不過是方便我編寫**而已,哦,另外,由於方塊的最大size是4,所以我兩邊都留出了4個位置,中間10個位置是方塊可以放置的地方,底邊界放置在0位置。建立乙個空物體物件命名為manager,並為其建立乙個繫結指令碼manager.cs,接著一一建立對應方塊的空物件,對其各自命名,注意,之前我匯入的正方體只是方塊的組成單體,不同形狀的方塊需要四個正方體拼接在一起,正常俄羅斯方塊遊戲中有7種方塊,將這七個空物體物件建立為prefab,一一對應命名,再接著為方塊建立繫結指令碼,這裡,我只需要乙個指令碼檔案,即7種方塊都繫結同乙個指令碼。

我試過各自做出七個不同的模型,結果,很麻煩,由於模型是乙個整體,消除部分是乙個問題,然後我還要寫七個指令碼對應不同的方塊,其實有很多東西是一樣的,這簡直就是浪費時間和資源。然後我發現了網上**中用了一種和巧妙的方法,在繫結的指令碼中,設定乙個公有的字串陣列,值只有0和1,顯示出方塊的形狀,比如直方塊,即4個正方體直線連線在一起,這是我們需要填上字串陣列的size為4,然後string[1]的值為「1111」,其餘都為0,大家應該都明白了吧,乙個方塊,算上周圍的空的地方圍成乙個正方體,必須是正方體,不然旋轉之後,你的資料沒辦法修改。

在manager中建立乙個公有的gameobject陣列,然後把7種方塊對應的prefab拖拽到陣列裡面,manager隨機生成方塊,繫結方塊的指令碼根據字串陣列組合正方體。這一步算是最重要的吧,根據字串陣列計算組成方塊各正方體的位置,一開始就是因為老是弄錯正方體的位置所以除了點問題,還有就是旋轉軸心,軸心錯了也會讓你接下來的步驟漏洞百出。

首先,在之前我們建立方塊空物件物體的時候,座標都是為(0, 0, 0)的,就以這個作為軸心點座標,如果size是奇數的話,那麼處於圍繞方塊大正方體中間的那個正方體的中心就是軸心座標,如果size為偶數的話,大正方體的中心便為軸心,以軸心座標確定各個正方體的位置,這是相當重要的。注意,各個正方體在方塊中的座標不同於在世界座標中的座標,軸心座標即方塊在世界座標系中的座標,找對了軸心才能正確算出各個正方體在世界座標系中的座標。

還有,上文提到的,將字串陣列轉換為布林型別的陣列,方便做碰撞檢測,確定軸心後,各部分的正方體位置就容易計算了,可以根據size,參照值為(size-1)* 0.5,大家畫一下圖就知道為什麼是(size-1)*0.5了,方法不是唯一的,大家有更簡便易懂的方法更好啦,貼一段**吧:

for(int y=0;y

接著便是計算各正方體在世界座標系中的x座標,即方塊在世界座標中的座標減去(size-1)*0.5,求出方塊外圍正方體左上角的第乙個正方體的x座標,同樣道理,這個應該不難理解,其y座標為已知,可根據它來確定方塊的起始下落位置,參考值也是(size-1)*0.5。哦,起始下落位置的設定也是有規律的,當size為偶數時,座標必須是符合規定範圍內的乙個整數加0.5,如果是奇數的話,中心正方體的座標可作為方塊的起始座標

當方塊旋轉時,判斷其是否可以旋轉(邊界等),可以旋轉,則要變換方塊對應的布林陣列,跟著相同方向旋轉陣列即可。

當方塊停止下落時,銷毀方塊,同時將記錄下來的各個正方體的座標對應的產生正方體,這一步是為了接下來方便銷毀滿一行的正方體,修改對應的整個區域的布林陣列,上文提到的。判斷是否滿一行也很簡單,同乙個y座標,連續十個x座標對應的布林值為真即銷毀正一行的正方體,然後大於y的正方體集體下落乙個單位,再繼續檢測。

以上已經完成遊戲的大半部分了,也算是解決了乙個技術難點吧,接著是執行,本實現方法用yield來實現遊戲一幀一幀的動畫,初開始接觸這個東西,只是普通的認為它就是乙個延緩暫停的機制。最近才知道其真正的用法。這裡我們需要在start函式中執行我們要的操作,然後遊戲就可以如我們所期望的那樣運作了。其實,用update函式也是可以實現的,可能會麻煩一點,用yield反而比較簡便。

在while(true)迴圈裡面使用yield,滿足特定條件時跳出迴圈,注意,請務必設定乙個跳出的特定條件,而且是程式會最終執行到那一步的,不然,程式會陷入死迴圈。另外,在有些時候延緩執行或者整個程式進入等待,這裡需要特別注意一下,因為yield畢竟不能像update函式那樣,在一幀一幀裡實現你要的效果,稍微錯漏某個地方都會讓你的遊戲沒法像預期那樣執行,可以自己嘗試著在**中修改讓後執行,根據結果的不同可更清楚地認識了解yield的用法。還有就是yield的用法在js與c#中大為不同,這是需要注意的,在把js**重寫成c#**的時候需要特別注意這一點。

大概就這麼多吧,這裡附上兩個**資源,乙個js版的,乙個c#版,可根據自己的語言喜好選擇,不過js**中有些東西跟上述的不符,不過大概原理是一樣的。

3d俄羅斯方塊js版

3d俄羅斯方塊c#版

Unity 3D俄羅斯方塊

學習unity也有一段時間了,從一開始的懵懵懂懂到現在的學有所小成,心裡挺是高興的,不過目前還是處於初學者階段,很多東西還等著自己去發掘去學習。最近做了乙個3d俄羅斯方塊小遊戲作為練手,花了有兩個多星期吧,感覺話費太多時間了,中間不斷地修改實現的方法,但確實讓自己學到很多東西,可能對有些人來說,俄羅...

Unity3D實現俄羅斯方塊

unity實現俄羅斯方塊 三 解決穿透問題 邏輯部分 在物體進行移動的過程中更新格仔的資訊,原來的所佔據的位置資訊進行置空操作,現在所佔據的格仔進行賦值操作。在移動後的位置進行判斷,首先移動後的位置不能是null,且不能不是移動後的物體 部分void updategrid 加入本次的更新的位置資訊 ...

俄羅斯方塊高階 AI俄羅斯方塊

前文回顧 致青春 python實現俄羅斯方塊 人工智慧大火的今天,如果還是自己玩俄羅斯方塊未免顯得太low,為什麼不對遊戲公升級,讓機器自己去玩俄羅斯方塊呢?有了這個想法之後利用週六週日兩天的時間去蒐集了大量的資料,在電腦宕機好多次之後終於將ai俄羅斯方塊實現了。所謂讓機器自己去玩俄羅斯方塊,就是讓...