@author : 黑袍小道
查看隨緣,轉載標黑袍。
(
分享原因:
1、都8102 世界體了,不是核心底層技術不用藏着(太多可購買可參考了那啥了),這種是游戲人都知道,而且都是基礎。總結而已罷了。
2、實例永遠只是實例,也只能只是。關鍵是反推到底層,和做法(這個才能產生變化,引擎和語言,可以做到NX,也可以做到SX 嘿嘿。
)
前言
在利用Unreal實現XXXX,其實實現方式和對應的設計(都有很多種,關鍵看緣分?開玩笑,這很多要看個人理解。在這部分只說原理和對應實現,盡量保證邏輯單一,可以配置,編輯器可以跳轉到其他部分后面會補上對應的編輯器制作。)
(這個差了一下同步)
(有代表性的拳皇,格斗是一種,什么DNF,鬼泣,獵天使,屬於一種,騎馬已砍殺是一種,黑魂、戰神這些又是一種。奇跡,還有俯視角的許多就有很多了。其實都存在不同和相同的方式,當然楊冰【獨立制作人】【但作為單獨程序的責任需要把邏輯划分清楚,保證擴展】的那個是最值得學習, https://blog.csdn.net/u012999985/article/details/71056425。)
正文:
(若關心元素實現,可以直接跳到實現部分)
額外說明
因為游戲關於這個,一來都是大佬意見和看法,小道只能總結和實現(游戲都沒玩過上百通關的,不敢發表看法)
獨立游戲開發界: <https://www.bilibili.com/video/av5199528/> ,結論:反饋。
元素
(查看作者知乎:Meta42 來自 <https://www.zhihu.com/question/20344728> )
我們只要把下面所有要素都處理好了,游戲的戰斗就有打擊感了么?此顏差矣。《孫子兵法》曾經曰過“備前則后寡,備后則前寡;備左則右寡,備右則左寡;無所不備,則無所不寡”,(扯淡的嘿嘿)
- 攻擊動作與受擊動作
- 特效
- 傷害數字
- 連擊與連擊計數
- 頓幀
- 慢動作(應該叫局部慢時間。可以到鐵拳,火影這些)
- 鏡頭震動
- 鏡頭模糊
- 視角切換
- 音效
(以下小道亂說)
關鍵是需要的重點,打擊感對於游戲,就像金錢對於生活,只是手段,而不是目的。
有滿屏傷害數字的(打打咚噠噠噠咚咚咚咚【爆】,嘿嘿)加上連擊,頓幀,切特殊鏡頭的【崩,火】
有一丟都沒數值的,用鏡頭收縮、特效、頓或延時幀來的(啪啪噗---(滿)---爆-頓-爆)【鬼,獵】
有物理動作,加上動作緩慢的和硬直切換的。(啪嗒-哦-啪啪啪,哈哈)【騎馬】
(關於網絡同步走的,其實也不能一概否,黑色沙漠,還有逆水寒(技術真的好,別罵小道)這些也有看到的)
綜上就出現:、天朝、歐美,日韓幾種方式,再加上理論和實踐,結果就是一句緣分。【意會意會】
實現元素前的說明
(原文: <http://gad.qq.com/article/detail/26109>,作者:波傑克Po,轉載自奶牛關游戲社區)
首先是基礎點(拋開這些東西后,打擊感就消失了):
操作的映射(准確性和符合預期性) |
(電腦里的人物是玩家的肢體延伸,玩家的操作要即時有效),就好像你開車,像左打了方向,車就即時的向左拐。方向打多少就拐多大的角度。准確和符合預期才能正常的操作。如果往左打了一點點,汽車直接原地轉了3圈,或者隨機拐一個角度,你就完全不可控了。 |
前搖動作 |
(攻擊蓄力),沒有這部分,動作會顯得軟綿無力。 |
攻擊動作命中目標 |
(無論是動作還是特效,都得讓玩家意識到打中了目標),沒有這部分會顯得不真實。 |
受擊動作表現 |
(只要受擊瞬間的動作合理,打擊感就能出來),沒有這部分同樣會顯得不真實。 |
攻擊受擊同步 |
(主要是命中點和受擊點的同步),沒有這部分會顯得不真實。 |
【以上4點如果沒做到,最大的影響是不真實,就像一個瘦弱的人輕輕的摸了一下汽車,汽車等了2秒后被擊飛了老遠的那種感覺。因此要實現打擊感的第一點,是要成功的騙過玩家的大腦,讓他感受到真實感。像一個魔術師一般,上面的四點是絕不能讓玩家看出破綻的。】
其次是進階點(加進來可以讓打擊感更好):
命中標識的明顯化 |
(受擊動作是一個基礎的命中標識,但識別度還不夠高。)因此還需要誇張的受擊特效、身體的反白效果、受擊的傷害數字的冒出效果、受擊后抖動的效果、被擊退、被擊飛、被擊倒。 |
環境效果 |
(強調一個攻擊力度的強弱,除了受擊方的表現,另外就是對周遭環境的影響),簡單有效的包含:震屏(震動頻率與動作匹配)、塵土特效(高速移動一定會帶來塵土飛揚的效果) |
擊殺表現 |
(殺死目標代表了玩家完成了某個戰斗事件,這時候應該給予玩家獎勵信息),因此怪物的死亡特效、死亡動作要表現的足夠華麗。一定要大,要有爆點。 |
攻擊特效 |
(理論上可有可無,但有可以放大效果的表現)可以運用空間扭曲、身體模糊等效果來提升特效的檔次。切忌不要喧賓奪主,主體是動作和受擊特效,攻擊特效一定要讓步。 |
音效 |
(實際音效的只能放大已有的打擊感,如果本身沒有打擊感,音效並無大作用)就算完全沒音效,依舊可以表現出良好的打擊感。特別注意的是,有的情況下一定要和動作切合,和武器材質貼合。 |
第三是高階點(真正動作游戲向的內容,頓幀、硬直、打斷、動作的多樣性、鏡頭、全屏動畫表現)
頓幀: |
攻擊方命中目標后,攻擊方動作、特效,受擊方動作、特效,短暫暫停的表現效果。真正動作向的游戲不可跳過的一部分。注意受擊方的頓幀表現並非必須的,而是因為頓幀時無法進行其它操作,因此受擊頓幀可以用來延長受擊硬直的時間。 |
硬直: |
分為攻擊硬直和受擊硬直。攻擊硬直里又分為前搖和后搖。硬直時間是指進入某一狀態后,玩家不可操作打斷的時間。(如一個攻擊動作共4秒,前搖2秒后搖2秒,命中是瞬間的事情。后搖1秒后允許移動OR技能打斷。這時候攻擊硬直時間為3秒,若玩家主動移動OR技能打斷,則時間短;若玩家不操作,任由技能表現放完,則需要4秒。) |
打斷: |
在目標攻擊前搖結束前,即傷害產生前攻擊目標,使目標進入受擊狀態。(同樣是上面的例子,假設A攻擊前搖2秒,B攻擊前搖1秒,B看到A施放攻擊,並按下技能攻擊B,這時候的時間若在1秒前,則B命中A,打斷成功,A進入受擊。若在1秒后,則A命中B,打斷失敗,B進入受擊。) |
動作多樣性。 |
這部分決定了戰斗的華麗性。單一的武器單一的攻擊方式,會讓戰斗變得單調。動作多樣性足夠多,就可以打出各種各樣的連招組合。(也是為什么格斗游戲單一鍵位對應單一動作,組合鍵位對應復雜動作,更多的組合鍵對應各種大招。如果每個按鍵對應一個大招就沒什么多樣性可言了。) |
鏡頭。 |
根據技能,主要是大招的施放節奏,鏡頭的轉化和縮放能更好的突顯出大招的威力。聚集能量的時候縮,施放傷害的時候放。(小道解釋這就是為啥,技能要有個技能Sys對吧) |
全屏動畫表現。 |
類似火影究極風暴。施放忍術大招的時候,會用一個全屏動畫來代替(動畫本身設計的決定了好壞)攻擊前搖的部分,動畫結束時播放命中目標的特效。想到與一個超級蓄力動作,蓄力那么久,威力必然大。 |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
不知理則久崩,我們不能一直都是對着源碼CC+CV,對着復制到用時時間翻倍或沒頭緒(這取舍,得心里明白)。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
實現:
(因為是篇是打擊,所以只說打擊相關。連招緩存,和連招的程序切換【其實就是個動態修改了Next索引罷了】等都不在這里說明)
基於Unreal,Unity,Cocos 【這里就Unreal,藍圖方便說明而已】【稍后找找之前的 給上來,完全個人不怕那啥,嘿嘿】
(原因:
第一步:
目的:要到數據
1、AnimationNotify(動畫通知):當動畫局部時間經過通知的時刻,或進入通知的時間區域時候觸發通知。
(通知邏輯,其實大部分是可以轉到C++,為何要轉,具體看優化部分說明)
(這里插入一點注意:如果進入通知時刻全局timescale=0或者動畫的timescale=0,然后再開啟,會如何?答案:會觸發兩次,為何?你懂的)
(關於通知的使用其實大可以發掘和擴展:但注意一點,邏輯耦合)
(這里有一個分享也可以看看:作者張瀚榮來自 <https://blog.csdn.net/OnafioO/article/details/78051971> ,當然是否盒子類碰撞檢測和射線看具體)
2、HitCheck(傷害區域判定):
這里解決傷害區域判定:
攻擊方:
2.1、利用掛在人物上的Box,加上通知區域(實現Transform相對數據變化)
2.2、碰撞發生時是攻擊方否為有效時間段:
(都只是標志緩存,可以放到角色上,也可以放到動畫藍圖上。但肯定有個統一的接口:因為實現會變化,和加入外部條件)
受擊方:
2.3、最基礎的做一個打開傷害,為何?(真實或者誇張下,傷害沒有瞬間多次,當然這里也可以不用通知直接處理。
上述最后,我們可以做到數據變化上,然后根據需要做外部接口(這樣還有機會繼續優化和擴展).懶,就直接訪問
第二步:
目的:得到數據,做對應的處理而已(這里可以做到對象上,也可以是對象的某一組件上
【分出到自定義的上做也可以,覺得放到自定義上,然后在組合的OB上,做個表對象映射是挺好的選擇。便於擴展和配置】
第三步:
就是元素的單個實現:
A |
攻擊受擊同步 |
這里就是檢測而已,取到對應點或者面。命中
B |
命中標識的明顯化 |
1、特效:在對應位置和面上播放
2、反白:人物Hit組件(自定義一個,或者就Role做),但注意下因為反白會多次,會消失,
所以最好單獨就是個效果Obj,這樣處理消失和效果時間疊加減少,和判斷其他都容易和清除,也不影響其他)。
大部分是人物Mesh,做動態材質屬性變化( createDynamicMateria,使用前判斷有無,沒有創建,有則修改)
進入(入和出成對)
恢復
3、計算需要的數據,力,類型等效果值
4、進入到傷害動畫
5、頓幀、硬值、打斷
做之前吧頓幀時間,硬直時間,打斷時間都計算好。根據配置做頓幀、硬值、打斷開關處理
頓幀:
(攻擊方命中目標后,攻擊方動作、特效,受擊方動作、特效,短暫暫停的表現效果)
硬直:
(硬直時間是指進入某一狀態后,玩家不可操作打斷的時間。)
力表現:(只是測試,就直接Tween. 若是開物理可以物理, (懶就TW和給力),最恰當得自己封裝一個Item模擬)
鏡頭:
UE有幾種做動畫的方式。
1、
CameraShake對象,其中包含了Anim:
1、用RotOscillation,LocOscillation,FOVscillation實現
2、用Anim實現
3、打開CameraShake,藍圖做
EventReceivePlayShake D Scale0 〈>EventReceiveStopShake D Immediately" v:shapes="圖片_x0020_20">
(以上都可轉C++,這里懶就表下)
全局時間和局部時間
以上為大體的使用實現,這里只是擊中后時刻做的實現。動畫多樣性,前后搖動作(后面補上挺雜的,得找找嘿嘿)
備注
CSDN:https://blog.csdn.net/u012999985/article/details/71056425
知乎: https://www.zhihu.com/question/20344728
GAD:http://gad.qq.com/article/detail/26109、 <https://blog.csdn.net/OnafioO/article/details/78051971>