角色动作系统概述:战斗、3C相关
*關于戰斗反饋-這一點是關于給玩家的信息的,所有給玩家的信息絕對不能是單一的,例如被擊,被擊相關聯的信息我之前看過一篇文章他們做了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獵天使魔女。
當然這么分很不嚴謹,這是我的認知。
整體的導圖如下:
?
我在最后會把思維導圖的下載鏈接發出來,方便大家瀏覽.如果你對戰斗系統很熟悉,可以直接跳過文章直接看思維導圖會更方便和直觀.更多的描述用于新接觸戰斗的萌新方便上手。
我們分為幾個大類描述:
?
- 可配置性-可配置性決定了這東西做出來是否能用,如何配置一個怪物,配置一個角色,配置一個boss
- 動力學和動畫模塊分開-這樣處理能避免大部分的奇怪問題.并且在結構上更為方便維護
- 狀態管理-狀態管理對玩家的輸入如何處理,前搖中段后搖如何處理,這里我開始漏掉了,我朋友告訴我應該謝謝狀態管理,所以文章完成后扭頭來寫這個的時候其實我已經沒勁了,最后寫的實在是寫的很崩潰,因為內容太多,每個地方都要想半天當時怎么做的,什么思路,還要對照代碼,如果這里有不明確的地方希望有興趣的童靴給我留言,這里我補充一點,unity的狀態機不是很好用,如果有工程能力的同學,建議自己手動管理,僅僅用animation controller的混合樹就好了,我就是這么做的
- 動作的細節處理-這是一些經驗之談
- IK的簡單描述-其實IK的應用就那么幾個點,具體的功能點就自己摸索摸索吧
- 物理和動畫的互相作用-這里是進一步提升的方式,但是我并沒有做物理相關的東西
- 黑科技-如果你想把3C往更深了做這些方向可以考慮
可配置性1-角色模板
可配置性是一個框架是否可用的標準
所以我們放在第一個討論,這里關系到你的工程能力,一般第一次做重構個3-4次太正常了
所以大家放心大膽的開發,后面多重構就好了,不用考慮一次性開發一個完美的系統。
如何考慮可配置性呢?我們需要從業務出發,抽象出我們需要的類型:
?
- 角色-怪物和玩家都屬于角色的一種
- 角色需要動作-動作讓角色動起來,每個不同類型的角色可能需要不同的動畫,但是角色之間有沒有共性?
- 如何播放?事件和角色的關系,這里還要考慮AI,其他玩家操作輸入,網絡等
讓我們進一步抽象
有沒有可能有幾種角色,長相差距很大,但是動作是類似的?例如拿刀的骷髏兵和拿劍的人類士兵,同時需要攻擊動作,和idle,和走跑
可能骷髏兵的攻擊只有兩下,人類士兵會多一個跳劈
并且我們支持非空判斷,如果特殊攻擊時空,就無法觸發
那么從動作組上我們這樣分類這三個單位(骷髏兵-弓箭兵-人類士兵)
?
- 角色A-關聯動作(攻擊,idle-移動-特殊攻擊)
- 角色B-關聯動作(遠程攻擊,移動)
再此之外,還要考慮什么事件可以觸發,例如攻擊就是攻擊事件觸發
可能特殊攻擊需要一個扳機狀態+攻擊觸發,
那么基本上大思路就出來了,
我們需要一個模板A角色模板,支持配置模型動作組,以及一些參數
還有每個動作相關聯的事件,這樣的東西有較高的配置性.
我做了如下模板:
?
當然,你可以根據你的業務需求調整,
下面的bing action setting是用來綁定對應事件的
紅色的代表該bing action有問題
左邊是狀態,右邊是對應事件,none代表沒有狀態
?
這樣,我們的角色模板就創建好了
可配置性2-動畫組
然而關聯對應的動畫組,我們也需要考慮角色的動畫有那些類型
例如最簡單的idle-走-跑-攻擊-特殊攻擊這些動畫背后有關聯著那些內容呢?
idle-走-跑這三個被稱為locomotion是一個角色的基礎動作組
我這里采用的是一個動畫組支持多個locomotion,放置一個角色有多重基礎動作
例如一個角色有錘子,和舉起錘子兩個狀態,手機靚號買賣平臺舉起錘子的時候可以移動,那么locomotion里的移動動作必須全部換新的,并且這個角色還可以切換武器-太刀,那么所有的動畫片又被替換了
所以最后動畫組是這樣的:
上面是一個基礎的locomotion,下面是對應的其他locomotion
再往下是具體的動畫業務,這里最好的狀態是下面的動畫根據上面locomotion的切換也有一定的可編輯性,但是我當時并沒有做.
動畫片的意思是例如攻擊,[idle-走-跑],翻滾,這些動畫的類型如何處理
我們當然可以直接播放動畫片,但是一個動畫片包含了很多可能性,這些可能性我們應該做成可配置性的
locomotion的做法我采用了是否的選擇,例如考慮到巨型怪物可能只有走,
或者某些小型怪物只有跑,走和跑還有idle都是用于的可選項
locomotion動畫片的選項如下:
?
你可以考慮是否有疾跑,跑,和走
很關鍵一點在于生成locomotion以及對應的混合樹,我把最復雜的混合樹截圖出來,其他的大家自己研究吧,有問題可以留言。
這里的關鍵點在于走和跑的分離,這樣在左右橫移的時候不會出現這樣的狀態切換[左橫跑-左橫走-idle-右橫走-右橫跑],雙層混合樹的好處在于直接變成:[左橫跑-右橫跑]
?
當然,直接八向混合也可以,但是如果追求細節不要這么做.
?
最基礎形態就是全部取消,只有idle:
?
因為動畫狀態特別多,如下:
?
我在用一個典型的舉例,就不多講了
如果討論動畫組,不討論combo也太不厚道了
?
combo我大致是這么做的,可以支持多個動畫片,在播放時根據長度連續播放這樣就支持連擊了,而且可以選擇遮罩,例如只有上半身,只有下半身,每個動畫片綁定自己的前搖和后搖。
還有是否支持root motion等
再舉個例子就是被擊:
?
被擊可以選擇有效圖層和具體播放動畫片的朝向,這個根據你的業務具體安排。
其他例如loop動畫,普通animation,就是可以配置前搖后搖時間即可,loop要支持三個動畫的循環,在動畫播放結構中也需要支持。
動力學和動畫模塊分離
這里的核心思想是:
PlayController需要將輸入交給動力學組件,同時將動力學組件的內容,交給Animation組件。
需要根據真實移動速度來決定動畫狀態,而不是輸入向量,基于這個大的思想,可以保證一些奇怪的問題不要出現。
而動力學的核心在于處理特殊情況。
這里的類結構大概是這樣:
?
Kinematic大概有幾個大的業務要考慮清楚:
?
- 撞墻-撞墻的處理關鍵在于不要穿的太厲害,當動力學組件遇見墻體時候,Rootmotion依舊會執行,這時需要同步角色位置到當前動力學組件的位置,這個是基礎。
- 邊緣檢測-邊緣檢測在于下滑,一般人物會用一個膠囊體,這個膠囊體會卡在邊緣,這里要處理的平滑,下落既是下落,而不下落時人物要站扎實不要抖。
- 跳躍1-原地起跳-原地起跳最好用一個獨立動畫,問題的關鍵是當前跳的落點是高低不平還是平面,因為資源和時間的問題,我直接用跳躍處理的這里,當動畫播完還沒落地,我就認為地面是不平的直接過渡到跳躍循環。
- 跳躍2-沖刺起跳-當玩家加速跑時,這個起跳必須和普通跳躍不同,否則沒有那種速度感,同時向前躍起,這里最大的坑在于可能你剛起跳就撞到物體了,好一點的或者美式動作游戲會處理一下,給個撞擊動畫,但是有些游戲也不處理,尤其是日式游戲,硬播完對玩家來說并不是不可接受的事情,沖刺起跳后落地最好也接一個落地動畫,例如翻個跟頭,而撞墻就不適合播放,這里具體如何處理就要看GamePlay的愛了...
- 跳躍3-向前跳跌入懸崖或者落地-跳躍其實分為是哪個部分,起跳,loop,跳躍落地,落地又分為下落時間過長的大硬直和下落距離不大的小硬直。
- 爬梯子1-分為三個狀態,上梯子,下梯子,和爬,這里最好給一個固定動畫,由程序控制正播或者倒播,比較麻煩是對上點,并且要動力學組件配合,這里還有個做法就是用ik讓手和腳找梯子的掛點具體就看GP的愛吧...
- 爬梯子2-還有一個坑就是爬梯子的時候,被擊怎么處理,黑魂里是給人物一個抖動,死了就直接跌落。
- 爬峭壁-這算是比較惡心的一個點了,爬峭壁的核心在于配合IK以及關卡設計,以及龐大的動畫狀態,這個狀態屬于一個全新的locomotion,我當時只是試了一下掛在峭壁上,然后按跳躍就播放跳躍,然后扒到下一個掛點。
允許我偷個懶,多余的就不寫了,有問題請評論追加...
狀態管理
首先unity的animation controller提供的混合樹非常好,但是狀態卻又一些不疼不癢的bug,例如A狀態到B狀態的過程中,切換C狀態這時會出現閃一下切過去,上下半身的動作會又互相影響,修正起來既蛋疼,又麻煩,所以我干脆就自己管理狀態,讓unity直接執行就好了,手動管理狀態,把ac內部的混合樹當一個狀態調用。
而和狀態在一起的,還有一個關聯項目就是對輸入的處理。
輸入可能有三個來源
?
- 玩家手柄或者鍵盤
- AI行為樹
- 網絡
不管哪個來源,我們可以用同樣的抽象層讓輸入統一,
輸入分為幾個類型
?
- 普通事件-不要讓玩家的輸入直接操作動作,一定要做一個轉換,尤其是移動,移動的朝向交給動力學,動力學作用于動畫系統,而按鍵輸入一定要轉化為一個類似行為的抽象。
- 狀態轉換型輸入-某些按鍵實際上是一個狀態,例如,玩家按下收刀實際上角色要進入到一個收刀的狀態,此時攻擊鍵變成了一個特殊攻擊,相對應這個狀態下的輸入都出現了變化,所以一個行為應該是基于狀態的,關于這個狀態和事件的區別大致是這樣的:
?
- 輸入的時效-一般一個動作分為三個階段-前搖,執行中,后搖,你可以指定三個階段那個是有效輸入階段,例如我一般會屏蔽前搖的輸入,執行中是有效輸入階段,后搖就處理玩家輸入。
- 輸入指令的重排序-這里很重要的是當一個動作執行中,玩家的輸入要如何處理,后搖就開始執行之前輸入的動作進入預混合階段,而且后搖這個時間點我推薦對動作進行排序,例如當前是攻擊,那么要做一個輸入的優先級排序,優先級最高的可能是下一個攻擊,而翻滾之后優先級最高的可能是喝血,不要根據玩家的最后一次按鍵去執行,這里對感受的提升是巨大的。
動作的細節處理
攻擊和翻滾相關:
*攻擊,翻滾的前搖最好不要鎖方向,這樣玩家容易攻擊之后怪物因為移動躲開了,最好的量我感覺最好根據不同動作,每個單獨設置。
*攻擊-攻擊的核心在于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是育碧搞的一個動作匹配技術,基于目標的位置和方向速度通過算法從數據庫中取用匹配動畫,需要大量的動畫片支持,同時還要預判斷未來地形變化,總之很黑科技,沒有足夠的動畫資源基本沒辦法做,美式動作游戲或者冒險游戲里大量的使用該技術。
例如當一個角色的動畫是變速的時候,如何保持動作的受力感受同時又可以變速,例如某個技能可以根據玩家輸入加快速度,或者減慢速度,某些游戲會考慮嘗試多套動作,但是高級動作游戲例如鬼泣,貝姐,顯然不是這么做的,至少我感覺不是這么做也可能是我感覺錯了。
動作中斷后如何和下一個動作保持良好的銜接-好吧,講的直接點,我實在不知道鬼泣和獵天使魔女怎么那么靈活還那么流暢的,不管我怎么處理混合總感覺混合時間不夠,或者動作幅度特別大就變的很奇怪,這里我感覺暴力一點就是做大量的中間動作片加強過渡,不過只能是猜測了。
結語:
嗯能看到這里的都是真愛
希望有一天我也能開發出像黑魂,只狼這樣游戲設計和技術完美結合的游戲
而且有很多細節介于主題太大了,我也沒勁寫了
歡迎大家跟我討論
我有一個網盤,里面放著我做的一些東西
思維導圖我也放里面了.
總結
以上是生活随笔為你收集整理的角色动作系统概述:战斗、3C相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用unity制作简单的太空游戏(1):简
- 下一篇: Unity Gamma校正转为线性空间