实现游戏角色跳跃
2023年6月11日 2024年1月18日
概览
状态机
State Machine
- 定义多个状态,每个状态对应一个动画
- 在一个动画蓝图中管理多个状态,并定义状态之间的迁移条件
ACharacter::IsFalling
- 当Character在空中时返回true,Character落地时返回false
绑定跳跃键位
虚幻编辑器
项目设置 > Engine > Input
动作映射
函数描述 | 键位 |
---|---|
Jump | SpaceBar |
实现跳跃逻辑
C++
- | 回调函数签名 |
---|---|
BindAction | void handler() |
函数描述 | 回调函数 | |
---|---|---|
Jump | Jump | 回调函数由虚幻引擎提供,按下时触发 |
绑定函数描述和回调函数
ShootThemUp: Player/STUBaseCharacter.cpp
1// SetupPlayerInputComponent 2PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ASTUBaseCharacter::Jump);
使用状态机实现跳跃动画
虚幻编辑器
实现跳跃动画
ABP_BaseCharacter
添加状态机, 将其作为OutPose的输入
AnimGraph
-
添加
状态机
,命名为Locomotion
-
将
Locomotion
作为OutputPose
的输入
状态机说明
- 跳跃动画资产
- JumpStart 跳起 JumpLoop 在空中 JumpEnd 落地
- 状态
- Walk JumpStart JumpLoop JumpEnd
- 状态迁移
- Walk > JumpStart 游戏角色在空中 JumpStart > JumpLoop JumpStart动画播放结束 JumpLoop > JumpEnd 游戏角色落地 JumpEnd > Walk JumpEnd动画播放结束
实现状态机
-
双击Locomotion,进入状态机
仅一个入口
Entry
-
移植Walk状态
-
为
Locomotion
添加State
,命名为Walk
,使Entry
指向 -
双击
Walk
-
将OutputPose之前的输入,
Velocity + BS_Locomotion_Walk_1D
封装到Walk
状态(剪切), 作为其 OutputAnimationPose 的输入至此,
Character
的运动动画和上一小节一致
-
-
实现跳跃状态
-
添加布尔型变量IsFalling
上一小节中,变量
Velocity
横跨ABP_BaseCharacter
的EventGraph
和AnimGraph
,这里,布尔类型变量IsFalling
也一样在
EventGraph
设置变量值,在AnimGraph
中使用变量
-
使用ACharacter::IsFalling设置变量IsFalling
EventGraph
-
将Pawn转换为Character
-
接着设置Velocity, 将Pawn转换为Character
不能同时从EventBlueprintUpdateAnimation
出发,SetVelocity
之后,执行转换 -
双击
TryGetPawnOwner
和CastToCharacter
连线上的一点,创建Bezier曲线,排线更易整理
-
-
对ACharacter::CharacterMovement调用ACharacter::IsFalling
-
接着CastToCharacter, 设置IsFalling
-
从
CaseToCharacter > AsCharacter
到IsFalling > Target
,自动添加提取数据成员;IsFalling
函数的返回类型是布尔,作为SetIsFalling
的输入
-
-
完整EventGraph
-
-
实现状态机
-
回到
Locomotion
-
从
AssetBrowser
把Jump
的三个动画拖入Locomotion
动画自动被封装为State
,和之前AddState
,再将动画作为状态输入达到的效果一样 -
添加状态迁移路径
-
添加状态迁移条件
状态迁移 触发条件 Walk > JumpStart 游戏角色在空中 ACharacter::IsFalling返回true JumpStart > JumpLoop JumpStart动画播放结束 TimeRemaining < 0.1 JumpLoop > JumpEnd 游戏角色落地 ACharacter::IsFalling返回false JumpEnd > Walk JumpEnd动画播放结束 TimeRemaining < 0.1 -
双击转换图标,即可为状态迁移添加迁移条件
拿Walk > JumpStart
举例 -
Walk > JumpStart
迁移条件:变量IsFalling
为true
-
JumpStart > JumpLoop
迁移条件:JumpStart
动画将近结束 -
JumpLoop > JumpEnd
迁移条件:变量IsFalling
为false
-
JumpEnd > Walk
迁移条件:JumpEnd
将近结束
-
-
设置
State
输入动画是否循环播放- BS_Locomotion_Walk_1D 循环播放 JumpStart 播放一次 JumpLoop 循环播放 JumpEnd 播放一次 拿
JumpStart
状态举例:选中JumpStart动画 > Details > Settings > LoopAnimation 为true
如此设置还可修复Character跳跃时的卡顿
-
-
添加楼梯,查看Jump三阶段是否正常显示
-
添加楼梯
PlaceActors > Geometry > LinearStair
-
设置阶数
选中LinearStairBrush > Details > BrushSettings > NumSteps
-
将楼梯移动到合适位置
-
游戏角色从楼梯跳到平面时,循环
JumpLoop
-
跑步时跳跃,落地后会平滑一段距离
跳跃时Z方向速度
BP_STUBaseCharacter
JumpZVelocity不宜过大, 不然 JumpStart
动画播放结束,速度却未减为0,此时Character还在上升,却在播放 JumpLoop
- | ||
---|---|---|
Vz > 0 | JumpStart | 该过程应 近似 JumpStart 播放时长 |
Vz <= 0 | JumpLoop | 从临界点落下 |
Vz = 0 | JumpEnd |