本文為B站系列教學視頻 《UE5_C++多人TPS完整教程》 —— 《P46 待機與跳躍(Idle And Jumps)》 的學習筆記,該系列教學視頻為計算機工程師、程序員、游戲開發者、作家(Engineer, Programmer, Game Developer, Author) Stephen Ulibarri 發布在 Udemy 上的課程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻譯版,UP主(也是譯者)為 游戲引擎能吃么。
文章目錄
- P46 待機與跳躍(Idle And Jumps)
- 46.1 Idle 待機狀態
- 46.2 Jump 跳躍狀態
- 46.3 Run 奔跑到 Jump 跳躍狀態的轉換
- 46.4 對跳躍動畫進行調整
- 46.5 Summary
P46 待機與跳躍(Idle And Jumps)
本節課我們將結合前兩節課制作的持槍奔跑混合空間,處理人物角色待機和跳躍動畫,使得人物角色在裝備武器時的動畫更完整。
46.1 Idle 待機狀態
-
在虛幻引擎中打開動畫藍圖 “
BlasterAnimBP
”,然后在 “AnimGraph
” 面板中打開狀態機 “Equipped
” 的編輯界面,雙擊 “Standing
” 節點進入編輯界面。在藍圖編輯面板中 “添加新的狀態機”(Add New State Machine),命名為 “Standing
”,將 “Standing
” 的輸出引腳與 “輸出動畫姿勢”(Out Animation Pose)節點的 “Result
” 引腳連接,然后剪切剩下的節點。
-
雙擊 “
Standing
” 進入狀態機編輯界面,在面板中 “添加狀態”(Add State)“Idle
” 和 “Run
”。
-
雙擊 “
Run
” 狀態節點進入編輯界面,將剪切的藍圖節點粘貼到面板中,并將 “EquippedRun
” 節點的 “Animation Pose
” 輸出引腳與 “輸出動畫姿勢”(Out Animation Pose)節點的 “Result
” 引腳連接。
-
返回 “
Standing
” 狀態機編輯界面,雙擊 “Idle
” 狀態節點進入編輯界面,在右側內容瀏覽器中將動畫資產 “Idle_Rifle_Hip
” 拖拽至面板中生成藍圖節點 “序列播放器 Idle_Rifle_Hip”(Play Idle_Rifle_Hip),并將該節點的輸出引腳與“輸出動畫姿勢”(Out Animation Pose)節點的 “Result
” 引腳連接。
-
返回 “
Standing
” 狀態機編輯界面,雙擊 “Idle 到 Run”(Idle to Run) 轉換按鈕進入轉換規則藍圖編輯界面,在面板中添加藍圖節點 “獲取 Speed”(Get Speed)、“大于”(>)、“獲取 Is In Air”(Get Is In Air)、“NOT布爾”(NOT Boolean)、“獲取 Is Accelarating”(Get Is Accelarating)以及 “AND布爾”(AND Boolean),在為節點 “AND布爾” “添加引腳”(Add pin)后,按下圖所示連線繪制藍圖。這段藍圖表示當 “Idle” 狀態下的人物角色同時滿足速度大于 0(
Speed > 0
)、不在空中 (bIsInAir == false
)且在加速(bIsAccelarating == true
)三個條件時,就可以由 “Idle” 轉換到 “Run” 狀態。
-
返回 “
Standing
” 狀態機編輯界面,在 “Run
” 狀態節點上拉出一條線連接 “Idle
”,生成 “Run 到 Idle”(Idle to Run) 的轉換規則,雙擊轉換按鈕進入轉換規則藍圖編輯界面,在面板中添加藍圖節點 “獲取 Is Accelarating”(Get IsAccelarating)和 “NOT布爾”(NOT Boolean),按下圖所示連線繪制藍圖,這段藍圖表示當當 “Run” 狀態下的人物角色不在在加速(
bIsAccelarating == false
)三個條件時,就可以由 “Run” 轉換到 “Idle” 狀態。
-
編譯、保存后進行測試,可以看到我們的人物角色在拾取并裝備武器后,如果不進行任何操控,就會保持 “
Idle
” 狀態并循環播放持槍待機動畫 “Idle_Rifle_Hip
”,但如果按下 WASD 鍵,人物角色開始進入 “Run
” 狀態持槍奔跑,并根據人物角色的移動和瞄準方向播放持槍奔跑混合空間 “EquippedRun
中的動畫,在此過程中松開 WASD 鍵人物角色就會進入 “Idle
” 狀態。
46.2 Jump 跳躍狀態
-
返回 “
Standing
” 狀態機編輯界面,從狀態節點 “Idle
” 開始按順序依次添加并連接新的狀態節點 “JumpStart
”、“JumpLoop
” 和 “JumpStop
”,最后由 “JumpStop
” 連回 “Idle
” 構成一個循環。
-
進入 “
JumpStart
” 狀態編輯界面,在右側內容瀏覽器中將動畫資產 “Jump
” 拖拽至面板中生成藍圖節點 “序列播放器 Jump”(Play Jump),并將該節點的輸出引腳與“輸出動畫姿勢”(Out Animation Pose)節點的 “Result
” 引腳連接。
-
進入 “
JumpLoop
” 狀態編輯界面,在右側內容瀏覽器中將動畫資產 “Jump_Loop
” 拖拽至面板中生成藍圖節點 “序列播放器 JumpLoop”(Play Jump_Loop),并將該節點的輸出引腳與“輸出動畫姿勢”(Out Animation Pose)節點的 “Result
” 引腳連接。
-
進入 “
JumpStop
” 狀態編輯界面,在右側內容瀏覽器中將動畫資產 “Jump_Down
” 拖拽至面板中生成藍圖節點 “序列播放器 Jump_Down”(Play Jump_Down),并將該節點的輸出引腳與“輸出動畫姿勢”(Out Animation Pose)節點的 “Result
” 引腳連接。
-
進入 “Idle 到 JumpStart”(Idle to JumpStart)轉換規則藍圖編輯界面,在面板中添加藍圖節點 “獲取 Is In Air”(Get Is In Air),并將該節點的輸出引腳與 “結果”(Result)節點的 “
Can Enter Transition
” 輸入引腳連接。
-
在 “
Standing
” 狀態機編輯界面選中 “JumpStart 到 JumpLoop”(JumpStart to JumpLoop)轉換按鈕,右側細節面板中勾選 “過渡”(Transition)選項卡下的 “基于狀態中序列播放器的自動規則”(Automatic Rule Based on Sequence Player in State)。
-
進入 “JumpLoop 到 JumpStop”(JumpLoop to JumpStop)轉換規則藍圖編輯界面,在面板中添加藍圖節點 “獲取 Is In Air”(Get Is In Air) 和 “NOT布爾”(NOT Boolean)節點,將 “獲取 Is In Air” 的輸出引腳與 “NOT布爾” 的輸入引腳連接,然后將該 “結果”(Result)節點的 “
Can Enter Transition
” 輸入引腳連接。
-
在 “
Standing
” 狀態機編輯界面由狀態 “JumpStop
” 再引出一條線連接 “Idle
” 生成新的 “JumpStop 到 Idle”(JumpEnd to Idle)轉換規則。雙擊進入其中一個轉換規則藍圖編輯界面,添加藍圖節點 “獲取 Is Crouched”(Get Is Crouched),并將該節點的輸出引腳與 “結果”(Result)節點的 “Can Enter Transition
” 輸入引腳連接;隨后,在另一個轉換規則中勾選“結果”(Result)節點的 “Can Enter Transition
” 輸入引腳。
-
編譯、保存后進行測試,可以發現人物角色在持槍跳躍到落地的過程有些脫節和延遲,并且跳躍動畫會循環播放,需要調整動畫播放的一些參數。
-
進入 “
JumpStart
” 狀態編輯界面,在面板中選中藍圖節點“序列播放器 Jump”(Play Jump),然后在右側細節面板中的 “設置”(SETTINGS)選項卡下將 “播放速率”(Play Rate)設置為 1.5,并取消 “循環動畫”(Loop Animation)的勾選。
進入 “JumpLoop
” 狀態編輯界面,在面板中選中藍圖節點“序列播放器 Jump”(Play Jump),然后在右側細節面板中的 “設置”(SETTINGS)選項卡下 “播放率”(Play Rate)設置為 2.0。
在 “Standing
” 狀態機編輯界面選中 “JumpStart 到 JumpLoop”(JumpStart to JumpLoop)轉換按鈕,然后在右側細節面板中 “混合設置”(BLEND SETTINGS)中將 “時長”(Duration)設置為 0.1。
在 “Standing
” 狀態機編輯界面選中 “JumpLoop 到 JumpStop”(JumpLoop to JumpStop)轉換按鈕,然后在右側細節面板中 “混合設置”(BLEND SETTINGS)中將 “時長”(Duration)設置為 0.1。
進入 “JumpStop
” 狀態編輯界面,在面板中選中藍圖節點“序列播放器 Jump_Down”(Play Jump_Down),然后在右側細節面板中的 “設置”(SETTINGS)選項卡下 “播放率”(Play Rate)設置為 1.5,并取消 “循環動畫”(Loop Animation)的勾選。
-
編譯、保存后進行測試,可以發現在調整后人物角色在持槍跳躍到落地的過程看起來比較流暢自然。但人物角色在持槍奔跑時進行跳躍時并未播放跳躍動畫,因此我們還想要從持槍奔跑動畫過渡到跳躍動畫。
46.3 Run 奔跑到 Jump 跳躍狀態的轉換
-
在從“
Standing
” 狀態機編輯界面,從狀態節點 “Run
” 引出一條線連接 “JumpStart
” 生成 “Run 到 JumpStart”(Run to JumpStart)轉換規則。進入 “Run 到 JumpStart” 轉換規則藍圖編輯界面,在面板中添加藍圖節點 “獲取 Is In Air”(Get Is In Air),并將該節點的輸出引腳與 “結果”(Result)節點的 “Can Enter Transition
” 輸入引腳連接。
-
編譯、保存后進行測試,可以發現人物角色可以流暢地從持槍奔跑動畫過渡到跳躍動畫,但是跳躍時滯空時間可能有些長,可以調整人物角色移動組件的 “跳躍Z速度”(Jump ZVelocity)和 “重力標度”(Gravity Scale)。
-
打開人物角色藍圖類 “
BP_EpicCharacter
”,在左側組件面板選中 “角色移動(CharMoveComp)(角色移動組件)”,然后在右側細節面板中將 “角色移動(通用設置)”(CHARACTER MOVEMENT(GNEERAL SETTINGS)) 下的 “重力標度”(Gravity Scale)改為 3.0(教學視頻中最后又改為 4.0),將 “角色移動:上跳/下落”(CHARACTER MOVEMENT: JUMPING/FALLING)) 下的 “跳躍Z速度”(Jump ZVelocity)改為 1600.0 cm/s。
-
編譯、保存后測試,可以發現人物角色跳躍和下降的速度更快了,這樣就可以跳上更高的壁架(Ledges)并且更快地落地,我們的游戲也多了一些平臺游戲的感覺(platformer-type feel)
-
若不太滿意人物角色落地時雙腿懸空(Dangling up)時間太長,我們可以在虛幻引擎資產瀏覽器中復制 “
Jump_Down
”,將復制好的動畫資產命名為 “Jump_Down_Trim
”,雙擊進入該動畫資產的動畫序列編輯器(Animation Sequence Editor),在下方資產編輯器(Asset Editor)中跳轉到 幀36(左上角橙色數字框里可以輸入要跳轉的幀數,輸入后按 Enter 鍵跳轉),單擊鼠標右鍵,在彈出的菜單欄中選擇 “移除幀0到幀36之間的幀”(Remove frame 0 to frame 36),這樣就可以剪去 “Jump_Down
” 中雙腿懸空的動畫幀。
-
打開人物角色動畫藍圖類 “
BlasterAnimBP
”,進入 “JumpStop
” 狀態編輯界面,在右側內容瀏覽器中將動畫資產 “Jump_Down_Trim
” 拖拽至面板中生成藍圖節點 “序列播放器 Jump_Down_Trim”(Play Jump_Down_Trim),并將該節點的輸出引腳與“輸出動畫姿勢”(Out Animation Pose)節點的 “Result
” 引腳連接。
-
編譯保存后進行測試,人物角色在落地時會干脆利索一些。
46.4 對跳躍動畫進行調整
-
在前面的測試中,當人物角色持槍跳躍時會傾斜一個角度,我們希望人物角色在起跳時始終面向前方,在虛幻引擎資產瀏覽器中復制 “
Jump
”,可以看到內容瀏覽器中生成了新的動畫資產 “Jump1
”。雙擊進入該動畫資產的動畫序列編輯器,攝像機調整至人物角色后方在左側骨骼樹(Skeleton Tree)中選中骨骼根節點 “Root
”,將其逆時針水平旋轉 45°。隨后,在工具欄中點擊 “+關鍵幀”(+Key),為動畫添加關鍵幀,點擊后可以看到下方時間軸中出現了名為 “root
” 的 “Additive圖層軌道”(Additive Layer Tracks)。
-
在工具欄中 “創建資產”(Create Asset),選擇 “創建動畫”(Create Animation),選擇 “當前動畫”(Current Animation),再選擇 “預覽網格體”(Preview Mesh),隨后在彈出的對話框中將動畫資產命名為 “
Jump_Rot
” 并保存到 “/Game/Contents/Assets/Animation
” 目錄下。
-
在內容瀏覽器中可以看到新創建的動畫資產 “
Jump_Rot
”,點擊 “保存所有”(Save All),隨后 “強制刪除”(Force Delete)動畫資產 “Jump1
”。 -
打開人物角色動畫藍圖類 “
BlasterAnimBP
”,進入 “JumpStart
” 狀態編輯界面,在右側內容瀏覽器中將動畫資產 “Jump_Rot
” 拖拽至面板中生成藍圖節點 “序列播放器 Jump_Rot”(Play Jump_Rot),并將該節點的輸出引腳與“輸出動畫姿勢”(Out Animation Pose)節點的 “Result
” 引腳連接。
-
仿照上述步驟,創建新的動畫資產,“
Jump_Loop_Rot
” 和 “Jump_Down_Trim_Rot
”,并在相應的狀態藍圖編輯界面生成新的藍圖節點,并將新節點的輸出引腳代替之前的動畫節點的輸出引腳,與 “輸出動畫姿勢” 節點的 “Result
” 引腳連接。 -
編譯、保存后進行測試,可以發現人物角色在持槍跳躍時始終面向前方,但是起跳時人物角色雙腿伸直到懸空的前搖太長,導致銜接有些奇怪。
-
在虛幻引擎資產瀏覽器中復制 “
Jump_Rot
”,將復制好的動畫資產命名為 “Jump_Rot_Trim
”,雙擊進入動畫資產 “Jump_Rot
” 的動畫序列編輯器,在下方資產編輯器中跳轉到 幀7(左上角橙色數字框里可以輸入要跳轉的幀數,輸入后按 Enter 鍵跳轉),單擊鼠標右鍵,在彈出的菜單欄中選擇 “移除幀0到幀7之間的幀”(Remove frame 0 to frame 7),這樣就可以剪去 “Jump_Rot
” 中人物角色在持槍起跳時雙腿伸直到懸空的前搖。然后,在 “JumpStart
” 狀態編輯界面修改藍圖即可。
-
編譯、保存后進行測試,可以發現人物角色在持槍起跳時雙腿伸直到懸空銜接非常絲滑流暢,Perfect!
46.5 Summary
本節課我們完善了人物角色在裝備武器狀態下的待機與跳躍動畫,完善了人物角色裝備武器的 “EquippedWeapon
” 狀態機。首先,我們在 “Standing
” 狀態機中創建了 “Idle
” 和 “Run
” 兩個核心狀態,并設置了它們之間的轉換規則。“Idle
” 狀態播放持槍待機動畫 “Idle_Rifle_Hip
”,其轉換到 “Run
” 狀態的條件是:速度大于 0 (Speed > 0
)、不在空中 (!bIsInAir
) 且正在加速 (bIsAccelerating
)。反向轉換規則則只需檢測是否不在加速 (!bIsAccelerating
),即可從 “Run
” 狀態平滑過渡回 “Idle
” 狀態。
接著,我們為跳躍動作創建了由 “JumpStart
”、“JumpLoop
” 和 “JumpStop
” 三個狀態組成的動畫序列。通過檢測 “bIsInAir
” 變量,實現了從 “Idle
” 或 “Run
” 狀態到 “JumpStart
” 狀態的轉換。“JumpStart
” 到 “JumpLoop
” 的轉換采用了“基于序列播放器的自動規則”,而 “JumpLoop
” 到 “JumpStop
” 的轉換則通過檢測 “!bIsInAir
”(是否接觸到地面)來觸發。最終,從 “JumpStop
” 狀態成功轉換回 “Idle
” 狀態,完成了整個跳躍循環。
隨后,我們對所有跳躍動畫的播放參數進行了精細調整,包括設置合適的播放速率 (Play Rate)、禁用循環播放、以及設置狀態間短暫的混合時長 (Duration),顯著改善了動畫銜接的流暢度和自然感。
此外,我們還通過調整角色移動組件 “UCharacterMovementComponent
” 的重力標度(Gravity Scale)和跳躍Z速度(Jump ZVelocity)參數,優化了角色的跳躍高度和下落速度,使游戲體驗更偏向于平臺跳躍風格。
最后,我們通過創建并應用旋轉后的跳躍動畫資產 “Jump_Rot
”, “Jump_Loop_Rot
”, “Jump_Down_Trim_Rot
”,并修剪起跳動畫 “Jump_Rot
” 的前搖幀得到 “Jump_Rot_Trim
”,確保了角色在跳躍過程中始終面向前方,且動作銜接更加干脆利落。最終實現的動畫狀態機使得角色在持槍時的待機、奔跑、起跳、空中姿態及落地整個流程都非常流暢和自然。