속도와 DeltaTime

Jihyun·2023년 12월 6일
0

Unreal

목록 보기
3/11

용어정리

  • 범위 지정 연산자 : 더블 콜론 연산자(::), 클래스의 인스턴스 내부를 볼 수 있게 해준다

DeltaTime

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();
	
}
  1. 시작 위치와 움직인 위치의 거리를 구한다
//더블 콜론 연산자를 통해 FVector 클래스 안의 내부 함수를 가져온다
//시작 위치와 현재 위치를 넘겨 두 벡터 사이의 거리를 구한다
	FVector::Distance(StartLocation, CurrentLocation);
  1. 플랫폼의 움직인 거리를 에디터에서 확인하고 싶다면?
//에디터에서 업데이트되는 값을 확인하기 위해 -1로 초기화
	UPROPERTY(VisibleAnywhere)
	float DistanceMoved = -1;
    DistanceMoved = FVector::Distance(StartLocation, CurrentLocation);


플레이를 하고 초당 100씩 움직이는 것을 확인할 수 있다.

  1. 일정 거리를 벗어나면 다시 뒤로 움직이도록 한다
//플랫폼이 얼마나 멀리 이동한 다음 되돌아올지를 설정한다
	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;
	}

회전하는 플랫폼

FRotator를 로컬 변수에 저장

//액터의 Root Component의 회전을 반환
AActor::GetActorRotation();

void AMovingPlatform::RotatePlatform(float DeltaTime)
{	
	FRotator CurrentRotation = GetActorRotation();
}

회전하는 플랫폼 만들기

  1. 회전 속도 구하기
//헤더파일에 플랫폼이 회전하는 속도를 구한 변수 선언
//기본값을 지정하지 않는 이유는 기본적으로 플랫폼이 회전하는 것을 방지하기 위함
	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의 회전값을 세팅

  1. 액터 회전 시키기
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도 * 프레임당 시간 만큼 회전
  1. CPP 클래스를 베이스로 하는 블루프린트 생성
    회전을 적용할 플랫폼의 메시를 다르게 적용
    회전만 하기 위해서 Platform Velocity와 Moving Distance를 전부 0으로 설정

profile
잊어버려도 다시 리마인드 할 수 있도록 공부한 것을 기록합니다

0개의 댓글