[UE4] 使用GameplayAbilitySystem製作Combo
本文從範例專案開始,使用UE4內建的GAS(Gameplay Ability System) plugin製作動作遊戲常見的Combo,UE使用的是4.26版。只有最一開始的準備會用到一些C++,後面實作都是用藍圖完成。
本文以快速達成目的為目標,因此不會講太多關於GAS的細節,若想要詳細研究的可以參照官方文件或是非官方文件。另外也推薦yekdniw前輩寫的文章。
所謂的Combo其實可以做到很複雜,不過本文專注在如何將三個攻擊動畫串成一份基本的普通攻擊Combo,內容包含提前輸入以及動畫接續的調整,內文會詳細說明。
前置準備:專案設定
為了可以使用GAS,需要先做一些專案的設定。以下從範例專案開始說明。
首先使用Third person範例開啟新專案後(MyGASCombo), 啟用Gameplay Abilities Plugin。
進入Plugin管理畫面,啟動後隨著指示重開編輯器。
C++專案設定(MyGASCombo.Build.cs)也記得新增GameplayAbilities和GameplayTags兩項。
接著追加AbilitySystemComponent相關的功能到角色上。為了要在BP側能夠完成接下來的製作,這邊要做些準備工作。以下三點要在C++側先行準備:
1.新增AbilitySystemComponent。角色GAS的處理都透過這操作。
2.新增管理角色擁有技能的列表,並賦予角色能力。
3.新增Tag和移除Tag的功能,用於管理Combo接續。
AMyGasComboCharacter.h
AMyGasComboCharacter.cpp
修改後確認正常編譯結束後啟動專案,從角色BP確認AbilitySystem有正常追加。
到此,角色已經可以執行GAS,事前準備到此結束。接下來的製作用BP即可完成。
匯入攻擊動畫
這次打算製作左刺拳->右鉤拳->迴旋踢的三連Combo,首先分別匯入需要的動畫之後,各自製作成Montage。
為了讓Montage能夠播放,修改角色的AnimGraph加入DefaultSlot如下圖。
如此Default的Slot的Montage就準備完成可以播放了。
先在腳色上做個簡單的測試看是否Montage能正常播放。
按下Z後動畫正常撥放了。接著我們可以正式進入製作Combo的步驟。
製作第一段Combo
新增一個GameplayAbility名為GA_Combo1
接著在Class defaults中的Tags作以下設定。
這次會用到的是Ability Tags、Activation Owned Tags、以及Activation Blocked Tags。以下就這次用到的Tag作說明。
Ability Tag:此Ability的識別名稱。觸發能力時使用。
ActivationOwnerTags:當此
Ability 執行中時給予擁有者此Tag。用於識別Combo執行狀況。
ActivationBlockedTags:當擁有者擁有該Tag時無法執行。用於防止重複觸發Combo,連打也只會執行一次。
在角色BP新增案件觸發TryActivateAbilitiesbyTag來使用Ability。
在使用之前,不要忘了先讓角色學習該Ability,在我們之前在C++新增的Startup Abilities加入GA_Combo1。
進入遊戲按下Z,如果能夠出拳表示成功了。我們發出了第一個Combo!
雖然看起來跟剛剛播放動畫時一模一樣,不過因為這次是透過GAS播放,我們可以開始管理各種行為了。目前可以注意到的的差別就是,之前連打Z時會一直重複播放攻擊動畫,然而現在我們有前面的Tag管理,不管按幾次都只會觸發一次。
加入第二段Combo
在這邊我們希望製作的Combo流程大概規劃如下圖:
最常見的Combo設計中,玩家是可以做出所謂先行輸入的動作。意思就是在指定的時間內輸入攻擊後根據輸入的時間,會立刻,或是在特定時間點時做出下一段攻擊。以左刺拳接續到右鉤拳的過程為例,如圖,若在[可輸入範圍]期間按下攻擊鍵,則會在[可進行下段攻擊]期間開始進行下一段攻擊。
要達成這個目的,我們必須使用GameplayTag控制Combo狀態,以及配合AnimationNotify來做調整。以下為詳細步驟。
這邊我們使用MontageAnimationWindow這個AnimationNotify。這可以在GameplayAbility中接受到通知並且做出相應的動作。在左刺拳的Montage中追加並且在NotifyName設定以下標籤。
ComboInput:代表上圖的[可輸入範圍]
ComboBranch:代表示意圖的[可進行下段攻擊]
這邊大概調整在拳打出時可以接受輸入,在拳稍微收回時進行下段攻擊。
接著我們修改GA_Combo1決定接受通知後的行為。
如上圖,若播放到Montage的通知,在PlayMontage後的OnNotifyBegin和OnNotifyEnd接續處理。在這邊根據收到的通知,在期間內分別新增相對的Tag到玩家,以準備下個Combo的處理。
這邊也要處理沒有按下下段攻擊的情況,在技能結束後清除Tag。
接著我們新增第二段攻擊的Gameplay Ability。
內容如下
這邊觸發技能後,我們不是直接播放動畫,而是使用WaitGameplayTagAdd來等待指定的GameplayTag被新增時才播放。這邊設定為AbilityBranch.Combo2。
接著在Class Defaults加入以下設定。
條件如此設定,便能達成在特定時間可輸入,並且在特定時間播放的功能了。
最後別忘了在角色上加入Combo2的能力。
進入遊戲測試,在第一段攻擊後再次按下攻擊
成功打出第二段Combo,可喜可賀!
加入第三段Combo
和第二段Combo使用同樣的要領,就能無限的增加Combo。每次新增的流程再次整理如下:
- 新增前次連段Montage的AnimationNotify
- 新增前次連段Ability的Tag追加/刪除處理
- 新增Montage
- 新增GameplayAbility
- 新增該技能至角色
最終結果
以下是最後完成的三段combo影片,操作是純粹的Z連打。