공부/언리얼 엔진
언리얼 엔진 공부 33 - 멤버 함수 사용(Using Member Function)
라이티아
2025. 8. 4. 14:05
#include "MovingPlatform.h"
// Sets default values
AMovingPlatform::AMovingPlatform()
{
// 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;
}
// Called when the game starts or when spawned
void AMovingPlatform::BeginPlay()
{
Super::BeginPlay();
StartLocation = GetActorLocation();
}
// Called every frame
void AMovingPlatform::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
FVector CurrentLocation = GetActorLocation();
CurrentLocation += PlatformVelocity * DeltaTime;
SetActorLocation(CurrentLocation);
float DistanceMoved = FVector::Dist(StartLocation, CurrentLocation);
if (DistanceMoved > MoveDistance)
{
PlatformVelocity *= -1;
StartLocation = CurrentLocation;
}
}
현재 조건, 즉
DistanceMoved > MoveDistance
로는 완벽하게 위치를 지정할 수 없다
왜냐하면
DistanceMoved
가 조금 더 가야지만 조건을 일치하고, 이때 frame단위로 보면 약간의 오차가 생긴다
이를 해결 하기 위해서 시작 위치에서 얼마나 이동 해야 하는지를 정확하게 사용해야 한다
FVector MovedDirection = PlatformVelocity.GetSafeNormal();
이때 FVector의 멤버 함수를 호출해서 사용한다
보통 멤버 변수를 .연산으로 가져오듯 = A.X or A.Y etc...
함수도 이와 같이 호출하며, 이때 호출되는 주체는 FVector같은 class이다. class내부의 함수를 호출하게 되는 것임.
if (DistanceMoved > MoveDistance)
{
FVector MovedDirection = PlatformVelocity.GetSafeNormal();
StartLocation = StartLocation + MovedDirection * MoveDistance;
SetActorLocation(StartLocation);
PlatformVelocity *= -1;
}
이에 맞춰 논리로직을 변경해 준다
이동할 방향의 법선벡터를 가져온 뒤, 그 법선 벡터에 이동 위치를 곱하여 이동해야 하는 위치로 지정해준다
이때 조건을 달성하면 위치를 목표점으로 다시 초기화 하기에 위치를 벗어나지 않게 된다

일정한 위치에서만 이동하는 플렛폼을 확인할 수 있다