Unity에서 Time.deltaTime을 사용하듯이 언리얼에서도 DeltaTime을 이용하여 각 프레임이 실행되는데 시간이 얼마나 걸리는지 알 수 있다.
//플랫폼의 위치를 앞뒤로 움직인다
//Move platform forwards
//Get current location
FVector CurrentLocation = GetActorLocation();
//Add vector to that location
CurrentLocation = CurrentLocation + PlatformVelocity * DeltaTime;
//Set the location
SetActorLocation(CurrentLocation);
//Send platform back if gone to far
//Check how far we've moved
//Reverse direction of motion if gone too far
게임이 시작되고 플랫폼이 얼마나 이동했는지를 구해보자.
1. 시작 위치를 알아낸다
//플랫폼이 움직이기 시작한 위치를 저장하는 변수 선언
FVector StartLocation;
//플레이가 시작할 때, 호출되는 이벤트에서 액터의 현재 위치를 가져온다
void AMovingPlatform::BeginPlay()
{
Super::BeginPlay();
StartLocation = GetActorLocation();
}
//더블 콜론 연산자를 통해 FVector 클래스 안의 내부 함수를 가져온다
//시작 위치와 현재 위치를 넘겨 두 벡터 사이의 거리를 구한다
FVector::Distance(StartLocation, CurrentLocation);
//에디터에서 업데이트되는 값을 확인하기 위해 -1로 초기화
UPROPERTY(VisibleAnywhere)
float DistanceMoved = -1;
DistanceMoved = FVector::Distance(StartLocation, CurrentLocation);
플레이를 하고 초당 100씩 움직이는 것을 확인할 수 있다.
//플랫폼이 얼마나 멀리 이동한 다음 되돌아올지를 설정한다
UPROPERTY(EditAnywhere, Category="Moving Platform")
float MoveDistance =100;
//Reverse direction of motion if gone too far
if(DistanceMoved > MoveDistance){
//PlatformVelocity를 음수로 설정하여 반대 방향으로 이동하게 한다
PlatformVelocity = -PlatformVelocity;
//시작 위치를 업데이트
StartLocation = CurrentLocation;
}
플랫폼이 현재 방향으로 얼마나 이동했는지에 따라 시작 지점을 새 위치로 이동
if(DistanceMoved > MoveDistance)
{
//PlatformVelocity의 크기가 1인 벡터를 가져온다(현재 이동 방향을 얻는다)
FVector MoveDirection = PlatformVelocity.GetSafeNormal();
//시작 위치를 업데이트
//현재 위치에서 현재 방향으로 이동한 거리를 더하여 새로운 시작 위치를 계산
StartLocation = StartLocation + MoveDirection * MoveDistance;
SetActorLocation(StartLocation);
//PlatformVelocity를 음수로 설정하여 반대 방향으로 이동하게 한다
PlatformVelocity = -PlatformVelocity;
}
//액터의 Root Component의 회전을 반환
AActor::GetActorRotation();
void AMovingPlatform::RotatePlatform(float DeltaTime)
{
FRotator CurrentRotation = GetActorRotation();
}
//헤더파일에 플랫폼이 회전하는 속도를 구한 변수 선언
//기본값을 지정하지 않는 이유는 기본적으로 플랫폼이 회전하는 것을 방지하기 위함
UPROPERTY(EditAnywhere, Category="Rotation")
FRotator RotationVelocity;
void AMovingPlatform::RotatePlatform(float DeltaTime)
{
UE_LOG(LogTemp, Display, TEXT("%s Rotating.."), *GetName());
FRotator CurrentRotation = GetActorRotation();
//현재 회전값 + (속도 * 경과 시간)
CurrentRotation = CurrentRotation + RotationVelocity * DeltaTime;
//CurrentRotation에 Actor를 설정
SetActorRotation(CurrentRotation);
}
SetActorRotation()
: 해당 Actor의 회전값을 세팅
void AMovingPlatform::RotatePlatform(float DeltaTime)
{
UE_LOG(LogTemp, Display, TEXT("%s Rotating.."), *GetName());
FRotator CurrentRotation = GetActorRotation();
//현재 회전값 + (속도 * 경과 시간)
//CurrentRotation = CurrentRotation + RotationVelocity * DeltaTime;
//CurrentRotation에 Actor를 설정
//SetActorRotation(CurrentRotation);
//로컬 회전에 시간에 따른 회전 속도를 더함
//RotationVelocity * DeltaTime : 회전이 적용될 양
//ex. RotationVelocity가 (0, 90, 0)이면 액터가 로컬 y출을 중심으로 90도 회전
AddActorLocalRotation(RotationVelocity * DeltaTime);
}
AddActorLocalRotation(Y,Z,X)
액터를 인수만큼 추가로 회전 시킨다.
FRotator를 인수로 넘김다
AddActorLocalRotation(FRotator(0.0f, RotateSpeed * DeltaTime, 0.0f)); // Z 축으로 30도 * 프레임당 시간 만큼 회전