轉自:http://www.gamelook.com.cn/2015/06/218267
GameLook報道/ 6月5日,2015年第三期GameLook開放日‧虛幻引擎專場活動在上海正式舉行,此次活動由Epic Games與GameLook聯合主辦。
動作游戲憑借爽快的打擊感和強烈的操作感一直受到玩家的喜愛,但一些高品質的3D動作游戲設計其實頗有難度,國內市場上常見的大多是橫版2D游戲。本次活動上,Megafun的創始人張瀚榮來分享了利用UE4引擎制作3D橫版動作游戲的心得。
張瀚榮從策划的角度分析動作游戲的制作流程,“先制作2D草圖,通過這些草圖檢驗動作的合理性,然后轉化為3D模型,最后把這些動作變成招式。”隨后張瀚榮着重介紹了UE4中通知系統的強大功能,“游戲中輸入的判定、聲音、音效、特效、傷害、傳遞給敵人的狀態、取消機制、攝像機的抖動、定幀等所有事情都可以通過通知來完成”。
“傷害區域判定是難點”張瀚榮介紹了傷害判定設計的方法,“通過在人物身前編輯各式碰撞盒子,並通過Notify state控制這些盒子的開關以及變換”此外張瀚榮還分享了動作游戲中緩沖和取消機制的設計,“一個是簡單的連招Combos,第二個是角色的特定能力包括角色的跳,還有剛才看到繩子的勾爪,把自己可以勾回去的那種,還有還有一些技能,然后設計這三者的總體邏輯”。
演講最后Megafun的程序員具體演示了Notify state的使用方法並介紹了其優點,包括保證兩個函數成對,方便設計者進行管理。
以下是演講實錄:
張瀚榮:大家好!我們公司正在使用虛幻4引擎在做一款3D的橫版動作類游戲,目前代號“TTW計划”,團隊在深圳。目前計划的平台只有PC和主機兩個,手游並沒有考慮太多。然后也計划在7月底China Joy發布一款試玩版。
首先看一段視頻,因為我們的游戲太大了,有二十多個G,所以視頻也是我花了一個通宵時間剪輯的,還有不少Bug的時候,比較粗糙,大家可以關注我們下一個月的版本。
先制作2D草圖、再轉化為3D模型
這次分享主要是我們如何使用虛幻4引擎來做一個動作類的游戲。經典的動作游戲有很多,比如說戰神系列,鬼泣系列,還有國產的雨血等,都是在動作打擊感上做得比較好的游戲。但很多人在做動作游戲的時候都會覺得它特別難做,摸不着它的門道。
動作游戲以我一個做策划的角度來講主要分為三個方面:視覺、聽覺、觸覺,觸覺就是連擊操作的手感。我們的工作流程是這樣的,首先制作2D的動作草圖,通過這些草圖的設計就可以看出動作合理還是不合理。然后根據這些草圖在UE4里面做成3D模型的動作,並通過UE4中自帶的Cascade這樣一個工具來做特效。最后把這些動作變成一個招式,會在Montage中配置事件,這部分的事件非常多,非常煩瑣,並在Animation Sequence中配置特效與音效。
這是一個簡單的制作流程圖,就是把工作任務拆分到不同的人員身上,而這一切的主題就是 “通知”。無論是Montage還是Animation Sequence中都會用到UE4里面獨特的設定,叫Notifies,在下面這個位置。
功能強大的“通知”系統 控制連招判定 插入招式特效
通知是干什么用?通知是動畫在特定的位置、特定的區域來做特定的事情。特定的事情包括哪些呢?包括輸入的判定,聲音、音效、特效、傷害、傳遞給敵人的狀態、取消機制、攝像機的抖動、定幀等所有事情都可以通過通知來完成。
手感的來源其實第一個就是連招輸入的判定,當你一招打出去要連下一招的時候,判定的時間是否合理的。對於手殘黨,像我這種來講,我就會要求一個比較長的一個判定時間。但是對於高手來說,它可能更希望硬核一點。
緩沖我們的手感分為兩個通知,包括一些即時響應和緩沖機制。緩沖機制是指獲取玩家輸入后,等待動畫播放到某一幀后才跳轉到下一段連招。即時響應就是獲取玩家輸入后,馬上跳轉到下一段連招。
那么我們在里面在里面我們是如何配置的呢?可以看到下面這個叫Attack Anim Notify State是我們制作的緩沖機制的判定,然后下面Stop Delay Notify代表不接受按鍵輸入。也就是說在這一長度幀數里面,動作是允許跳轉到下一個招式,但是最早的兩幀內已經開始接收判定輸入了。
特效很簡單,就是在特定的某一幀做動作的特效,包括一些揮刀的音效。聲音格式是WAV(16bit)的。
傷害區域判定是難點 編輯各式碰撞盒子
還有一個比較重要的是傷害區域的判定,這是動作游戲里面最難也是最核心的。這張圖是引用《街霸4》里面框的藝術截圖,他們分好多種的框。而我們實際需要的游戲框並沒有這么復雜。
我們只需要在特定幀段判定攻擊,過了這個幀段就不判定攻擊了。通過自動調節判定框大小,調節判定框數量,來輸出攻擊所傳遞給每個受擊者的狀態。比如說這招打出去是需要傳遞它是浮空的狀態,擊倒的狀態還是普通僵直的狀態。
這是之前做的Slnow的配制表,我們通過Slnow的配制表來配置這一系列傷害框里面的一些信息,這個Startswing就是傷害的通知。然后在UE4的編輯器調節這些碰撞盒子的屬性,所做盒子的位置,就是人物身前的位置。
我們也可以用通知系統去實現給角色自身添加一系列的狀況,比如說在特定的某一幀給角色增加一個霸體狀態,也可以無視一切碰撞檢測,相當於無敵,蓄力、飛行、延遲出招等一些狀態都可以通過通知實現。我們這里Charge,就是一個蓄力的通知,表示人物在蓄力需要重復播的一段動畫。
緩沖和取消的機制的設定
動作游戲中也有緩沖和取消機制。緩沖是指這一招是否可以取消?相信大家玩過DNF它有一個后跳是強制取消所有招式和狀態的,就是動作游戲的招式,你一招是否能取消?是馬上取消還是要等到這一招出完又沒有收招可以被取消,還是你的招式被特定類型的招式取消呢?這一系列設定非常核心非常細,但是都可以通過通知完成。
我們游戲中招式分三種,一個是簡單的連招Combos,第二個是角色的特定能力包括角色的跳,還有剛才看到繩子的勾爪,把自己可以勾回去的那種,還有還有一些技能。總體邏輯是連招自身不能被打斷,但是技能可以打斷你的連招,能力也可以打斷連招,技能是不能被任何東西打斷,能力是可以無視幀數,在出招沒開始的時候就打斷當前的招式。
我們這里有一個Skilljumping notify,就是技能的取消機制,連招的取消機制剛才也說過,在這兩個區域之內是可以取消的。
剛才我講的通知是出於策划的角度怎樣配置這一系列的事件,接下來程序員會講通知里面怎樣運作的。
Begin,End,Tick和GetNotifyName四種方法重寫Notify state
Megafun程序員:大家好!我來跟大家講一下如何編寫通知的邏輯。在UE4,特別是做動作游戲的時候,角色揮一刀過去,在特定的某一幀需要執行一系列的操作,而這一系列的操作會有很多的功能。我們現在通過一個實例來分析一下,我們怎樣去編寫。
比如說一刀揮到這邊來,此時傷害的碰撞格應該是進行開啟,而在開啟的過程中比方說他打到那邊去,就需要關閉盒子。我們通過一個Notify state,來控制碰撞盒的開啟、關閉以及變換。
具體操作很簡單就是點擊Open Full Blueprint Editor,打開NotifyState編輯界面。它有4個方法可以被重寫,分別是Begin,End,Tick和GetNotifyName。在Begin的時候,就說明我接受到這個事件,所產生的事件的。End也是同理。Tick則是Begin和End之間Tick的事件,它有一個參數Deltatime。那Getnotifynoame就是我想看一下現在哪個Notify在起作用,但是我們一般不會用。
詳細邏輯是在Begin的時候,在人物身上掛很多的碰撞盒,Begin時將盒子開啟。在Tick,我們有一條Curve曲線,根據傳入的曲線有一些變化值來調整碰撞盒的狀態,可能是位置、大小也有可能旋轉。在End的時候找到碰撞盒,然后將它關閉就可以了。其實代碼比較麻煩,但是實際上偽代碼就這么一點點,非常簡單的一個信息。
配置是這樣的,有一個Begin,中間就會產生Tick事件,然后我們會用一個用於編寫動作游戲中碰撞盒的開啟和關閉的邏輯。我們看到這里有三張圖,這里一個測試盒來進行這樣的演示,可以看到這是在第一幀,發現第一幀非常小,然后到那邊是一個Tick,然后逐漸變大,這是我們當時實現的碰撞盒,這就是碰撞盒所對應的一個物體。
Notify state的好處:保證成對,方便管理
為什么我們用Notifystate,而不是用兩個Notify+Player的Tick函數?首先是說我們有Begin,我們就要有End,叫成對調用。不可能一刀砍下去,這個盒子開了,或者在這個期間我被怪打了,我要沒有調用到這個End的這個盒子就會一直開着,那樣就出事了。
所以我們需要保持它是成對調用。在Notifystate,通過動畫打斷的一個事件,保證它調用Notifystate的End的函數,可以保證與Begin的成對調用。此外就是Begin、End、Tick他們三個是在同一個BP里面方便我們進行管理。所以建議使用Notifystate實現在動作游戲中玩家碰撞盒的開啟、關閉。
我你們采用的是基於碰撞盒的武器攻擊點,其實我也研究過,但是我想過另外一種方案,基於線性射線檢測的方案。例如手里的任何一把長柄武器,我在武器上定兩個點,每一幀進行檢測,一旦產生碰撞就認為攻擊成功。
張瀚榮:之前有考慮過通過一些,比如說直接在武器上綁定一個盒子,或者是通過一個特殊的方法去做一些檢測,但是考慮到因為我們的動作非常快,每一次出招時間非常短。在這個過程中如果在武器上掛一個盒子會非常短,可能只有一幀,但是我希望我們的打擊幀數在3幀以上的判定。
另外一點是我們的特效會做得比它的招式動作本身要誇張。比如說我一個角色實際上沒有位移,剛才視頻里面有一個鏡頭,就是向前這么大的圓弧的時候,沒有任何角色位移,角色還是在原地,但是一瞬間就回來了。這種情況下只能通過在人物前方擺放盒子來實現。