I took a slightly different approach with a view to future expansions of more than two points for the platform to move between. Using a TArray to store the locations and when the locations have been reached increment an index to that array.
Also, I used IsNearlyZero() function from the FVector API to check whether the platform had arrived at its intended location. This could easily be changed to use the FVector length comparison.
MovingPlatform.h
...
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
private:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Properties, meta = (AllowPrivateAccess = "true"))
float Speed = 0.0f;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Properties, meta = (AllowPrivateAccess = "true", MakeEditWidget = "true"))
FVector TargetLocation;
bool MoveToPosition(FVector TargetLocation, float DeltaTime);
TArray<FVector> AimLocations;
int32 AimIndex;
};
MovingPlatfrom.cpp
...
// Called when the game starts or when spawned
void AMovingPlatform::BeginPlay()
{
Super::BeginPlay();
if (HasAuthority())
{
// Replicate this actor to the clients
SetReplicates(true);
SetReplicateMovement(true);
}
AimLocations.Add(GetActorLocation());
AimLocations.Add(GetTransform().TransformPosition(TargetLocation));
AimIndex = 1;
}
// Called every frame
void AMovingPlatform::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
if (HasAuthority()) // If Running on server
{
if (MoveToPosition(AimLocations[AimIndex], DeltaTime))
{
UE_LOG(LogTemp, Warning, TEXT("AimLocation achieved!"));
AimIndex++;
if (AimIndex >= AimLocations.Num())
{
AimIndex = 0;
}
}
}
}
bool AMovingPlatform::MoveToPosition(FVector Location, float DeltaTime)
{
FVector PlatformLocation = GetActorLocation();
if ((PlatformLocation - Location).IsNearlyZero(5.0f))
{
return true;
}
else
{
FVector DirectionOffset = (Location - PlatformLocation).GetSafeNormal() * Speed * DeltaTime;
SetActorLocation(PlatformLocation + DirectionOffset);
return false;
}
}