본문 바로가기

프로그래밍

언리얼 엔진 5 (UE5)에서 월드 시간과 델타 시간 초 단위로 얻기 (C++ 및 블루프린트)

728x90
728x90

언리얼 엔진 5 (UE5) 게임 개발에서 시간 관리는 매우 중요합니다. 게임이 시작된 이후 경과된 시간이나 프레임 간 시간 간격인 델타 시간을 정확하게 얻는 것은 게임 로직, 애니메이션, 타이머 등 다양한 기능을 구현하는 데 필수적입니다. 이 글에서는 C++ 코드와 블루프린트를 사용하여 UE5에서 월드 시간과 델타 시간을 초 단위로 얻는 방법을 자세히 설명합니다.

1. 월드 시간 (World Time) 얻기

월드 시간은 게임이 시작된 이후 경과된 총 시간을 의미합니다. UE5에서는 UWorld::GetTimeSeconds() 함수를 사용하여 이 값을 초 단위로 얻을 수 있습니다.

1.1 C++ 코드

#include "Kismet/GameplayStatics.h"
#include "Engine/World.h"

UFUNCTION(BlueprintPure, Category = "Utilities")
static float GetWorldTimeSeconds(const UObject* WorldContextObject);

float GetWorldTimeSeconds(const UObject* WorldContextObject)
{
    if (!WorldContextObject)
    {
        UE_LOG(LogTemp, Warning, TEXT("GetWorldTimeSeconds: 유효하지 않은 WorldContextObject"));
        return -1.0f;
    }

    UWorld* World = WorldContextObject->GetWorld();
    if (!World)
    {
        UE_LOG(LogTemp, Warning, TEXT("GetWorldTimeSeconds: 컨텍스트에서 월드를 가져올 수 없음"));
        return -1.0f;
    }

    return World->GetTimeSeconds();
}
  • #include: 필요한 헤더 파일을 포함합니다.
  • UFUNCTION(BlueprintPure, Category = "Utilities"): 블루프린트에서 함수를 사용할 수 있도록 설정합니다.
  • WorldContextObject: 함수를 호출하는 컨텍스트를 제공합니다.
  • 오류 처리: WorldContextObject와 World의 유효성을 검사하여 안정성을 확보합니다.
  • World->GetTimeSeconds(): 핵심 함수로, 게임 시작 이후 경과 시간을 초 단위의 float 값으로 반환합니다.

1.2 블루프린트 사용법

  1. 해당 함수가 구현된 액터 또는 오브젝트의 블루프린트 그래프를 엽니다.
  2. 노드를 드래그하여 "Get World Time Seconds"를 검색합니다.
  3. 출력 핀을 연결하여 원하는 작업을 수행합니다.

2. 델타 시간 (Delta Time) 얻기

델타 시간은 이전 프레임이 렌더링된 이후 경과된 시간을 의미합니다. 이는 프레임 속도 변동에 따른 게임 속도 차이를 보정하는 데 필수적입니다. UE5에서는 UWorld::GetDeltaSeconds() 함수를 사용하여 델타 시간을 초 단위로 얻을 수 있습니다.

2.1 C++ 코드

C++
 
#include "Kismet/GameplayStatics.h"
#include "Engine/World.h"

UFUNCTION(BlueprintPure, Category = "Utilities")
static float GetWorldDeltaSeconds(const UObject* WorldContextObject);

float GetWorldDeltaSeconds(const UObject* WorldContextObject)
{
    if (!WorldContextObject)
    {
        UE_LOG(LogTemp, Warning, TEXT("GetWorldDeltaSeconds: 유효하지 않은 WorldContextObject"));
        return -1.0f;
    }

    UWorld* World = WorldContextObject->GetWorld();
    if (!World)
    {
        UE_LOG(LogTemp, Warning, TEXT("GetWorldDeltaSeconds: 컨텍스트에서 월드를 가져올 수 없음"));
        return -1.0f;
    }

    return World->GetDeltaSeconds();
}

코드 구조는 월드 시간과 거의 동일하며, World->GetDeltaSeconds() 함수를 사용하여 델타 시간을 얻는다는 점만 다릅니다.

2.2 블루프린트 사용법

  1. 월드 시간과 마찬가지로 해당 함수가 구현된 액터 또는 오브젝트의 블루프린트 그래프를 엽니다.
  2. 노드를 드래그하여 "Get World Delta Seconds"를 검색합니다.
  3. 출력 핀을 연결하여 원하는 작업을 수행합니다.

3. C++ 코드 사용 예시

C++
 
float CurrentTime = UYourClass::GetWorldTimeSeconds(this);
float DeltaTime = UYourClass::GetWorldDeltaSeconds(this);

if (CurrentTime != -1.0f)
{
    UE_LOG(LogTemp, Warning, TEXT("현재 월드 시간 (초): %f"), CurrentTime);
}

if (DeltaTime != -1.0f)
{
    UE_LOG(LogTemp, Warning, TEXT("델타 시간 (초): %f"), DeltaTime);

    // 델타 시간을 이용한 이동 예시 (프레임 속도에 독립적)
    FVector NewLocation = GetActorLocation() + (GetActorForwardVector() * 100.0f * DeltaTime);
    SetActorLocation(NewLocation);
}

위 예시는 델타 시간을 사용하여 액터를 이동시키는 방법을 보여줍니다. 이렇게 하면 프레임 속도가 변하더라도 이동 속도가 일정하게 유지됩니다.

4. 추가 정보

  • 시간 팽창 (Time Dilation): GetTimeSeconds()와 GetDeltaSeconds()는 모두 시간 팽창의 영향을 받습니다.
  • 정밀도: float 형식을 사용하므로 약간의 정밀도 손실이 발생할 수 있습니다.
  • FDateTime: 특정 시점을 기록하려면 FDateTime 구조체를 사용하는 것이 더 적합할 수 있습니다.
728x90
반응형