角色動作系統概述:戰鬥、3C相關

遊資網發表於2019-06-13
*有一個很重要的點我忘記說了,就是遊戲策略-實際上在製作動作系統的時候要考慮相容各種策略,但是在調手感前,要先想清楚自己的戰鬥策略,所為戰鬥策略是指博弈方式,以及對玩家的操作進行約束,約束具體是指你需要的是一個黏糊糊的手感,還是一個乾淨利索的手感,而整個戰鬥博弈是什麼樣的,如何保持有效博弈的同時,讓玩家特別明確,例如剪刀石頭布的方式,或者是打地鼠?亦或者是節奏遊戲?或者搓招?

*關於戰鬥反饋-這一點是關於給玩家的資訊的,所有給玩家的資訊絕對不能是單一的,例如被擊,被擊相關聯的資訊我之前看過一篇文章他們做了11種不同的反饋方向,保證玩家至少能接收到3-4種,例如聲音,攻擊特效,手柄震動,螢幕效果,動作反饋,環境反饋等等,這種資訊量越多,玩家就越明確,這裡還涉及到上一條戰略策略,玩家遊戲失敗的原因歸錯到遊戲的可能性也會更低。

*關於業務感知能力-我想說其實大部分問題都是看做這個的game play有沒有業務感知能力,感知到一些細節還有問題,這一塊基本上靠策劃是不行的,策劃畢竟不能實現細節,而且很多時候還會提出錯誤的方向,這全靠gameplay去探索和補完,所以gameplay是一個極其吃經驗和愛的職位。如果你不是一個深愛你做的這個型別的game play僅靠工程能力和一個靠譜的策劃,這個手感和細節一定達不到頂級。

首先3C(camera,control,character)是一個巨大的話題。

我對戰鬥系統本身非常有愛。

但是架不住不賺錢啊,這年頭手遊當道,基本上僅僅是3C做的出色很難找到很好的工作。

運氣好的是在我們那個獨立遊戲專案結束後有一段時間,

而且加上我之前開發獨立遊戲很多時候被渲染相關的業務卡住,

於是就轉型做技術向的TA,houdini大地形生成這個方向,並且一邊學習圖形學,一邊學習美術資產相關的東西。

圖形學相關的東西也相當的迷人,我天生就喜歡複雜而且結構化的東西,感覺可以沉浸在圖形學裡好多年,如此說來人生也許一晃就過去了。

3C作為任何遊戲的基礎,為了以後還有機會做動作類的遊戲,也對之前經驗的總結。

我把所有的資訊整合在這篇文章裡,方便以後查閱,也分享給大家,希望得到更多的指點。

關於3C

關於3C我認為最重要的一件事是有愛

那麼根據重要程度排序是這樣的:

1.愛

2.細節

3.架構

愛決定了細節的數量和高度,細節決定了質量,架構決定你能不能開發一個能用的東西出來。

我想說其實大部分問題都是看你有沒有業務感知能力,感知到一些細節還有問題,這一塊基本上靠策劃是不靠譜的,策劃畢竟不能實現,所以gameplay是一個極其吃經驗和愛的職位.如果你不是一個深愛你做的這個型別的game play僅靠工程能力,這個手感一定達不到頂級。

並且,3C的camera是另外一個大坑,我用的Cinemachine,但是負責任的說,如果要追求好的3C相機必須自己做,但是control和character應該在一起做,我只做了後者也是對工程量的妥協,整個系統我從18年8月開始做,期間得到很多大佬的指點和幫助例如@我亂寫的還有號稱從不玩知乎的小白,最後做到11月底,後來轉向去研究渲染和houdini。

動作系統實際上就是一個ACT的核心,當然你拿他做RPG也沒問題

大致分為美式和日式,

日式更多的是走的打擊感,操作性。

美式走的一般是真實感,而真實感需要大量的資源和黑科技加成,例如motion matching,

所以我的整個基礎是基於日式的風格做的。

我認為整個日式動作遊戲的3C水平大致可以這麼劃分:塞爾達-黑魂-只狼-鬼泣or獵天使魔女。

當然這麼分很不嚴謹,這是我的認知。

整體的導圖如下:

v2-85373013d22a8a70d5a4fe51ac5a6591_r_副本.jpg


我在最後會把思維導圖的下載連結發出來,方便大家瀏覽.如果你對戰鬥系統很熟悉,可以直接跳過文章直接看思維導圖會更方便和直觀.更多的描述用於新接觸戰鬥的萌新方便上手。

我們分為幾個大類描述:

  • 可配置性-可配置性決定了這東西做出來是否能用,如何配置一個怪物,配置一個角色,配置一個boss
  • 動力學和動畫模組分開-這樣處理能避免大部分的奇怪問題.並且在結構上更為方便維護
  • 狀態管理-狀態管理對玩家的輸入如何處理,前搖中段後搖如何處理,這裡我開始漏掉了,我朋友告訴我應該謝謝狀態管理,所以文章完成後扭頭來寫這個的時候其實我已經沒勁了,最後寫的實在是寫的很崩潰,因為內容太多,每個地方都要想半天當時怎麼做的,什麼思路,還要對照程式碼,如果這裡有不明確的地方希望有興趣的童靴給我留言,這裡我補充一點,unity的狀態機不是很好用,如果有工程能力的同學,建議自己手動管理,僅僅用animation controller的混合樹就好了,我就是這麼做的
  • 動作的細節處理-這是一些經驗之談
  • IK的簡單描述-其實IK的應用就那麼幾個點,具體的功能點就自己摸索摸索吧
  • 物理和動畫的互相作用-這裡是進一步提升的方式,但是我並沒有做物理相關的東西
  • 黑科技-如果你想把3C往更深了做這些方向可以考慮


可配置性1-角色模板

可配置性是一個框架是否可用的標準

所以我們放在第一個討論,這裡關係到你的工程能力,一般第一次做重構個3-4次太正常了

所以大家放心大膽的開發,後面多重構就好了,不用考慮一次性開發一個完美的系統。

如何考慮可配置性呢?我們需要從業務出發,抽象出我們需要的型別:

  • 角色-怪物和玩家都屬於角色的一種
  • 角色需要動作-動作讓角色動起來,每個不同型別的角色可能需要不同的動畫,但是角色之間有沒有共性?
  • 如何播放?事件和角色的關係,這裡還要考慮AI,其他玩家操作輸入,網路等


讓我們進一步抽象

有沒有可能有幾種角色,長相差距很大,但是動作是類似的?例如拿刀的骷髏兵和拿劍的人類士兵,同時需要攻擊動作,和idle,和走跑

可能骷髏兵的攻擊只有兩下,人類士兵會多一個跳劈

並且我們支援非空判斷,如果特殊攻擊時空,就無法觸發

那麼從動作組上我們這樣分類這三個單位(骷髏兵-弓箭兵-人類士兵)

  • 角色A-關聯動作(攻擊,idle-移動-特殊攻擊)
  • 角色B-關聯動作(遠端攻擊,移動)


再此之外,還要考慮什麼事件可以觸發,例如攻擊就是攻擊事件觸發

可能特殊攻擊需要一個扳機狀態+攻擊觸發,

那麼基本上大思路就出來了,

我們需要一個模板A角色模板,支援配置模型動作組,以及一些引數

還有每個動作相關聯的事件,這樣的東西有較高的配置性.

我做了如下模板:

image003.jpg

當然,你可以根據你的業務需求調整,

下面的bing action setting是用來繫結對應事件的

紅色的代表該bing action有問題

左邊是狀態,右邊是對應事件,none代表沒有狀態

image004.jpg

這樣,我們的角色模板就建立好了

可配置性2-動畫組

然而關聯對應的動畫組,我們也需要考慮角色的動畫有那些型別

例如最簡單的idle-走-跑-攻擊-特殊攻擊這些動畫背後有關聯著那些內容呢?

idle-走-跑這三個被稱為locomotion是一個角色的基礎動作組

我這裡採用的是一個動畫組支援多個locomotion,放置一個角色有多重基礎動作

例如一個角色有錘子,和舉起錘子兩個狀態,舉起錘子的時候可以移動,那麼locomotion裡的移動動作必須全部換新的,並且這個角色還可以切換武器-太刀,那麼所有的動畫片又被替換了

所以最後動畫組是這樣的:

image005.jpg

上面是一個基礎的locomotion,下面是對應的其他locomotion

再往下是具體的動畫業務,這裡最好的狀態是下面的動畫根據上面locomotion的切換也有一定的可編輯性,但是我當時並沒有做.

動畫片的意思是例如攻擊,[idle-走-跑],翻滾,這些動畫的型別如何處理

我們當然可以直接播放動畫片,但是一個動畫片包含了很多可能性,這些可能性我們應該做成可配置性的

locomotion的做法我採用了是否的選擇,例如考慮到巨型怪物可能只有走,

或者某些小型怪物只有跑,走和跑還有idle都是用於的可選項

locomotion動畫片的選項如下:

image006.jpg

你可以考慮是否有疾跑,跑,和走

很關鍵一點在於生成locomotion以及對應的混合樹,我把最複雜的混合樹截圖出來,其他的大家自己研究吧,有問題可以留言。

這裡的關鍵點在於走和跑的分離,這樣在左右橫移的時候不會出現這樣的狀態切換[左橫跑-左橫走-idle-右橫走-右橫跑],雙層混合樹的好處在於直接變成:[左橫跑-右橫跑]

image008.jpg

當然,直接八向混合也可以,但是如果追求細節不要這麼做.

image010.jpg

最基礎形態就是全部取消,只有idle:

image011.jpg

因為動畫狀態特別多,如下:

  1. public enum AnimationType
  2. {
  3.     None, //基礎狀態
  4.     Locomotion, //基礎運動狀態
  5.     Animation, //普通動畫
  6.     Combo,     // 攻擊,連擊
  7.     MaskAnimation, // 遮罩動畫
  8.     LoopAnimation, //迴圈動畫
  9.     BeAttackedSimple, //單向簡單被擊
  10.     BeAttackedFourDir,//4向被擊
  11.     BeAttackedFourDirTwoAnim // 4向被擊, 每個方向又支援兩個不同被擊(伴隨攻擊方向切換)
  12. }
複製程式碼

我在用一個典型的舉例,就不多講了

如果討論動畫組,不討論combo也太不厚道了

image012.jpg

combo我大致是這麼做的,可以支援多個動畫片,在播放時根據長度連續播放這樣就支援連擊了,而且可以選擇遮罩,例如只有上半身,只有下半身,每個動畫片繫結自己的前搖和後搖。

還有是否支援root motion等

再舉個例子就是被擊:

image013.jpg

被擊可以選擇有效圖層和具體播放動畫片的朝向,這個根據你的業務具體安排。

其他例如loop動畫,普通animation,就是可以配置前搖後搖時間即可,loop要支援三個動畫的迴圈,在動畫播放結構中也需要支援。

動力學和動畫模組分離

這裡的核心思想是:

PlayController需要將輸入交給動力學元件,同時將動力學元件的內容,交給Animation元件。

需要根據真實移動速度來決定動畫狀態,而不是輸入向量,基於這個大的思想,可以保證一些奇怪的問題不要出現。

而動力學的核心在於處理特殊情況。

這裡的類結構大概是這樣:

image015.jpg

Kinematic大概有幾個大的業務要考慮清楚:

  • 撞牆-撞牆的處理關鍵在於不要穿的太厲害,當動力學元件遇見牆體時候,Rootmotion依舊會執行,這時需要同步角色位置到當前動力學元件的位置,這個是基礎。
  • 邊緣檢測-邊緣檢測在於下滑,一般人物會用一個膠囊體,這個膠囊體會卡在邊緣,這裡要處理的平滑,下落既是下落,而不下落時人物要站紮實不要抖。
  • 跳躍1-原地起跳-原地起跳最好用一個獨立動畫,問題的關鍵是當前跳的落點是高低不平還是平面,因為資源和時間的問題,我直接用跳躍處理的這裡,當動畫播完還沒落地,我就認為地面是不平的直接過渡到跳躍迴圈。
  • 跳躍2-衝刺起跳-當玩家加速跑時,這個起跳必須和普通跳躍不同,否則沒有那種速度感,同時向前躍起,這裡最大的坑在於可能你剛起跳就撞到物體了,好一點的或者美式動作遊戲會處理一下,給個撞擊動畫,但是有些遊戲也不處理,尤其是日式遊戲,硬播完對玩家來說並不是不可接受的事情,衝刺起跳後落地最好也接一個落地動畫,例如翻個跟頭,而撞牆就不適合播放,這裡具體如何處理就要看GamePlay的愛了...
  • 跳躍3-向前跳跌入懸崖或者落地-跳躍其實分為是哪個部分,起跳,loop,跳躍落地,落地又分為下落時間過長的大硬直和下落距離不大的小硬直。
  • 爬梯子1-分為三個狀態,上梯子,下梯子,和爬,這裡最好給一個固定動畫,由程式控制正播或者倒播,比較麻煩是對上點,並且要動力學元件配合,這裡還有個做法就是用ik讓手和腳找梯子的掛點具體就看GP的愛吧...
  • 爬梯子2-還有一個坑就是爬梯子的時候,被擊怎麼處理,黑魂裡是給人物一個抖動,死了就直接跌落。
  • 爬峭壁-這算是比較噁心的一個點了,爬峭壁的核心在於配合IK以及關卡設計,以及龐大的動畫狀態,這個狀態屬於一個全新的locomotion,我當時只是試了一下掛在峭壁上,然後按跳躍就播放跳躍,然後扒到下一個掛點。


允許我偷個懶,多餘的就不寫了,有問題請評論追加...

狀態管理

首先unity的animation controller提供的混合樹非常好,但是狀態卻又一些不疼不癢的bug,例如A狀態到B狀態的過程中,切換C狀態這時會出現閃一下切過去,上下半身的動作會又互相影響,修正起來既蛋疼,又麻煩,所以我乾脆就自己管理狀態,讓unity直接執行就好了,手動管理狀態,把ac內部的混合樹當一個狀態呼叫。

而和狀態在一起的,還有一個關聯專案就是對輸入的處理。

輸入可能有三個來源

  • 玩家手柄或者鍵盤
  • AI行為樹
  • 網路


不管哪個來源,我們可以用同樣的抽象層讓輸入統一,

輸入分為幾個型別

  • 普通事件-不要讓玩家的輸入直接操作動作,一定要做一個轉換,尤其是移動,移動的朝向交給動力學,動力學作用於動畫系統,而按鍵輸入一定要轉化為一個類似行為的抽象。
  • 狀態轉換型輸入-某些按鍵實際上是一個狀態,例如,玩家按下收刀實際上角色要進入到一個收刀的狀態,此時攻擊鍵變成了一個特殊攻擊,相對應這個狀態下的輸入都出現了變化,所以一個行為應該是基於狀態的,關於這個狀態和事件的區別大致是這樣的:


image016.jpg
這個狀態手柄上一般會用扳機鍵

  • 輸入的時效-一般一個動作分為三個階段-前搖,執行中,後搖,你可以指定三個階段那個是有效輸入階段,例如我一般會遮蔽前搖的輸入,執行中是有效輸入階段,後搖就處理玩家輸入。
  • 輸入指令的重排序-這裡很重要的是當一個動作執行中,玩家的輸入要如何處理,後搖就開始執行之前輸入的動作進入預混合階段,而且後搖這個時間點我推薦對動作進行排序,例如當前是攻擊,那麼要做一個輸入的優先順序排序,優先順序最高的可能是下一個攻擊,而翻滾之後優先順序最高的可能是喝血,不要根據玩家的最後一次按鍵去執行,這裡對感受的提升是巨大的。


動作的細節處理

攻擊和翻滾相關:

*攻擊,翻滾的前搖最好不要鎖方向,這樣玩家容易攻擊之後怪物因為移動躲開了,最好的量我感覺最好根據不同動作,每個單獨設定。

*攻擊-攻擊的核心在於Root Motion,但是細節又有好多講究,例如如何定幀,是真的停頓還是減速,攻擊的碰撞又有幾種方式,有直接繫結碰撞盒的,有攻擊最後一個傷害幀算扇形面積的,攻擊中還可能有被擊,被擊怎麼處理。

*攻擊還有一個特性就是3D場景下的攻擊,容易讓玩家產生錯誤空間感受,所以要增強玩家在3D場景下的攻擊範圍,或者敵人傷害的觸發範圍,這個要結合是否有PVP單獨調整。

*翻滾翻滾我因為動作資源的限制用一個翻滾,然後角色轉向的方式處理,其實最好的方式應該是8個方向分別用獨立的動作,翻滾很重要一點是啟動的時候,需要給一個旋轉的時間,也就是前搖不要鎖方向這一點是通用的。

locomotion相關:

*locomotion其實決定了一個手感的基礎,大部分的動作都是由locomotion過渡的,這裡雙層混合樹是指第一個混合樹用來做當前速度,朝向的判斷,第二層有三個對應的混合樹。

idle,當沒有速度的時候,就預設idle

走,當速度不夠跑的時候,就預設用走

跑,速度夠的時候就切換到跑,之所以要把跑單獨出來,是因為有一個特殊情況,就是玩家在向左平移時,突然向右,有一個瞬間會速度到0,例如從左到右速度會這樣變化:[1,0,-1],此時如果走和跑用一個混合樹,動作會過渡到走,然後過渡到跑,這裡會有一個微小的卡頓,很不舒服。

直接根據速度和方向切換到走跑,這樣在一個平移中,例如向左橫移,突然向右,會有一個微小的過渡卡頓,跑-走-跑,而實際上這是不符合人的移動習慣的,但是在一個情況下例如怪物沒有走路的動畫只有idle和跑,或者沒有跑步,只有idle和走,那麼可以用單層混合樹搞定全部

特殊動作處理:

在某個武器的狀態中,要支援一個或者多個特殊狀態,例如太刀的收刀,大錘子的蓄力,有些特殊動作會禁止移動,有些特殊動作釋放中可以移動,那這裡我感覺最好是切換locomotion。

切換武器實際上相對應的很多動畫都要切換,我這裡用的是直接切換全套動畫組來處理,例如雙刀切換到單手中劍,這連idle都切換了。

被擊

被擊實際上是打擊感的核心,一個動作的受力做的極其好,但是沒有攻擊物體時,你是感受不到力量的,但是一個動作做的一般,但是被擊做的非常到位,此時你可以感受到攻擊後的力量,這個力量感就是被擊表現,被擊的核心有幾塊:停頓配合,擊退距離和攻擊移動距離要配合,連續攻擊後擊飛,,音效,特效等等。

被擊方式1:攻擊原地不動,被擊者微小後退,幾下後擊飛或者退出攻擊距離(塞爾達),這是一種對怪物的保護,連擊幾下後怪物就被擊飛

被擊方式2:攻擊者前移,被擊者後退(黑魂)

被擊方式3 4向被擊-四向被擊對被擊的體驗提示是很大的,而且被擊本身最好支援Rootmotion,攻擊物件被擊後後退對被擊物件也是一種保護,拉開與攻擊者的距離,還要配合擊倒,並且可以支援4向-同時支援每個方向根據攻擊角度不同採用2種不同被擊。

擊倒-這其實是一個保護性動作,擊倒后角色不可以被二次攻擊,當然也有可以被攻擊的鬼泣裡的就有這裡就看具體策略了。

硬直中的被擊處理

硬直被打斷-直接轉入被擊,這裡的處理沒有特別好的辦法,被擊的關鍵在於快速反饋,直接決定手感是否刀刀入肉,所以如果連續被攻擊,就會出現抖動,如果例如被4個人前後間隔不到一秒攻擊4下,這裡可能要特殊處理是否要從第一個被擊直接過渡到第四個中間2個幹掉一個甚至直接幹掉2個。

硬直沒有被打斷-硬直動畫例如蓄力攻擊中被攻擊有可能不會破壞硬直效果,那此時最好混合一部分被擊,讓人物有一定抖動,否則也會很假。

處決

處決的核心在於把兩個角色的相對位置弄的差不多,比較糙你就直接滑過去,然後兩個動畫的同步播放,例如黑魂的背刺,你到達指定位置可以觸發了,我們們就直接滑動調整位置,一般處決玩家就無敵了,只狼也是這麼做的。

另外一種就是類似QTE的,這一種又分好幾種,例如莎木的就比較弱雞,但是戰神的就比較猛,這個我沒做過。

Gameplay到過場動畫的無縫銜接

攝像機平滑過渡的切換和角色動作的切換,這個沒做過,難點在於攝像機和角色如何抵達預定位置,中間還是平滑的,看看戰神...即便不做成戰神那樣,這個細節量也很大。


關於IK

我是用的final IK解決我的ik問題,所以這裡我不展開講了,主要處理這幾個問題:

  • 樓梯上腳懸空的處理
  • 開門是用ik還是固定動畫
  • 拿桌上,抽屜內物體
  • 死亡後的紙娃娃效果
  • 頭部朝向鎖定目標或者場景內重要物品


物理和動畫的相互作用

物理這裡完全沒做過,不過聽某些大佬講,這裡處理好可以增加真實感,例如攻擊的時候被擊,被擊沒有打斷攻擊狀態可以加一個10-30%的物理狀態的抖動到攻擊身上。

例如你被前面的敵人攻擊然後背後也有人攻擊你,此時如果不處理就是抖動到背後的被擊了,因為被擊必須快速切換,響應慢了就假了,被擊直接影響手感,聽某些大佬說可以考慮混一點物理,這樣抖動的效果會更好,但是我並沒有試過。

這些黑科技

motion matching是育碧搞的一個動作匹配技術,基於目標的位置和方向速度通過演算法從資料庫中取用匹配動畫,需要大量的動畫片支援,同時還要預判斷未來地形變化,總之很黑科技,沒有足夠的動畫資源基本沒辦法做,美式動作遊戲或者冒險遊戲裡大量的使用該技術。

例如當一個角色的動畫是變速的時候,如何保持動作的受力感受同時又可以變速,例如某個技能可以根據玩家輸入加快速度,或者減慢速度,某些遊戲會考慮嘗試多套動作,但是高階動作遊戲例如鬼泣,貝姐,顯然不是這麼做的,至少我感覺不是這麼做也可能是我感覺錯了。

動作中斷後如何和下一個動作保持良好的銜接-好吧,講的直接點,我實在不知道鬼泣和獵天使魔女怎麼那麼靈活還那麼流暢的,不管我怎麼處理混合總感覺混合時間不夠,或者動作幅度特別大就變的很奇怪,這裡我感覺暴力一點就是做大量的中間動作片加強過渡,不過只能是猜測了。

結語:

嗯能看到這裡的都是真愛

希望有一天我也能開發出像黑魂,只狼這樣遊戲設計和技術完美結合的遊戲

而且有很多細節介於主題太大了,我也沒勁寫了

歡迎大家跟我討論

我有一個網盤,裡面放著我做的一些東西

思維導圖我也放裡面了.

也歡迎下載

連結:https://pan.baidu.com/s/1lLxvffJuN7NEds4mbNYPLg

提取碼:9vb1

作者:lingzerg
專欄地址:https://zhuanlan.zhihu.com/p/67143501

相關文章