首页 > 其他分享 >在自定以CMC中实现下蹲控制以及摄像机的平滑过渡

在自定以CMC中实现下蹲控制以及摄像机的平滑过渡

时间:2024-08-26 14:38:41浏览次数:9  
标签:FVector 自定 0.0 CMC TargetCrouchOffset 摄像机 CrouchBlendTime Offset CrouchBlendDura

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

标签:FVector,自定,0.0,CMC,TargetCrouchOffset,摄像机,CrouchBlendTime,Offset,CrouchBlendDura
From: https://www.cnblogs.com/XTG111/p/18380913

相关文章

  • 学懂C++(四十四):C++ 自定义内存管理的深入解析:内存池与自定义分配器
    目录1.内存池(MemoryPool)概念模型特点核心点实现适用场景经典示例实现代码解析2.自定义分配器(CustomAllocators)概念模型特点核心点实现适用场景经典示例实现代码解析高级自定义分配器示例代码解析总结        C++作为一种高性能编程语言,在......
  • vue element-ui表格table 表格动态 添加行、删除行、添加列、删除列 自定义表头
         vuetable表格动态添加行、删除行、添加列、删除列自定义表头; 增加一行、删除一行、添加一列、删除一列;每行带输入框input代码1、HTML部分:<template><divclass="app-container"><el-table:data="tableData"borderstyle="width:600px;margin-to......
  • DNF台服自定义apc斗蛐蛐归纳
    目录结构 action.ai#PVF_File[aipattern][think][void]`istargetinattackarea()`150.0150.0100.0100.0[true][think][void]`checkrandom()`30100......
  • 18-神经网络-自定义带参数的层
    1、nn.Parameter函数2、torch.mm和torch.matmul区别都是PyTorch中用于矩阵乘法的函数,但它们在使用上有细微的差别importtorchimporttorch.nnasnnimporttorch.nn.functionalasFclassMyLinear(nn.Module):def__init__(self,in_units,out_units):......
  • SpringBoot自定义校验
    通常情况,后端在业务层需要进行大量校验,写在业务层又不美观,而且需要重复编写,很是不方便,Spring提供的校验注解有时无法满足我们的需求,需要自定义校验规则,以校验手机号为例,下面开始自定义校验一、引入依赖引入Spring校验依赖包<dependency>  <groupId>org.springframework......
  • 【Material-UI】深入探讨Radio Group组件的自定义功能
    文章目录一、RadioGroup组件概述1.组件介绍2.自定义的重要性二、RadioGroup组件的自定义1.样式定制示例2.代码详解3.样式自定义的注意事项三、如何利用自定义功能提升用户体验1.提升视觉一致性2.增强可用性3.实现更灵活的布局四、总结Material-UI是R......
  • 使用Java导出MySQL数据:支持自定义分隔符的TXT文件生成
    在软件开发中,我们经常需要将数据库中的数据导出为文件,给关联系统做传输或者进行数据备份、迁移或分析。常见的导出格式包括CSV和TXT文件,分隔符可以是逗号、制表符或其他符号。本文将深入探讨如何使用Java从MySQL数据库中导出数据,并支持用户自定义分隔符来生成格式化的TXT文件。......
  • PyQt5 / PySide 2 + Pywin32 自定义标题栏窗口 + 还原 Windows 原生窗口边框特效(2)
    前言:已修复上一篇文章中提到的Bug,增加状态切换动画:PyQt5/PySide2+Pywin32自定义标题栏窗口+还原Windows原生窗口边框特效-CSDN博客https://blog.csdn.net/2402_84665876/article/details/141487635?spm=1001.2014.3001.5501仍然存在的问题:打开窗口时窗口标题栏......
  • elasticsearch整合自定义词库实现自定义分词
            在进行分词时es有时没有办法对人名或者其他新词、偏词进行精准的分词,这时候就需要我们进行自定义分词。前置:        1).安装完成ik分词器,安装流程可以参考:ik安装流程        2).自定义的远程库我们使用nginx,所以需要提前安装nginx1.进入到......
  • Superset BI封装自定义组件(堆叠柱状图)
    目录前言封装步骤一、创建组件文件夹二、预设组件信息三、使用组件往期回顾前言Superset是一个现代化的、易于使用的、轻量级的数据可视化工具,它允许用户通过简单的点击操作来创建和分享图表。如果你想在Superset中创建自定义组件,你可能需要进行一些扩展工作。......