-
[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의 영향을 받는 기능이 있을 경우 주의해야 합니다.
감사합니다.
'Unreal Engine 5._' 카테고리의 다른 글
[Unreal Engine] C++ Code encoding (0) 2023.05.16 [Unreal Engine] Line trace (0) 2023.04.28 [Unreal Engine] SetTimer() : Passing parameters (0) 2023.02.24 [Unreal Engine] IsA : Object type check in C++ (0) 2023.02.17 [Unreal Engine] UFUNCTION override (BlueprintNativeEvent) (0) 2023.02.07