1.二段跳
首先如果不想使用UE中增强输入功能,可以在SetupPlayerInputComponent函数中绑定对应的操作,具体可以自行查找。如果使用增强输入,可以通过创建一个UE自带的第三人称模板C++项目学习,假设当前项目是创建自UE第三人称模板项目。
实现,重写Jump,StopJumping,Landed函数 , StopJumping会在Jump函数执行后会立即执行,Landed函数会在角色落地后执行,我没有完善角色的二段跳动画,如果想完善可以在跳跃动作的状态机(statemachine)拉出一个新的状态,这个状态是二段跳的状态,状态的动画是二段跳动画。
cpp
// h
/** 当前角色跳跃 */
virtual void Jump() override;
/** 当前角色停止跳跃 */
virtual void StopJumping() override;
/** 当前角色着陆 */
virtual void Landed(const FHitResult& Hit) override;
UPROPERTY(VisibleAnywhere, Category = "Jump")
bool bCanDoubleJump; // 是否可以进行二段跳
UPROPERTY(VisibleAnywhere, Category = "Jump")
float DoubleJumpZVelocity; // 二段跳的垂直速度
// cpp
AJumpCharacter::AJumpCharacter()
{
// 构造函数中初始化
bCanDoubleJump = false;
DoubleJumpZVelocity = 1000.f; // 可根据需要调整
}
void AJumpCharacter::Jump()
{
// 如果角色能够跳跃,执行第一次跳跃
//UE_LOG(LogTemp, Warning, TEXT("jump"));
if (CanJump())
{
Super::Jump();
bCanDoubleJump = true; // 允许进行二段跳
//UE_LOG(LogTemp, Warning, TEXT("first jump"));
}
else if (bCanDoubleJump)
{
// 如果可以二段跳,进行二段跳
//UE_LOG(LogTemp , Warning , TEXT("second jump"));
FVector JumpVelocity = FVector(0.f, 0.f, DoubleJumpZVelocity);
GetCharacterMovement()->Launch(FVector(0.f, 0.f, DoubleJumpZVelocity));
bCanDoubleJump = false; // 禁用二段跳
}
}
void AJumpCharacter::StopJumping()
{
Super::StopJumping();
//UE_LOG(LogTemp , Warning , TEXT("StopJumping"));
//bCanDoubleJump = false; // 重置二段跳状态
}
void AJumpCharacter::Landed(const FHitResult& Hit)
{
Super::Landed(Hit);
//UE_LOG(LogTemp, Warning, TEXT("Landed"));
bCanDoubleJump = false; // 角色落地后禁用二段跳
}