최종 코드
FVector GlobalTargetLocation;
FVector GlobalStartLocation;
#include "MovingPlatforms.h"
AMovingPlatforms::AMovingPlatforms()
{
PrimaryActorTick.bCanEverTick = true;
SetMobility(EComponentMobility::Movable);
}
void AMovingPlatforms::BeginPlay()
{
Super::BeginPlay();
if (HasAuthority()) {
SetReplicates(true);
SetReplicateMovement(true);
}
GlobalStartLocation = GetActorLocation();
GlobalTargetLocation = GetTransform().TransformPosition(TargetLocation);
}
void AMovingPlatforms::Tick(float dt)
{
Super::Tick(dt);
if (HasAuthority()) {
FVector Location = GetActorLocation();
float journeyLength = (GlobalTargetLocation - GlobalStartLocation).Size();
float journeyTravelied = (Location - GlobalStartLocation).Size();
if (journeyTravelied >= journeyLength)
{
FVector Swap = GlobalStartLocation;
GlobalStartLocation = GlobalTargetLocation;
GlobalTargetLocation = Swap;
}
FVector Direction = (GlobalTargetLocation - GlobalStartLocation).GetSafeNormal();
Location += Speed * dt * Direction;
SetActorLocation(Location);
}
}
결과물
원리
- TargetLocation은 상대적인 위치로서 계속 변화한다. 따라서 월드 공간에서의 위치를 사용하여 두 위치를 반복하는 것이 필요하다.
- 그래서 GlobalStartLocation과 GlobalTargetLocation을 선언하여 두 위치를 반복하는 형태를 구현한다.
- 이동하고있는 현재 위치의 벡터와 처음위치에서 목표위치까지의 벡터 사이를 비교하며 Swap을 이용하여 목표와 처음위치를 바꾼다.