當前位置: 華文問答 > 遊戲

Unity2D格鬥遊戲開發問題?

2016-03-03遊戲

謝邀。

//============================突然興起寫了個關於移動的=====================

提示資訊 - GameRes遊資網

這裏所說的橫版動作遊戲,包含且不限於2D橫版動作遊戲、橫版跑酷遊戲、橫版格鬥遊戲,只要邏輯層是橫板的,且對於判定需要及高精度的(比如在動作遊戲中就是拳頭命中身體才算中,而不是WoW中,雖然近戰攻擊有時候看起來還有點距離,但是伺服器計算命中就算命中了)就屬於「橫版動作遊戲」範疇。

1,邏輯的世界

在一個橫版動作遊戲中,我們就討論這個移動問題,把世界拆散成三個,他們互相之間是並列的,由這些並列的世界,組成了玩家最後看到的遊戲,事實上不同的遊戲中並列的世界可能會有更多個。

在這篇裏,我主要說的就是移動世界,一個邏輯世界。在開發遊戲的時候,當開發者處於這個世界時,會拋開一切攻防判定世界和貼圖世界的資訊。

2,地形

地形的定義我就不作出解釋了,僅僅要說明的,地形並不僅僅是踩在腳下的。在橫版動作遊戲中,地形可以有以下一些資訊:

1)座標點

地形在這個世界上的點位置,一切地形相關的控制由這個點的變化來決定他的位置,座標點不是一個2維的x,y,它還包含了一維inWorld,我們暫且這麽稱呼,表示他是否在世界上存在。座標點(x,y)的作用大家肯定第一時間可以抽象的出來——就是在一些橫版動作遊戲中,有些會移動的島嶼,FC的冒險島、超級馬里奧開始就有。

這個很熟悉吧, 螢幕中間那兩根會帶著你往上或者往下走的地形,有時候角色踩上去還會自動往下掉。這就是(x,y)座標在這裏的作用。而會消失的地形,其實很多橫版動作遊戲也是有的,你接觸的第一個這樣的遊戲可能就是……

FC的經典大作魂鬥羅,我們這一代遊戲人都是玩這個長大的,不少人人生第一個遊戲就是他,在剛開場沒多久,你就能遇到一座橋,走過去的時候會爆炸,原本可以踩的地形inWorld變成false了,當然對於這個橋,更高效的處理是去掉這個地形資訊,但是在另外一些動作遊戲中,他會出現那種若隱若現的地形,出現的時候可以踩,但是消失了就會掉下去

FC的赤影戰士裏面有很多這樣的地形,另外也有成龍之龍等都會有這樣的地形。

2)天花板、充實體、墻壁

這兩個都是可選內容,且都是boolean的,天花板的概念很好理解,就是當角色起跳的時候,會因為頂到天花板而終止跳躍開始下落,這是最常見的,天花板其實還是限制版子邊緣的東西,也就是角色無法往上走了。

最古老的天花板之一:

超級馬里奧開始的時候那些問號、磚頭、頂掉問號後的鐵塊,都是天花板=true的,而魂鬥羅中,大多地形天花板都是False的, 因此角色可以自下而上的跳躍。

充實體則是角色往下跳的障礙,這個真不好找圖(因為無法說明問題),但是相信每個人的遊戲經歷裏面都會遇到:

充實體=false的時候,角色按下和跳是會往下跳一層的。

充實體=true的時候,角色按下跳,要麽就是蹲著,要麽就是原地跳起(根據遊戲設定的按鍵反饋不同)。

至於墻壁,就太好理解了,通常版子邊緣,或者一些橫向不讓走過去的都是Wall=true的,比如上圖瑪麗奧裏面的綠色水管就是個典型。

3)體型

這是地形最重要的內容,這決定了這塊地形的大小。

老式的遊戲中,采用二維陣列作為地圖,依然是Tile Based,如超級馬里奧系列,所以都是正方形。但是隨著遊戲精度要求越來越高,也出現了多邊形的地形,並且世界不再是tile based。

早在MD時代,索尼克已經采用了特殊形狀的地形(可憐國遊的跑酷還做不出來)。體型的作用是什麽我這裏就不多說了,核心在於不是矩形的體型與點的碰撞演算法,是要數學功底的,這裏我就不提供演算法了,自己百度很容易搜到,都是初中、高中教程了。

體型當然不是一個簡單的polygon就了事而得,他還有一個offset座標,這個座標的x,y是與座標內容的x,y產生關系的,已決定這個地形出現在哪兒。我們剛說了移動地形。

4)強制位移、溜滑、彈性。

嚴格的來說,溜滑、彈性是強制位移的一種,但是概念上來說還是要把它們分開。

強制位移,是指當角色處於這個地形的時候,會收到一個外力(forceMoveX, forceMoveY),這些外力會導致角色的移動在x,y方向上受到力的作用:

最常見到的是傳送帶,但是松鼠大戰中著名的強制移動地形不僅僅是傳送帶,還有電風扇。核心在於你往一個方向走會很慢,但是往另一個方向走卻會很快。這裏要特別註意的是,一些遊戲中實作Y方向的強制移動可能是增加角色的重力或者跳躍力。

溜滑內容(通常是float)他的作用是讓角色在停止移動的時候,還會逐漸保持一個減速的ForceMoveX效果:

早在FC的冒險島1代,我們就遇到過這種溜滑的地形。

而彈跳內容(通常也是float),則是給角色強加一個jump的力度,最常見的是:

註意到螢幕中間那個彈簧了麽,就是他!

5)位移軌跡node,可攜帶性。

一些地形有自移動的能力,他們通常會跟隨一定的軌跡移動,而這些地形通常也會需要設定一個可攜帶性,可攜帶性決定了角色在地形上是否會跟隨地形的位移而位移。而地形位移的資訊,除了座標的移動軌跡、每兩個軌跡間的tick長度外(這時候inWorld內容也就起作用了,你可以設計一個地形移動到一個地方突然沒有了),還要設定一個可攜帶性,因為並不是所有的地形都要帶著上面的角色走的(這個自開腦洞吧)。

松鼠大戰裏面的小板車是「最不標準」的位移地形(可攜帶)。當可攜帶為true的時候,我這個地形這一幀的位移,也會成為ForceMove傳遞給角色(所以通常迴圈裏面地形的位移在前,別問我為啥這麽不嚴謹,因為大家都喜歡偷懶)。

6)其他內容

之所以歸納為其他內容,是因為根據遊戲的不同,你還可以給地形帶上一些其他的內容來豐富他,但是這些內容通常與現在正在討論的位移這件事情沒什麽大關系。比如你給地形帶來一個燒傷力,角色走上去會受傷,並且受到吹飛力等影響,的確這個吹飛力會影響到角色的移動,但這個邏輯並不屬於這一層,而是屬於攻防判斷層帶來的影響。

比如洛克人的釘板就會讓角色直接掛了(至於圖裏面為啥沒掛,你懂得)

3,角色

在位移這件事情上,角色又有哪些內容呢?

1)座標與體型

早期的遊戲中,也包括現在很多比較粗糙的遊戲中,角色移動是一個矩形,透過這個矩形與地形(通常也都是矩形,既然這麽做了肯定是效率優先,自然都用矩形)之間的關系來實作位移的每一個細節。

而好一點的遊戲,卻采用了點陣和法線:

一個角色通常有若幹個點來組成,這是在地形(位移)判定的時候用的,而不是攻擊框,這些點共同組成了一個多邊形,這個多邊形,決定了角色與地形的碰撞關系,而在角色中心會有一條法線(視覺上也是這個,但別跟法線貼圖搞混了,完全沒任何關系的),這跟法線是在角色ScaleX(左右反轉)的時候使用的,讓這些邏輯點的座標也發生Scale,通常法線只是一個概念(並不存在實體數據),因為我們在設定角色的每一個動作的點陣(這個點陣是跟動作而非動作的每一幀的,有些遊戲是跟角色的,都不分布道動作)的每一個點的座標的時候,會把發現當做Y軸。而作為角色座標的那個點,通常也是腳下那個X=0的點。

2)移動相關參數

角色本身(請一定註意「本身」)在一幀內移動相關的參數包括:

玩家期望位移(x, jump):這個是根據操作傳過來的x,y方向的唯一,y方向的位移通常為跳躍力(一些遊戲中根據你按跳的時間長度不同,跳躍力是不同的,超級馬里奧就是一個代表,對於玩家來說甚至是一個技巧活)。一些遊戲中,角色在空中可以受到按鍵影響改變跳躍的方向,也就是因為「角色騰空後」依然接受x方向處理。

來自動作的強制位移(forceMoveX, forceMoveY, ignoreFloor):強制位移主要是x,y方向上的,通常來說,會多一個ignoreFloor,但不會有ignoreWall或者ignoreRoof這種,當然成為ignoreFloor也不太科學,他的本意是——當我強制位移中,是否還受到正常的重力影響,典型的是侍魂中的不意打,這是一個非跳躍動作,但他有真的起跳了。還有DNF一些角色的後跳技能。

3)角色在這一幀的位置變化一審(李狗海看多了)

角色的位移,分為2個:X方向和Y方向。

X方向的位移距離=玩家期望X(通常這裏是經過buff等計算的最終X方向的速度)+自身動作forceMoveX+地形ForceMoveX+遊戲其他因素ForceMoveX。

Y方向的位移距離=-起跳力(這裏有2個做法都不能說錯,一些遊戲中先運算了起跳力-重力,而一些則是在下一步運算,這兩個都OK,看coder和designer的想法了)+本身ForceMoveY(如果是Jump變化則為-)+地形ForceMoveY+遊戲設定ForceMoveY。

4)角色的位移定案

當我們知道了角色在2個方向上的移動距離以後,我們就要進行碰撞判斷,決策是否最終能夠去到那個點。

一些老的遊戲的做法,現在可能並不是最合適,但是也是比較好用的是:直接判斷這個點是否能放角色(馬里奧做法),如果可以就過去,否則這次位移的目標點變成角色當前所在點。

更好的做法(惡魔城GBA開始的做法)則是:

我們來看圖1,好的做法(也是適合與任何角度地形的)是將角色的碰撞點當前位置與目標位置相連,並計算這些直線與阻擋的關系。我們在圖2中可以看到,藍色的阻擋橫向的如果是一個天花板,那正確的做法,角色還是應該繼續向上,頂到天花板後才開始下落,但如果采用馬里奧的做法,就會定不到天花板(正巧馬里奧是tile的,大多時候避免了這個問題);而另一些遊戲則是角色的頭頂會超出天花板一點(其實這也完全可以接受)。但是如果做一條線段去判斷,則可以返回出頂端的點(這裏所有的具體演算法都是高中數學水平的,我就不寫了自行百度吧,或者找你家數值策劃去),當然這不是唯一的好處。

我們再仔細看圖2,假如世界上有2中地行,他是橙色的線條,而且她的寬度恰好是橙色線條這麽寬,按照馬里奧的演算法,在速度夠快(移動距離夠大)的時候,我們會穿過這條線,形成「穿墻」,所以我們必須做出這樣一條射線(其實還是線段,畢竟兩頭都知道了,但我們還是需要方向的),以保證不發生這樣的bug,而不是無端的把墻壁變粗,關卡設計畢竟有她的巧妙性,而且你也沒法保證角色的速度不會這麽快對吧?尤其是跑酷遊戲。

關於角色位移,這麽小的一件事情,背後就是這麽復雜的東西,有太多需要思考的東西,太多太多了。而且要註意的是,這裏並沒有說的是,角色之間還有碰撞,當角色之間還有碰撞的時候,其他角色的碰撞框對「我」來說就是地形(墻壁為True,至於充實體和天花板就看你遊戲多麽惡搞了)。所以,真不要小看了動作遊戲裏面的角色移動,跟回合制遊戲的概念是完全不同的!

//===============================之前的回答==============================

這些問題並不是Unity才有的,所以其實問題可以去掉Unity的限制,所有2D格鬥遊戲開發思路是一樣的。

其實這個問題回答起來太長了,我之前寫過一些動作(格鬥)遊戲的相關的東西就已經很多了,但那些要幫你開發一個動作遊戲是不可能的,先給你幾個連結:

格鬥遊戲的招式指令判斷[經驗心得]動作遊戲中連招的實作
[專案經驗]動作遊戲設計中極容易犯的設計錯誤

一個動作遊戲或者格鬥遊戲,每一個Tick(你必須理解他的時間單位是tick,而不是秒,其實就是計時器每一跳)會發生的事情:

1,所謂的位移資訊就是當前角色正要做的動作、動作的第幾幀、這一幀動作的強制位移資訊決定的,所有角色、子彈、地形在這個世界上的位移(在邏輯層,世界是方塊組成的)。

2,你需要for 攻擊框 {for 挨打框 for 防禦框}進行遍歷,並且告訴下一環節,誰碰到了誰。

3,執行碰撞的邏輯,通常傷害、改變動作等都是在這裏執行的,這裏我不的不拐開說一句—— 在另外一個貼文裏,居然有人認為動作遊戲是可以在這一幀預判下一幀你會移動到那兒的,我就呵呵了(具有位移的技能是否應該支持被懸崖打斷? - 遊戲)最高贊的說的頭頭是道,還有這麽多外行點了贊,我就笑了,你在這個tick的第一個事件,要去判斷下一個Tick的第一個事件的情況,首先你就要演算出這個tick後面的2步,而言算出以後,你要回到第1步之前重新決策?這種邏輯思維怎麽做遊戲呢?

至於碰撞盒怎麽加,加在每一個角色->每一個動作->每一幀下面的,所以是海量的工作,比如KOF早期的10個隊伍(含boss),每隊3人就是30個角色,每個角色平均20個動作,每個動作平均10幀長度,你就要去做6000個單位的判定盒,而且每一個單位裏面都可能有攻擊、防禦、挨打3種,且每一種都可以超過1個,所以格鬥遊戲、動作遊戲,沒有積累是沒法做的。不建議新手去做。