UE4 C++创建可以定时上升下降的平台——浮动平台

Posted Vincent_0000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4 C++创建可以定时上升下降的平台——浮动平台相关的知识,希望对你有一定的参考价值。

前言

本文章将会教你如何制作可以定时上升下降的平台——浮动平台。


创建C++文件

.h 文件

右击文件空白位置,创建C++文件,继承Actor类。

  • 声明静态网格体,上图所展示的平台就是他的实例。
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
		UStaticMeshComponent* Mesh;
  • 声明起始点
UPROPERTY(EditAnywhere)
	FVector StartPoint;
  • 声明终止点

是用户自定义的,是相对于起始点的变化量

UPROPERTY(EditAnywhere, meta = (MakeEditWidget = true)) 
	FVector EndPoint;

后面标签有一个meta,打开之后,你就会看到
显示出来,这个点出来,方便我们调试,(虽然在这个代码中没有体现他的优势。但是秉持着多学多益的想法,还是要和大家讲一下。)

  • 声明浮动速度
UPROPERTY(EditAnywhere, BlueprintReadOnly)
	float InterpSpeed;  // 浮动速度
  • 声明浮动时间
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	float InterpTime; // 浮动时间
  • 声明时间手柄

FTimerHandle InterpTimer; 记录某个物体的时间量。

  • 声明浮动状态
UPROPERTY(EditAnywhere)
bool bInterping; // 表示向上浮动还是向下浮动
  • 声明转换浮动方向函数 void ToggleInterping();

.cpp 文件

  • 构造函数

创建静态网格体实例,并且设置为根组件。

Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
RootComponent = Mesh;

初始化运动方向、速度、时间、起始点。

bInterping = true; // 刚开始的时候是为向上运动
InterpSpeed = 4;
InterpTime = 5;
StartPoint = FVector(0.f);
  • BeginPlay()

如果我们的实例中没有修改了我们的起始点(起始点向量等于零向量),我门就要自己获取起始点。(为啥要这么写后面会有讲。)
if (StartPoint == FVector(0.f)) StartPoint = GetActorLocation();
因为我们的终点只是一个向量差,所以的话,还要加上起始点的坐标。
EndPoint += StartPoint;

每InterpTime秒后调用一次ToggleInterping(方向转换函数),当前已经过去的多少时间信息保存在InterpTimer变量中。
GetWorldTimerManager().SetTimer(InterpTimer, this, &AFloatingPlatform::ToggleInterping, InterpTime, true);

  • Tick(float DeltaTime)

我们每一帧都要更新一下我们浮动平台的位置,这样才会有一个动态的效果,如何做呢?
先获取到他的位置,如果是方向是向上走的话,我们就要计算经过了DeltaTime的时间,之前记录的位置是CurrentLocation,要以InterpSpeed的速度走向EndPoint时的位置。方向向下同理。
然后把计算出来的位置更新。

FVector CurrentLocation = GetActorLocation();
FVector TargetLocation;

if (bInterping) TargetLocation = FMath::VInterpTo(CurrentLocation, EndPoint, DeltaTime, InterpSpeed);
else TargetLocation = FMath::VInterpTo(CurrentLocation, StartPoint, DeltaTime, InterpSpeed);

SetActorLocation(TargetLocation);
  • ToggleInterping()

这个函数的意思就是方向翻转,所以我们只需要对方向取非即可。
bInterping = !bInterping;

创建蓝图

右击我们刚刚创建的C++文件,创建以它为父类的蓝图,给他一个静态网格体的实例。
将该蓝图文件拖入世界中。

因为是浮动平台嘛,所以就会有一个传送的效果,要想实现两个浮动平台相接的话,两个的方向必须要是反向的,以我的项目为例,给大家说一下我是怎么确定值的。

  • 下面的这个平台

我给他设置的初始位置是 ( X = − 30.000000 , Y = − 700.000000 , Z = 135.000000 ) (X=-30.000000,Y=-700.000000,Z=135.000000) (X=30.000000,Y=700.000000,Z=135.000000)
修改了上升的向量。

  • 上面的那个平台

设置的初始位置是: ( X = 970.000000 , Y = − 700.000000 , Z = 1135.000000 ) (X=970.000000,Y=-700.000000,Z=1135.000000) (X=970.000000,Y=700.000000,Z=1135.000000)因为它是向下的,所以他们就相差了两个向量差,也就是1000,加个1000就好了。

然后把起始点计算好,取消勾选Interping。

好了,完成!赶紧运行看看效果吧!!

以上是关于UE4 C++创建可以定时上升下降的平台——浮动平台的主要内容,如果未能解决你的问题,请参考以下文章

UE4 定时器和事件分发机制(C++和蓝图)

RISC处理器设计------时序的设计

单片机学习 中断定时器优先级的一些理解

15 UE4蓝图:制作升降电梯

STM32 HAL库学习系列第7篇---定时器TIM 输入捕获功能

UE4 C++ Slate 初探: Editor UI 与 Game UI