【UE4/蓝图/C++】简易FPS武器视角随动效果

这篇具有很好参考价值的文章主要介绍了【UE4/蓝图/C++】简易FPS武器视角随动效果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、演示

【UE4/蓝图/C++】简易FPS武器视角随动效果

二、简要说明

主要是实现了一个简单的第一人称的手臂跟随相机反方向移动(也可改成同方向),用蓝图和C++分别实现了同样功能

一共需要一个继承自Character的类,类内有一个Camera组件,和一个挂载在Camera组件下的手臂网格体组件,称为Arm Mesh

一共创建了四个变量进行控制:

  • Init Arm Mesh Relative Location:在BeginPlay中初始化,负责记录手臂初始的相对位置
  • Arm Move Speed:手臂随摄像机移动的速度,默认是-0.1,负值意味着与相机移动的相反方向移动
  • Arm Move Range:手臂位移的最大半径范围,若超出此范围则会阻止继续远离的运动
  • Arm Return Speed:手臂的回中速度,在鼠标输入慢下来或者停止时,会自动回中

三、蓝图实现

1.准备

【UE4/蓝图/C++】简易FPS武器视角随动效果,UE,ue4,c++,游戏引擎

        首先在Character下创建Camera组件和Skeleton Mesh组件(此处已命名为Arm Mesh),相关美术资源和基础输入的配置此处忽略

        然后依次创建下列四个变量,其默认值分别为:

  •         Init Arm Mesh Relative Location        无需默认值
  •         Arm Move Speed        -0.1
  •         Arm Move Range        10
  •         Arm Return Speed        5

2.BeginPlay

【UE4/蓝图/C++】简易FPS武器视角随动效果,UE,ue4,c++,游戏引擎

在BeginPlay中对Init Arm Mesh Relative Location向量赋值,目的是在运行前在类中对其位置的修改都能够在游戏开始时被记录下来

3.Tick

【UE4/蓝图/C++】简易FPS武器视角随动效果,UE,ue4,c++,游戏引擎

Tick中大致由两部分构成,一边是跟随相机的偏移效果,一边是回中的效果

具体细节如下:

1.判断条件

【UE4/蓝图/C++】简易FPS武器视角随动效果,UE,ue4,c++,游戏引擎

LookTurn和LookUp分别是鼠标X轴和鼠标Y轴的轴值,当它们同时大致等于0的时候则会走入True分支(回中),否则走False分支(偏移)

2.回中

【UE4/蓝图/C++】简易FPS武器视角随动效果,UE,ue4,c++,游戏引擎

回中中首先进行了一次判断,若手臂当前的位置和其初始位置过于接近,则什么操作也不做

否则说明二者不接近,使用向量插值节点,从当前位置到初始位置进行插值,Interp Speed即我们的Arm Return Speed参数,最后将得到的值直接赋值给Arm Mesh的相对位置即可

3.偏移

【UE4/蓝图/C++】简易FPS武器视角随动效果,UE,ue4,c++,游戏引擎

偏移操作首先进行了一次判断,这个判断用OR连接,OR上第一个的意思是,首先用当前位置向量减去默认位置向量,得到的向量的长度是这二者的距离,再加上一个由鼠标输入轴值构建的向量,就可以预测得到移动后的位置,此向量的长度也就是预测的向量长度,其如果在允许的范围内,OR的第一个会变为true,就会直接根据鼠标输入加上Arm Move Speed的缩放执行添加相对位置。

如果在范围外,则会接着执行OR的第二个条件,将预测的距离与当前位置和默认位置的距离进行对比,若小于,则说明运动趋势是向初始位置移动的,故也运行添加相对位置。

自此功能完成。

四、C++实现

首先在继承的Character的头文件中创建相应的组件,再在构造函数中为其初始化

//.h

    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Component", meta = (AllowPrivateAccess = "true"))
	UCameraComponent* Camera;

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Component", meta = (AllowPrivateAccess = "true"))
	USkeletalMeshComponent* ArmMesh;

//.cpp
    Camera = CreateDefaultSubobject<UCameraComponent>("Camera");
	Camera->SetupAttachment(GetRootComponent());
	Camera->bUsePawnControlRotation = true;

	ArmMesh = CreateDefaultSubobject<USkeletalMeshComponent>("ArmMesh");
	ArmMesh->SetupAttachment(Camera);

初始化完成后,创建所需的在Tick中执行的函数和相关变量

    void ArmMeshServo(const float& DeltaTime); //手臂跟随视角转动进行随动的函数,在Tick函数中调用
	
	FVector InitArmMeshRelativeLocation; //在BeginPlay中初始化,负责记录ArmMesh的初始相对位置
	
	UPROPERTY(EditAnywhere, Category="Settings|ArmMeshServo")
	float ArmMoveSpeed = -0.1; //手臂随动速度,负值意味着将向与相机相反的方向移动

	UPROPERTY(EditAnywhere, Category="Settings|ArmMeshServo")
	float ArmMoveRange = 10; //手臂移动的最大范围

	UPROPERTY(EditAnywhere, Category="Settings|ArmMeshServo")
	float ArmReturnSpeed = 5; //手臂回中速度

函数实现:

//先在BeginPlay中对InitArmMeshRelativeLocation 进行初始化
void AFPSBaseCharacter::BeginPlay()
{
	Super::BeginPlay();

	InitArmMeshRelativeLocation = ArmMesh->GetRelativeLocation();
}


//手臂随动函数的实现
void AFPSBaseCharacter::ArmMeshServo(const float& DeltaTime)
{
	FVector CurrentRelativeLocation = ArmMesh->GetRelativeLocation(); //获取当前相对位置
	float XInput = GetInputAxisValue("LookTurn"); //获取鼠标X轴的输入轴值
	float YInput = GetInputAxisValue("LookUp"); //获取鼠标Y轴的输入轴值

	if (FMath::IsNearlyZero(XInput, 0.2f) && FMath::IsNearlyZero(YInput, 0.2f)) //若视角转动过慢或静止,则会进行回中
	{
		if ((CurrentRelativeLocation - InitArmMeshRelativeLocation).IsNearlyZero()) return; //若已接近默认位置,则返回
		FVector DeltaVector = UKismetMathLibrary::VInterpTo(CurrentRelativeLocation, InitArmMeshRelativeLocation, DeltaTime, ArmReturnSpeed); //通过插值函数获取所需差量
		ArmMesh->SetRelativeLocation(DeltaVector); //设置其相对位置
	}
	else
	{
		FVector NewRelativeLocation = CurrentRelativeLocation - InitArmMeshRelativeLocation + FVector(0, XInput * ArmMoveSpeed, YInput * ArmMoveSpeed); //计算新位置
		//检查新位置是否在允许的范围内,如不在,则检查新位置是否能比当前位置更靠近默认位置
		if (NewRelativeLocation.Size() <= ArmMoveRange || NewRelativeLocation.Size() < (CurrentRelativeLocation - InitArmMeshRelativeLocation).Size())
		{
			ArmMesh->AddRelativeLocation(FVector(0, XInput * ArmMoveSpeed, YInput * ArmMoveSpeed)); //在则添加相对位置
		}
	}
}

然后在Tick函数中调用

void AFPSBaseCharacter::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	ArmMeshServo(DeltaTime);
}

自此C++功能亦实现文章来源地址https://www.toymoban.com/news/detail-838889.html

到了这里,关于【UE4/蓝图/C++】简易FPS武器视角随动效果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【UE4】TimeLine(蓝图)

    虚幻中的数据时间轴计数器,作用是将时间和数据进行组合,使得数据随着时间的改变发生变化。 可以将TimeLine理解为一个直角坐标系,横轴为时间,纵轴为数据。 输入针脚: Play :启动此时间轴 Play from Start :从开始的时候启动此时间轴 Stop :结束 Reverse :反方向走时间轴

    2023年04月24日
    浏览(62)
  • 【UE4】物理引擎(蓝图)

    物理引擎通过为刚性物体赋予真实的物理属性的方式来计算 运动、旋转和碰撞反映。 游戏引擎中的物理引擎的主要目的是为了解决物体在空间的状态信息。 常规的物理引擎遵循物理定律,按照给定的算法,进行模拟物理运动。所以在没有多元因素影响的情况下,物理引擎的

    2023年04月11日
    浏览(63)
  • UE4武器绑定--将武器模型绑定到人物身上、

    !!!禁止转载!!! 适合人群:正在学习UE4引擎,有一定的UE4引擎经验,能看懂蓝图。 :骨骼插槽、蓝图、Actor 这只是简单的把武器绑定到人物身上的一种简单实现方法的原理,大家可以基于这个原理去实现武器的捡起丢弃等逻辑。如果有错误,欢迎批评指正。让

    2024年02月07日
    浏览(58)
  • 【UE4】流程控制节点(蓝图)

    找节点的方法:蓝图中右键-工具-流程控制 Sequence(序列,控制流程执行顺序) DoOnce(控制执行次数为一次,reset重置之后才能再执行) Do N(执行N次,N次执行完后,reset重置之后才能再执行,counter记录当前执 行的次数,可以用来做枪械的弹夹) Do once MultiInput(多个输入,

    2024年02月17日
    浏览(62)
  • UE4 蓝图通信:接口调用

    UE4学习心得:蓝图间信息通信的几种方法 UE4的接口调用技术有点简单粗暴,而且主要体现在主蓝图对子蓝图的信息通信。 在内容浏览器中添加一个蓝图接口,命名为TestInterface  双击打开接口,直接使用其创建时自带的一个接口函数,将其重命名为TestAddOffset (这里相当于接

    2024年02月11日
    浏览(48)
  • UE4使用蓝图材质改变颜色

    1.点击场景中的物体,找到他的材质,点击放大镜找到材质的位置并进入。 2.找到材质的父亲,并进入。  3.该变材质的颜色只要改变材质的Base Color就行。创建一个MaterialParameterCollection 添加一个vector paramter,并给它命名保存。  拖动它进入材质的父亲,点击它修改左边的par

    2024年02月12日
    浏览(58)
  • UE4蓝图导入导出csv

    表头 csv表格结构,第一列‘’行命名‘’为ue默认结构,需要自己添加,第二列及以后为自定义表头 选择第二步建的表,重新导入 输出行即为表中一行数据的每一列,在表头复杂时,有多个输出行; 主要是字符串的拼接操作 totalStr为总的需要导出的数据拼接字符串。需要默

    2024年02月16日
    浏览(68)
  • UE4蓝图节点不同颜色代表

    UE4蓝图节点不同颜色代表 参考文章介绍:https://michaeljcole.github.io/wiki.unrealengine.com/Blueprint_Fundamentals/ A green node is usually associated with Get[Something]. 绿色节点通常与Get【something】相关联 。有时候也与construct相关联。 A blue node is usually a function/event (see different icon used) node where you do

    2024年02月06日
    浏览(69)
  • UE4/UE5引擎 FPS游戏逆向工程

    课程详细目录 : UE引擎逆向 入门到精通 联系方式 :点击课程详细目录查看 简介: 🔥 本课程全部采用C++编程 🔓 对抗加解密逆向过程:我们将深入探讨如何对抗游戏的加密与解密机制 🕵️ 功能的寻找与实现:学完课程后,您将能够迅速定位并实现游戏内各种功能 学完本

    2024年02月02日
    浏览(44)
  • UE4蓝图基础04-变量和数组

    所谓变量,就是保存了各种值的“器皿”,它可以存放一个值或引用世界中的一个Object或Actor的属性。在编程中,会根据需要将各种计算的结果或部件的设定值等,拿来进行处理操作。为此,需要事先将必要的值保存在某个地方,这就是变量的作用。 变量也有类型之分,创建

    2024年02月06日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包