在自定以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身上的弹簧臂就会发送改变,如果不减去,就产生拉扯,而减去后,相当于此时的过渡已经在蹲下后进行表现了,不会出现拉扯感

作者:XTG111

出处:https://www.cnblogs.com/XTG111/p/18380913

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   XTG111  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示