[언리얼 엔진] 게임 플레이 타이머
- ⭐ Game Programming/Unreal Document
- 2021. 11. 9.
게임 플레이 타이머
설정된 주기마다 동작을 수행하는 타이머 구조체
타이머를 통해 딜레이 이후 또는 일정 시간에 걸쳐 동작을 수행하도록 스케쥴을 잡을 수 있다.
타이머 관리
타이머는 글로벌 TimerManager 에서 관리한다. 글로벌 타이머 매니저는 GameInstance 오브젝트와 각 World에 존재한다. 타임 매니저와 함께 타이머를 셋업하는데 사용되는 주 함수는 SetTimer와 SetTimerForNextTick 이 있다. 자세한 내용은 TimerManagerAPI Page 참조
- 타이머를 호출한 Actor같은 오브젝트가 시간이 다 되기전 소멸되면 타이머는 자동으로 취소된다.
타이머 매니저 접근은 AActor 함수의 GetWorldTimerManager를 통해 이루어진다. UWorld의 GetTimerManager 함수까지 호출한다. 글로벌 타이머 매니저에 접근하려면 UGameInstance 함수 GetTimerManager를 사용한다. 특정월드에 관계나 종속없이 사용할때 사용한다.
타이머 설정 및 해제
FTimerManager의 SetTimer 함수는 딜레이 후 함수나 델리게이트를 호출하는 타이머를 설정한다. 이 함수는 TimerHandle을 채우고 카운트다운, 일시정지, 남은시간 확인 및 변경, 취소하는데 사용 가능하다.
SetTimerForNextTick을 사용하면 다음 프레임에 실행되도록 설정할 수 있다. 타이머 핸들을 채우지 않는다.
타이머 해제를 위해서는 FTimerManager의 ClearTimer 함수를 호출하면 된다.
void AMyActor::BeginPlay()
{
Super::BeginPlay();
// RepeatingFunction 을 초당 1 회, 지금부터 2 초간 호출합니다.
GetWorldTimerManager().SetTimer(MemberTimerHandle, this, &AMyActor::RepeatingFunction, 1.0f, true, 2.0f);
}
void AMyActor::RepeatingFunction()
{
// 이 함수를 충분히 호출했으면, 타이머를 해제합니다.
if (--RepeatingCallsRemaining <= 0)
{
GetWorldTimerManager().ClearTimer(MemberTimerHandle);
// MemberTimerHandle 은 이제 다른 타이머에 재사용 가능합니다.
}
// 여기서 어떤 작업을 합니다...
}
타이머 일시정지 및 재개
FTimerManager 함수 PauseTimer는 타이머 핸들을 사용하여 실행중인 타이머를 일시정지하고 UnPauseTimer 로 재개 할 수 있다.
타이머 정보
타이머 매니저는 특정 타이머의 속도, 경과시간, 남은시간 등의 정보를 제공해 준다.
Is Timer Active
FtimerManager의 IsTimerActive 함수는 지정된 타이머가 현재 활성화되어 있고 일시정지 되지 않았는지 확인하는 데 사용한다.
// 이 무기가 다시 발사할 수 있는 대기 상태인가?
GetWorldTimerManager().IsTimerActive(this, &AUTWeapon::RefireCheckTimer);
타이머 속도
FTimerManager에는 GetTimerRate를 통해 현재 속도를 구한다. 타이머 핸들이 유효하지 않은 경우 -1을 반환한다.
// 이 무기는 워밍업되면서 발사 속도가 변합니다. 현재 발사 대기중인지, 그렇다면 현재 발사 중간 딜레이는 얼마나 되는지?
GetWorldTimerManager().GetTimerRate(this, &AUTWeapon::RefireCheckTimer);
경과 및 남은 시간
FTimerManager에는 GetTimerElapsed은 제공된 타이머 핸들에 연관된 타이머 경과 시간을, GetTimerRemaining은 남은시간을 반환한다. GetTimerRate와 마찬가지로 타이머 핸들이 유효하지 않은 경우 -1을 반환한다.
// 이 무기가 다시 발사 준비 상태가 되려면 얼마나 있어야 하는지? -1 이 반환되면, 준비 완료.
GetWorldTimerManager().GetTimerElapsed(this, &AUTWeapon::RefireCheckTimer);