本文为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
” 待机动画,使得人物角色蹲伏未行走时能够进行蹲伏待机。
最终实现的动画状态机使得角色在持枪蹲伏时,能够根据输入在待机和行走状态间平滑切换,并且蹲伏行走能够响应不同移动方向,与站立状态的奔跑、跳跃动画共同构成了一个完整、流畅的角色移动动画系统。