공부/언리얼 엔진

언리얼 엔진 공부 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;
	}

 

이에 맞춰 논리로직을 변경해 준다

 

이동할 방향의 법선벡터를 가져온 뒤, 그 법선 벡터에 이동 위치를 곱하여 이동해야 하는 위치로 지정해준다

 

이때 조건을 달성하면 위치를 목표점으로 다시 초기화 하기에 위치를 벗어나지 않게 된다

 

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