用Unity实现游戏弹反效果
大渣好。
老賊的黑魂系列,想必大家都樂(tong)在其中。
?
那么要說到魂系列、乃至很多其他ACT要素濃郁的作品,最核心的機制之一,那就是彈反(視游戲不同叫法也不同,一閃、完美防御、彈開等等)。
實現了這個效果,(理論上)你也可以做一個類似的游戲出來(強調:只是理論上,只是理論上)。
?
今天我們就用簡單粗暴的方法來實現一個彈反。
先看效果圖。
?
圖中可知:
?
- 持續格擋,受擊時有晃動、硬直動作。
- 完美格擋成功時(會根據攻擊方向進行格擋),敵人攻擊會被彈開。
- 當敵人被彈開攻擊3次時,會進入后仰慢動作。
這次用的資源是在https://www.mixamo.com里免費下的Great Sword Pack和Pro Sword And Shield Pack,需要的可以在工程里邊拉或者自行下載。導入資源后,用Plane和Cube隨便搭建一個場地。
由于這是一個簡單版的彈反功能實現,因此我們只需要制作兩個功能殘缺的工具人:一個只會左砍右砍的雙刀火雞哥,一個只能跑和防反的大劍姐。
一、雙劍角色
1.功能及動畫狀態機
雙劍角色作為被彈反的工具人,免費包里沒有演出效果比較好的動畫,最終只好用同一個揮砍動畫(Slash)通過調節應用在三個狀態中(完美符合乞丐版氣息):左砍、右砍(鏡像)、被彈反(調節播放速度為負),自己有動畫的小伙伴請毫不猶豫地自行替換。
?
2.實現思路:
(1)在每個動畫快結束的時候執行動畫幀事件,隨機下一個Slash(揮刀)狀態,激活對應攻擊源,用于判定攻擊方向。
(2)Slash時用動畫幀事件激活武器上的觸發器。
(3)被彈反的時候,調節播放速度AnimaSpeed為負,使其回放。
(4)當被彈反3次時觸發BehitBack后仰動畫。
3.相關設置
(1)角色設置
以下添加的Collider都勾選IsTrigger。
①給角色添加CapsuleCollider,然后調節至跟角色差不多大小。
?
②添加RigidBody,并勾選IsKinematic。
③展開角色的骨骼,分別給雙劍所在節點加上BoxCollier組件,并且調節至跟劍差不多大小,設置Tag為”EWeapon”,用于格擋時碰撞檢測。
④在劍的節點下邊新建一個空的物體SwordOri并添加Collider組件,設置Tag”為EWeaponOri”,作為攻擊源用于給玩家判定攻擊方向。
?
(2)設置動畫
因為需要一個后仰的慢動作,把BehitBack動畫的Speed調為0.5。
?
4.部分功能實現
(1)激活武器的Collider
?
- 雙擊Animator窗口里的LSlash,展開Events,拖動動畫進度條。
- 在手剛揮到角色前方的位置,點擊Events下“+”,添加動畫幀事件(當動畫播放到這個位置時會執行對應名稱的方法),設置完成后Apply。
?
由于LSlash和RSlash使用的是同一個動畫,這里通過獲取當前動畫狀態的名字的方式來判斷應該激活哪邊的武器Collider,代碼(含注釋)如下:
?
同理,在砍動作結束時添加動畫幀事件關閉武器的Collider。
(2)被彈反
這次乞丐版的彈反實際上是Slash動畫的回放,所以只要播放速度為負即可,為了提升視覺效果,我們通過動畫曲線模擬先快后慢的彈開速度。
①設置動畫曲線
在腳本中聲明一個變量public AnimationCurve animaSpeed,保存后我們可以在Unity中找到這個變量,點擊右側圖框便能編輯曲線。
?
橫軸將作為時間,豎軸將作為播放速度(具體參數按自己喜好調節):
?
②根據動畫曲線調節播放速度
?
- 打開Animator窗口,添加float類型參數AnimaSpeed。
- 找到LSlash和RSlash兩個動畫狀態,分別勾選Speed下Multiplier的Parameter并選擇AnimSpeed,把動畫播放的速度與參數AnimaSpeed建立聯系。
- 通過AnimationCurve.Evaluate(float time)設置AnimaSpeed來調節播放速度。
?
代碼(含注釋)如下:
?
二、大劍角色
1.功能及動畫狀態機
大劍角色具有只有格擋(完美格擋、持續格擋、受擊)和移動功能。
?
2.實現思路:
(1)點擊右鍵,進入PerfectBlock狀態,根據敵人攻擊來方觸發對應的格擋動畫。
(2)當在PerfectBlock狀態下,手機游戲購買敵人的武器碰到格擋Collider時會被彈反。
(3)按住右鍵進入KeepBlocking狀態,持續防御。
(4)當在KeepBlocking狀態下,敵人的武器碰到格擋Collider時,玩家被擊晃動。
3.相關設置
(1)角色設置
以下添加的Collider都勾選IsTrigger。
①給角色添加Character Controller組件,用于實現移動。
②添加BoxCollider,調節大小與位置,使其位于角色前方,用于探測敵人和判定攻擊方向。
③展開角色骨骼,在武器節點下新建空的子物體BlockCollider并添加BoxCollider,用于格擋檢測,可以適量調大來增加格擋容錯率。
(2)動畫設置
當只有左方向的格擋動畫時,可以通過設置動畫狀態的Mirror(鏡像)屬性獲得右方向的格擋動畫。
拿PerfectBlock作為例子,在Animator添加一個Bool類型參數isRightB,在Inspector窗口如下圖設置:勾選Mirror右側Parameter,并選擇參數isRightB,表示當isRightB為true時播放鏡像。接下來只需在腳本中控制isRightB的切換就可以控制左右格擋。
?
剩下的KeepBlock、BlockImpact、BlockEnd狀態也這樣操作,就可以獲得一套右格擋動畫。
4.部分功能實現
Block
(1)角色上的代碼(含注釋)如下:
①敵人攻擊時,大劍角色前方的大Collider會檢測到敵人的SwordOri。
?
②敵人攻擊時會激活SwordOri,通過計算SwordOri與角色右方的夾角,決定格擋方向。
?
③激活blockCollider進行碰撞監測,并且根據攻擊來向播放相應的格擋動畫。
?
(2)BlockCollider上的代碼(含注釋)如下:
在BlockCollider上添加腳本,當碰到敵人的武器時,如果玩家是PerfectBlock狀態,使敵人變為BeBlock狀態,觸發彈反,否則玩家進入格擋受擊狀態(isBImpact)。
?
結語:實現簡單版彈反的主要功能基本都介紹完了,實質上是Collider與Animator的應用,有興趣的小伙伴可以下載工程看看設置參數或者其他小功能的實現,希望對大家有所啟發。
總結
以上是生活随笔為你收集整理的用Unity实现游戏弹反效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 街霸2的CPU是怎么对玩家作弊的?
- 下一篇: 游戏光线追踪往事:十年技术轮回