浮动飞盘

基础内容

Posted by AIaimuti on April 29, 2020

今天要实现的功能是一个飞盘的浮动,这个关卡在游戏中很常见,也很有意思。

浮动飞盘

功能需求: 制作一些飞盘,飞盘可以移动,可以把玩家送到指定位置。

浮动飞盘准备

1).h文件加入配置 加入了用于放置飞盘静态网格体,飞盘起始点和结束点,计时器函数,以及切换方向的函数

UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
  UStaticMeshComponent *Mesh;
//起始点
UPROPERTY(EditAnywhere)
  FVector StartPoint;
//结束点
UPROPERTY(EditAnywhere, meta = (MakeEditWidget = "true"))
  FVector EndPoint;
//漂浮速度
UPROPERTY(EditAnywhere,BlueprintReadOnly)
  float InterpSpeed;
//漂浮(切换)时间
UPROPERTY(EditAnywhere, BlueprintReadOnly)
  float InterpTime;
//切换计时器
FTimerHandle InterpTimer;
//决定向上飘或者向下飘
bool blnterping;
//切换漂浮方向的函数
void ToggleInterping();

函数实现

初始化网格体和切换速度和时间

AFloatPlatform::AFloatPlatform()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

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

	InterpSpeed = 1;
	InterpTime = 5;
}

设置状态转换函数 获取飞盘本身的绝对位置,相对于物体本身的绝对位置设置飞盘的初始位置和结束位置,并设置循环计数器。

void AFloatPlatform::ToggleInterping()
{
	//状态转换
	blnterping = !blnterping;
}

// Called when the game starts or when spawned
void AFloatPlatform::BeginPlay()
{
	Super::BeginPlay();

	//获取飞盘初始位置
	//用户编辑时是相对于物体本身的绝对位置,有利于位置调整
	StartPoint = GetActorLocation();
	//先让初始位置等于结束位置
	EndPoint += StartPoint;

	blnterping = true;
	//获取并设置计时器,InterpTimer是计时器,ToggleInterping是调用的函数,InterpTime是计时时间,
	//true开启是循环,每过InterpTime时间,调用ToggleInterping函数
  
	GetWorldTimerManager().SetTimer(InterpTimer, this, &AFloatPlatform::ToggleInterping, InterpTime, true);
	
}

每帧中调用的函数,根据blnterping的状态不同,计算每帧移动的距离,对飞盘进行移动

void AFloatPlatform::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
	//获取飞盘初始位置
	FVector CurrentLocation = GetActorLocation();
	FVector TargetLocation;

	if (blnterping)
	{
		//计算速度为InterpSpeed情况下,每帧向结束点运动的距离
		TargetLocation = FMath::VInterpTo(CurrentLocation, EndPoint, DeltaTime, InterpSpeed);
	}
	else
	{	//计算速度为InterpSpeed情况下,每帧向起始点运动的距离
		TargetLocation = FMath::VInterpTo(CurrentLocation, StartPoint, DeltaTime, InterpSpeed);	
	}
	SetActorLocation(TargetLocation);
}