ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Unreal Engine] Control game speed (Time Dilation)
    Unreal Engine 5._ 2023. 4. 6. 07:48

    게임의 속도를 조절하는 방법을 알아보도록 하겠습니다.

     


     

    1. AWorldSettings

     

    더보기

    첫 번째 방법은 AWorldSettings에 구현된 함수를 이용하는 것 입니다.

     

    간단하게, 다음과 같은 구현을 사용할 수 있습니다.

    GetWorld()->GetWorldSettings()->SetTimeDilation({float variable});

    위 코드는 UWorld에서 AWorldSetting을 가져와서 SetTimeDilation을 호출하는 코드입니다.

    위와 같은 코드의 결과로, 레벨의 속도가 인자로 전달한 variable배속이 됩니다.

    1.0일 경우 1배속 (정상 속도), 2.0일 경우 2배속이 되는 방식입니다.

     

    현재 게임의 속도를 확인하는 방법은 아래와 같습니다.

    GetWorld()->GetWorldSettings()->TimeDilation;

    AWorldSettings의 TimeDilation변수는 게임의 속도를 나타냅니다.

    해당 변수는 public이므로, Getter없이 접근이 가능합니다.

     

    2. UGamePlayStatics

     

    더보기

    두 번째 방법은 UGamePlayStatics객체를 이용하는 것 입니다.

     

    간단하게, 다음과 같은 구현을 사용할 수 있습니다.

    #include <Kismet/GameplayStatics.h>
    
    UGameplayStatics::SetGlobalTimeDilation(GetWorld(), {float variable});

    이 또한 문단 1의 예제와 동일하게, 게임의 배속을 variable로 설정합니다.

     

    현재 게임의 속도를 확인하는 방법은 아래와 같습니다.

    UGameplayStatics::GetGlobalTimeDilation(GetWorld());

     

    위 두 함수는 내부적으로 AWorldSettings에 있는 함수와 변수를 이용합니다.

    상황에 맞게 적절한 함수를 사용해주세요.

     

    3. Custom Time Dilation

     

    더보기

    위 문단들에 있는 함수들은 게임 전체의 속도를 조절합니다.

    그런데 게임의 명세에 따라, 특정 액터의 시간을 독립적으로 조절해야 하는 경우가 있을 수 있습니다.

     

    이러한 기능은 CustomTimeDilation을 조작하는 것으로 구현이 가능합니다.

    다음은 Actor.h의, CustomTimeDilation변수에 대한 코드입니다.

    /** Allow each actor to run at a different time speed. The DeltaTime for a frame is multiplied by the global TimeDilation (in WorldSettings) and this CustomTimeDilation for this actor's tick.  */
    UPROPERTY(BlueprintReadWrite, AdvancedDisplay, Category=Actor)
    float CustomTimeDilation;
     Allow each actor to run at a different time speed.
    (각각의 액터가 다른 속도로 동작하는 것을 허용합니다.)
    The DeltaTime for a frame is multiplied by the global TimeDilation (in WorldSettings) and this CustomTimeDilation for this actor's tick.
    (DeltaTime은 WorldSettings의 GlobalTimeDilation과 CustomTimeDilation의 곱이 됩니다.)

    주석의 설명을 읽기 편하게 옮겨보았습니다.

     

    위 설명에 따라, 액터를 게임의 속도와 무관하게 1배속으로 동작하도록 하려면 아래와 같은 구현을 사용할 수 있습니다.

    {Actor}->CustomTimeDilation = 1 / UGameplayStatics::GetGlobalTimeDilation(GetWorld());

    위 코드가 실행되면 지정한 Actor인스턴스는 게임의 속도와 무관하게 1배속으로 작동합니다.

    일시정지를 별도의 Pause기능을 사용하지 않고, GlobalTimeDilation을 0으로 설정하여 구현했더라도, Divid by 0 예외가 발생하지 않습니다.

     


     

    3번 문단의 주석에도 나와있듯이, 게임의 속도 조절은 Tick과 연관이 매우 깊습니다.

    Tick의 DeltaTime을 변화시키는 것으로 게임의 속도를 조절하는 것이니, 속도와 독립적이며 DeltaTime의 영향을 받는 기능이 있을 경우 주의해야 합니다.

     

    감사합니다.

    댓글

Designed by Tistory.