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 블루프린트 사용법
- 해당 함수가 구현된 액터 또는 오브젝트의 블루프린트 그래프를 엽니다.
- 노드를 드래그하여 "Get World Time Seconds"를 검색합니다.
- 출력 핀을 연결하여 원하는 작업을 수행합니다.
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 블루프린트 사용법
- 월드 시간과 마찬가지로 해당 함수가 구현된 액터 또는 오브젝트의 블루프린트 그래프를 엽니다.
- 노드를 드래그하여 "Get World Delta Seconds"를 검색합니다.
- 출력 핀을 연결하여 원하는 작업을 수행합니다.
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
반응형