《UE5_C++多人TPS完整教程》学习笔记45 ——《P46 待机与跳跃动画(Idle And Jumps)》
本文为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 奔跑到跳跃状态的转换
- 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 奔跑到跳跃状态的转换
-
在从“
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
”,确保了角色在跳跃过程中始终面向前方,且动作衔接更加干脆利落。最终实现的动画状态机使得角色在持枪时的待机、奔跑、起跳、空中姿态及落地整个流程都非常流畅和自然。