在自定以CMC中实现下蹲控制以及摄像机的平滑过渡
1.在自定以CMC中实现下蹲控制以及摄像机的平滑过渡
在前一节实现了自定义CMC中的基础框架,由于下蹲本来就是设定好的一个MoveMode,所以我们不需要在UpdateMove中实现控制逻辑,只需要开放一个接口给外部调用就可以了
下蹲
UFUNCTION(BlueprintCallable)
void CrouchPressed();
void UXCharacterMovementComponent::CrouchPressed()
{
bWantsToCrouch = !bWantsToCrouch;
}
需要注意的是在构造函数中设置可下蹲
NavAgentProps.bCanCrouch = true;
相机的平滑过渡
之前有用过时间轴来平滑过渡相机,当按下按键后进行时间轴播放,现在学习了另外一种做法就是继承CameraManager类,重写UpdateViewTarget方法
//在类中,我们可以判断当前相机是否有我们的Actor,如果没有就不必要执行相机平滑操作了
AAddInCMCCharacter* XCharacter = Cast<AAddInCMCCharacter>(GetOwningPlayerController()->GetPawn());
if (XCharacter)
{
UXCharacterMovementComponent* XMC = XCharacter->GetXCharacterMovementComponent();
//Target
FVector TargetCrouchOffset = FVector(
0.0f,
0.0f,
XMC->CrouchedHalfHeight - XCharacter->GetClass()->GetDefaultObject<ACharacter>()->GetCapsuleComponent()->GetScaledCapsuleHalfHeight() // 设置最终的目标位置
);
//根据当前时间 计算偏移量 CrouchBlendDuration为设定的总下蹲时间
FVector Offset = FMath::Lerp(
FVector::ZeroVector,
TargetCrouchOffset,
FMath::Clamp(CrouchBlendTime / CrouchBlendDuration, 0.0f, 1.0f)
);
if (XMC->IsCrouching())
{
//now frame blendtime 更新下蹲时间
CrouchBlendTime = FMath::Clamp(
CrouchBlendTime + DeltaTime,
0.0f,
CrouchBlendDuration
);
//纠正偏移量,避免最开始相机的突然变换
Offset -= TargetCrouchOffset;
}
else
{
CrouchBlendTime = FMath::Clamp(
CrouchBlendTime - DeltaTime,
0.0f,
CrouchBlendDuration
);
}
if (XMC->IsMovingOnGround())
{
OutVT.POV.Location += Offset; // 应用偏移量
}
}
Offset -= TargetCrouchOffset
的原因在于,如果不减去,Offset的偏移是相对于从idle向蹲下逐渐过渡的,而对于蹲下这个动作是一瞬间的,我们调整的只是摄像机的视觉控制,当蹲下后,Actor身上的弹簧臂就会发送改变,如果不减去,就产生拉扯,而减去后,相当于此时的过渡已经在蹲下后进行表现了,不会出现拉扯感
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律