本文為B站系列教學視頻 《UE5_C++多人TPS完整教程》 —— 《P47 蹲伏行走(Crouching Walking)》 的學習筆記,該系列教學視頻為計算機工程師、程序員、游戲開發者、作家(Engineer, Programmer, Game Developer, Author) Stephen Ulibarri 發布在 Udemy 上的課程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻譯版,UP主(也是譯者)為 游戲引擎能吃么。
文章目錄
- P47 蹲伏行走(Crouching Walking)
- 47.1 創建蹲伏行走混合空間藍圖類
- 47.2 完善蹲伏行走狀態機
- 47.3 Summary
P47 蹲伏行走(Crouching Walking)
本節課我們將創建一個蹲伏行走的混合空間,使得人物角色在持槍時擁有蹲伏行走的能力。
47.1 創建蹲伏行走混合空間藍圖類
-
在 “
/Game/Contents/Blueprints/Character/Animation
” 目錄下以 “SK_EpicCharacter_Skeleton
” 為骨骼創建混合空間1D(Blend Space 1D)藍圖類,命名為 “CrouchWalking
”。打開 “CrouchWalking
” 混合空間編輯器,在左側 “資產詳情”(Asset Details)面板的 “Axis Settings
” 選項卡下展開 “水平坐標”(Horizontal Axis),設置 “名稱”(Name)為 “YawOffset”,并設置 “最小軸值”(Minimum Axis Value)為 -180.0,“最大軸值”(Maximum Axis Value)為 180.0。
-
在右側資產瀏覽器中拖拽向前蹲伏行走的動畫資產 “
Crouch_Walk_Fwd_Rifle_Hip
” 的同時按下鍵盤 Shift 鍵,將其放置在資產編輯器坐標軸 (0.0, 0.0) 處生成采樣點。同理,分別將向左蹲伏行走的動畫資產 “Crouch_Walk_Lt_Rifle_Hip
” 和向右蹲伏行走 “Crouch_Walk_Rt_Rifle_Hip
” 放置在 (-90.0, 0.0) 和 (90.0, 0.0) 處,然后將向后蹲伏行走的動畫資產 “Crouch_Walk_Bwd_Rifle_Hip
” 放置在 (-180.0, 0.0) 和 (180.0, 0.0) 處。
-
在虛幻引擎中打開動畫藍圖 “
BlasterAnimBP
”,然后在 “AnimGraph
” 面板中打開狀態機 “Equipped
” 的編輯界面,雙擊 “Crouching
” 狀態節點進入編輯界面,在藍圖編輯面板中刪除之前的藍圖節點, 并 “添加新的狀態機”(Add New State Machine),命名為 “Crouching
”,將 “Crouching
” 的輸出引腳與 “輸出動畫姿勢”(Out Animation Pose)節點的 “Result
” 引腳連接。
-
雙擊 “
Crouching
” 進入狀態機編輯界面,在面板中 “添加狀態”(Add State)“Crouch
”,并將 “Entry
” 節點的輸出引腳與 “Crouch
” 進行連接。
-
雙擊進入 “
Crouch
” 狀態編輯界面,在右下角資產瀏覽器中拖拽混合空間動畫藍圖類 “CrouchingWalking
” 至面板中生成藍圖節點,將該節點的 “Animation Pose
” 輸出引腳與 “輸出動畫姿勢”(Out Animation Pose)節點的 “Result
” 引腳連接。添加 “獲取 YawOffset”(Get YawOffset)節點,將該節點的輸出引腳與 “CrouchingWalking
” 節點的 “YawOffset
” 輸入引腳連接。
-
編譯、保存后進行測試,可以發現人物角色在持槍時擁有了蹲伏行走的能力,雖然蹲伏行走的速度較慢。
-
我們需要增加人物角色在持槍時蹲伏行走的速度,打開人物角色藍圖類 “
BP_EpicCharacter
”,在左側組件面板選中 “角色移動(CharMoveComp)(角色移動組件)”,然后在右側細節面板中將 “角色移動:行走”(CHARACTER MOVEMENT: WALKING) 下的 “最大蹲伏行走速度”(Max Walk Speed Crouched)改為 350.0 cm/s。
-
編譯、保存后進行測試,可以發現人物角色在持槍蹲伏行走時的速度會快一些。
47.2 完善蹲伏行走狀態機
-
在 “
Crouching
” 狀態編輯界面中,將節點 “Crouch
” 重命名為 “CrouchWalking
”,并從該節點中引出一條線,連接新的狀態節點 “CrouchIdle
”,接著再從 “CrouchIdle
” 引回一條線連接 “CrouchWalking
”。然后,將節點 “Entry
” 的指向修改為 “CrouchIdle
”
-
進入 “CrouchWalking 到 CrouchIdle” 轉換規則藍圖編輯界面,在面板中添加藍圖節點 “獲取 Is Accelarating”(Get Is Accelarating)和 “NOT布爾”(NOT Boolean),按下圖所示連線繪制藍圖,這段藍圖表示當人物角色不在加速時,就從 “
CrouchWalking
” 狀態轉換到 “CrouchIdle
” 狀態。
-
進入 “CrouchIdle 到 CrouchWalking” 轉換規則藍圖編輯界面,在面板中添加藍圖節點 “獲取 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
)三個條件時,就可以由 “CrouchIdle
” 轉換到 “CrouchWalking
” 狀態。
-
進入 “
CrouchIdle
” 狀態編輯界面,在右下角資產瀏覽器中拖拽動畫資產 “Crouch_Idle_Rifle_Hip
” 至面板中生成藍圖節點,將該節點的 “Animation Pose
” 輸出引腳與 “輸出動畫姿勢”(Out Animation Pose)節點的 “Result
” 引腳連接。
-
編譯、保存后進行測試,可以看到在人物角色持槍并進行蹲伏時如果我們不進行任何移動操作,人物角色會保持待機狀態,如果我們移動人物角色,人物角色就會進入蹲伏行走狀態;并且,人物角色在站立奔跑狀態下按下 Shift 鍵,人物角色也可以立即進入蹲伏狀態。
47.3 Summary
本節課我們實現了人物角色在裝備武器狀態下的蹲伏移動動畫,進一步完善了 “Equipped
” 狀態機。首先,我們創建了蹲伏行走 “混合空間1D”(Blend Space 1D)“CrouchWalking
”,為其水平軸 “YawOffset
” 配置了范圍(-180.0 到 180.0),并將向前 “Crouch_Walk_Fwd_Rifle_Hip
”)、向后 “Crouch_Walk_Bwd_Rifle_Hip
”)、向左 “Crouch_Walk_Lt_Rifle_Hip
” 和向右 “Crouch_Walk_Rt_Rifle_Hip
” 的蹲伏行走動畫資產精確放置在坐標軸的關鍵點上。
接著,我們在動畫藍圖的 “Crouching
” 狀態中,將計算好的 “YawOffset
” 變量連接到 “CrouchWalking
” 混合空間節點的對應輸入引腳,驅動角色根據移動方向播放正確的蹲伏行走動畫。隨后,我們通過調整角色移動組件的 “最大蹲伏行走速度”(Max Walk Speed Crouched)參數至 350.0 cm/s,優化了蹲伏狀態下的移動體驗。
然后,我們完善了 “Crouching
” 狀態機,創建了蹲伏待機 “CrouchIdle
” 和蹲伏行走 “CrouchWalking
”兩個子狀態,并設置了它們之間的轉換規則。從 “CrouchWalking
” 轉換到 “CrouchIdle
” 的條件是檢測到不在加速 (!bIsAccelerating
);反向轉換則需同時滿足速度大于0 (Speed > 0
)、不在空中 (bIsInAir
) 且正在加速 (bIsAccelerating
) 三個條件。在 “CrouchIdle
” 狀態藍圖中,設置播放 “Crouch_Idle_Rifle_Hip
” 待機動畫,使得人物角色蹲伏未行走時能夠進行蹲伏待機。
最終實現的動畫狀態機使得角色在持槍蹲伏時,能夠根據輸入在待機和行走狀態間平滑切換,并且蹲伏行走能夠響應不同移動方向,與站立狀態的奔跑、跳躍動畫共同構成了一個完整、流暢的角色移動動畫系統。