Tick함수를 이용하여 매 프레임마다 함수를 호출하는 것이 아닌 정해진 시간마다 함수를 호출하게 해준다.
void AActor::BeginPlay()
{
Super::BeginPlay();
FTimeHandle TimerHandle;
float Delay = 2.0f;
float FirstDelay = 3.0f;
GetWorld()->GetTimerManager().SetTimer(
TimerHandle, // FTimerHandle 변수
this, // 호출할 객체
&AActor::ExcuteFunction, // 호출할 멤버 함수
Delay, // 호출 간격 (초 단위)
true, // 반복 여부 (true / false)
FirstDelay // 최초 실행 전 딜레이(초)
);
}
이 코드를 실행하면 3초 후에 ExcuteFunction함수가 실행되고 이후 2초마다 ExcuteFunction함수가 반복적으로 실행된다.
void AActor::BeginPlay()
{
Super::BeginPlay();
FTimeHandle TimerHandle;
float Delay = 2.0f;
float FirstDelay = 3.0f;
GetWorld()->GetTimerManager().SetTimer(
TimerHandle,
this,
&AActor::ExcuteFunction,
FirstDelay,
false
);
}
만약 최초 실행 후 함수를 반복 실행하지 않고 종료시키고 싶다면 위와 같이 코드를 작성하면 된다.
액터를 이동 시키고 싶을 때 사용하는 함수다.
FVector NewMoveLocation = FVector(2.0f, 0.0f, 0.0f);
MyActor->AddActorWorldOffset(NewMoveLocation);
위의 코드는 MyActor 액터의 현재 위치에서 NewMoveLocation만큼 이동시킨다.
액터를 움직일 때 AddActorLocalTransform 함수를 사용했었는데 이렇게 하면 에디터 상에서 인스턴스의 트랜스폼 값을 수정해주었을 때 AddActorLocalTransform함수가 에디터에서 수정한 인스턴스의 트랜스폼 값을 무시하고 클래스의 트랜스폼을 그대로 가져와서 수정된 트랜스폼 값이 반영되지 않았다.
그래서 AddActorWorldOffset을 사용하여 액터를 움직였다.
FTimeHandle을 이용하면 Tick함수를 사용하지 않고도 특정 시간 마다 함수를 호출할 수 있어서 꽤나 유용한 것 같다.
Tick함수가 생각보다 프로그램의 부하를 과중시키기에 특정 시간 마다 함수를 작동시킬 때는 Tick함수가 아닌 FTimeHandle를 사용하면 좋을 것 같다.