[UE5 / C++] ⏱️ FTimer

Singery00·2024년 6월 8일
0

UE5 C++

목록 보기
16/20
post-thumbnail

개요

⏱️ Unreal의 FTimer를 C++로 사용해보자.

언리얼에서는 일정한 시간 주기를 가지고 반복 동작을 구현하기 위해 타이머라는 것이 있습니다.

타이머를 C++로 사용하는 방법을 알아 보겠습니다.

언리얼 공식 문서


본론


⏱️ FTimer

우선 C++로 타이머는 FTimerHandle 타입의 변수를 생성해야 합니다.

FTimerHandle MyTimer;

이렇게 생성한 타이머는 GetWorldTimeManager().SetTimer()로 사용할 수 있습니다.

SetTimer()를 먼저 살펴 보겠습니다.

FORCEINLINE void SetTimer(FTimerHandle& InOutHandle, UserClass* InObj, typename FTimerDelegate::TMethodPtr< UserClass > InTimerMethod, float InRate, bool InbLoop = false, float InFirstDelay = -1.f)

첫번째 인자에는 FTimerHandle이 들어 갑니다.
어떤 타이머를 사용할 지 정의해주는 겁니다.

두번째 인자는 타이머를 사용할 클래스입니다.

세번째 인자는 실행할 함수입니다. 이때 함수의 주소를 넣어야 합니다.

네번째 인자는 반복 주기로 5.0f를 넣으면 5초가 주기가 됩니다.

다섯번째 인자는 반복여부로 bool값을 넣습니다.

마지막 인자는 최초 실행 시 대기 시간입니다.


사용 예시

우선 큐브 액터를 하나 만들어서 isMove가 참일 때, 전방으로 이동하도록 만들었습니다.

// Called every frame
void AMyActor::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	MoveActor(DeltaTime);
}

void AMyActor::MoveActor(float DeltaTime)
{
	if (isMove)
	{
		FVector P0 = GetActorLocation();
		FVector P = P0 + GetActorForwardVector() * 20 * DeltaTime;

		SetActorLocation(P);
	}
}

이제 타이머를 사용해서 isMove를 변경하며 움직임을 조절해보겠습니다.

ChangeMove()

isMove를 반전해주는 간단한 함수를 만들었습니다.

void AMyActor::ChangeMove()
{
	isMove = !isMove;
}

Timer 사용

시작과 동시에 2초마다 isMove를 변경해주도록 작성했습니다.

void AMyActor::BeginPlay()
{
	Super::BeginPlay();

	FTimerHandle isMoveTimer;
	GetWorldTimerManager().SetTimer(isMoveTimer, this, &AMyActor::ChangeMove, 2, true);
}

그리고 컴파일 후 실행하면 큐브가 2초를 주기로 움직임과 정지를 반복합니다.

반복 종료

SetTimer의 Loop를 참으로 해두고 종료는 어떻게 하느냐?

이는 ClearTimer()을 사용하여 타이머를 종료할 수 있습니다.
아래와 같이 코드를 사용할 수 있습니다.

GetWorldTimerManager().ClearTimer(FTimerHandle);

멤버 변수로 사용

그 전에 중요한 것이 하나 있는데 FTimerHandle을 멤버 변수로 넣어야 합니다.

그렇지 않으면 지역변수로서 TimerHandle이 사라져 ClearTimer()를 사용해도 타이머가 멈추지 않습니다.

그래서 멤버 변수로 바꾸면서 동시에 StopMoving이라는 타이머를 하나 더 만들었습니다.

public:
	FTimerHandle isMoveTimer;
	FTimerHandle StopMoving;

FTimerDelegate와 람다

타이머에 실행될 함수를 람다를 사용해서 실행할 수도 있습니다.

FTimerDelegate로 변수를 만듭니다.

그리고 람다식을 통해 수행할 동작을 구현해주었습니다.

isMoveTimer를 Clear해주고 isMove를 거짓으로 하여 움직임을 멈추게 했습니다.

	FTimerDelegate ClearisMoveTimer;
	ClearisMoveTimer.BindLambda([this] {
		GetWorldTimerManager().ClearTimer(isMoveTimer);
		isMove = false;
		});

그리고 람다식을 사용할 경우 SetTimer() 인자식이 변하게 됩니다.

2번째 인자인 사용할 클래스를 넣지 않습니다.

아래와 같이 5초후 FTimerDelegate를 실행하도록 했습니다.

GetWorldTimerManager().SetTimer(StopMoving,ClearisMoveTimer,5.0f,false);

마무리

타이머 기능을 잘 응용해서 캐릭터의 피격 시 무적상태를 구현하거나,
독 지대안의 틱 데미지를 구현할 수 있습니다.

저의 경우 레이저를 발사하는 필살기를 구현했었습니다.
아래 링크에서 참고해주세요.

Stella Strike 필살기 구현 사항

profile
게임 개발자가 되어보자

0개의 댓글