게임플레이 타이머

설정된 주기마다 동작을 수행하는 타이머 구조체입니다.

Windows
MacOS
Linux
추가 참고

타이머를 통해 딜레이 이후 또는 일정 시간에 걸쳐 동작을 수행하도록 스케쥴을 잡습니다. 예를 들어, 플레이어가 어떤 아이템을 습득하면 10 초간 무적이 되었다가 원래대로 돌아가는 것입니다. 또는, 플레이어가 독가스로 가득찬 방에 있는 동안 매 초마다 대미지를 적용할 수도 있습니다. 이러한 효과 모두 타이머를 통해 이뤄낼 수 있습니다.

타이머 관리

타이머는 글로벌 (FTimerManager 유형인) Timer Manager (타이머 매니저)에서 관리합니다. 글로벌 타이머 매니저는 Game Instance (게임 인스턴스) 오브젝트와 각 World (월드)에 존재합니다. 타임 매니저와 함께 타이머를 셋업하는 데 사용되는 주 함수는 SetTimerSetTimerForNextTick 둘 있는데, 각각 오버로드가 다수 있습니다. 이들 각각은 어떤 유형의 오브젝트 또는 함수 델리게이트에도 붙일 수 있으며, 원한다면 일정 간격마다 SetTimer 가 반복되도록 만들 수 있습니다. 이 함수 관련 자세한 내용은 Timer Manager API page 를 참고하세요.

타이머를 호출한 Actor 와 같은 오브젝트가 시간이 다 되기 전 소멸되면 타이머는 자동 취소됩니다. 이 경우, Timer Handle 은 유효하지 않은 상태가 되어 함수가 호출되지 않습니다.

타이머 매니저 접근은 AActor 함수 GetWorldTimerManager 를 통해 이루어지는데, UWorldGetTimerManager 함수까지 호출합니다. 글로벌 타이머 매니저에 접근하려면, UGameInstance 함수 `GetTimerManager' 를 사용합니다. 월드에 어떤 이유든 자체 타이머 매니저가 없는 경우 예비로 사용되기도 하며, 특정 월드의 존재와 관계가 없거나 종속되지 않아야 하는 함수 호출에 사용할 수 있습니다.

타이머는 표준 C++ 함수 포인터, TFunction Objects, 델리게이트 와 함께 사용할 수 있습니다.

타이머 설정 및 해제

FTimerManagerSetTimer 함수는 딜레이 후 함수나 델리게이트를 호출하는 타이머를 설정하며, 그 함수 호출을 무한 반복하도록 설정할 수 있습니다. 이 함수는 (FTimerHandle 유형) Timer Handle 을 채우며, 이는 카운트다운 일시정지( 및 재개), 남은 시간 확인 및 변경, 심지어 타이머 자체를 취소하는데도 쓸 수 있습니다. 타이머에 호출되는 함수 내에서 타이머를 설정하는 것은, 함수를 호출하는 데 사용되었던 타이머 핸들 재사용이 포함되는 경우에도 안전합니다. 그렇게 사용되는 예 중 하나로 아직 스폰되지는 았았지만 곧 스폰될 예정인 다른 액터에 종속된 액터 초기화를 지연시키는 것입니다. 종속 액터의 초기화 함수에 일 초 정도 고정된 시간 이후 스스로를 호출하도록 타이머를 설정할 수도 있습니다. 다른 방법으로는, 초기화 함수를 루핑 타이머에 두고 성공하면 자체 해제(clear)시키는 방법도 있습니다.

타이머는 시간 간격이 아니라 다음 프레임에 실행되도록 설정할 수도 있습니다. SetTimerForNextTick 를 호출하면 되는데, 이 함수는 타이머 핸들을 채우지 않는다는 점 참고하시기 바랍니다.

타이머를 해제(clear)하려면, SetTimer 호출 도중 채워진 FTimerHandleClearTimer 라는 FTimerManager 함수에 전달하면 됩니다. 이 시점에서 타이머 핸들은 유효하지 않은 상태가 되며, 새로운 타이머 관리를 위해 재사용할 수 있습니다. 기존 타이머 핸들로 SetTimer 를 호출하면 그 타이머 핸들에 참조된 타이머를 해제하고 새로운 것으로 대체합니다.

마지막으로 특정 오브젝트에 연관된 모든 타이머는 ClearAllTimersForObject 를 호출하여 해제시킬 수 있습니다.

Example:

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 은 이제 다른 타이머에 재사용 가능합니다.
    }
    // 여기서 어떤 작업을 합니다...
}

SetTimer 를 0 이하의 속도로 호출하는 것은 ClearTimer 를 호출하는 것과 같습니다.

타이머 일시정지 및 재개

FTimerManager 함수 PauseTimer 는 타이머 핸들을 사용하여 실행중인 타이머를 일시정지합니다. 그러면 그 타이머는 함수 호출 실행이 막히지만, 경과 및 남은 시간은 그대로 유지됩니다. UnPauseTimer 는 일시정지된 타이머 실행을 재개합니다.

타이머 정보

타이머 관리에 더해 타이머 매니저는 특정 타이머의 속도, 경과 시간, 남은 시간 등의 정보 획득을 위한 함수를 제공해 주기도 합니다.

Is Timer Active

FTimerManagerIsTimerActive 함수는 지정된 타이머가 현재 활성화되어 있고 일시정지되지 않았는지 확인하는 데 사용합니다.

예:

// 이 무기가 다시 발사할 수 있는 대기 상태인가?
GetWorldTimerManager().IsTimerActive(this, &AUTWeapon::RefireCheckTimer);

타이머 속도

FTimerManager 에는 GetTimerRate 라는 함수가 있어 타이머 핸들에서 타이머의 현재 속도(활성화 빈도)를 구합니다. 타이머의 속도는 직접 변경할 수 없지만, SetTimer 를 호출하여 그 타이머 핸들을 해제하고 속도를 제외한 다른 부분이 같은 타이머를 새로 생성하면 됩니다. GetTimerRate 는 타이머 핸들이 유효하지 않은 경우 -1 값을 반환합니다.

예:

// 이 무기는 워밍업되면서 발사 속도가 변합니다. 현재 발사 대기중인지, 그렇다면 현재 발사 중간 딜레이는 얼마나 되는지?
GetWorldTimerManager().GetTimerRate(this, &AUTWeapon::RefireCheckTimer);

경과 및 남은 시간

FTimermanager 에 제공되는 함수 GetTimerElapsedGetTimerRemaining 은 각각, 제공된 타이머 핸들에 연관된 타이머의 경과 및 남은 시간을 반환합니다. GetTimerRate 와 마찬가지로 이 함수는 타이머 핸들이 유효하지 않은 상태인 경우 -1 을 반환합니다.

예:

// 이 무기가 다시 발사 준비 상태가 되려면 얼마나 있어야 하는지? -1 이 반환되면, 준비 완료.
GetWorldTimerManager().GetTimerElapsed(this, &AUTWeapon::RefireCheckTimer);

타이머의 경과 시간과 나머지 시간을 합하면 타이머 속도와 같습니다.

알려진 이슈

  • 현재 이 코드는 여러 스레드를 지원하지 않습니다. 게임 스레드 이외에서 접근하려는 경우 어서트가 발생됩니다.

Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼