icon안동민 개발노트

시간 시스템과 주기 조정


 언리얼 엔진에서 동적 시간 시스템을 구현하는 것은 게임 세계에 생동감을 불어넣고 현실감 있는 환경을 만드는 데 중요한 요소입니다.

 이 가이드에서는 시간 시스템 구현부터 주야 주기 조정까지 상세히 살펴보겠습니다.

시간 흐름 메커니즘 구현

  1. 시간 관리 액터 생성
UCLASS()
class ATimeManager : public AActor
{
      GENERATED_BODY()
public:
      UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Time")
      float CurrentTime = 0.0f; // 0-24 범위
 
      UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Time")
      float TimeScale = 1.0f;
 
      UFUNCTION(BlueprintCallable, Category = "Time")
      void UpdateTime(float DeltaTime);
};
  1. 시간 업데이트 로직
void ATimeManager::UpdateTime(float DeltaTime)
{
      CurrentTime += (DeltaTime * TimeScale) / 86400.0f; // 86400 = 24시간을 초로 환산
      if (CurrentTime >= 24.0f)
         CurrentTime -= 24.0f;
}
  1. 블루프린트에서 시간 업데이트
Event Tick

Get Time Manager

Update Time (Delta Seconds)

태양/달 위치 제어

  1. 회전 시스템 구현
UFUNCTION(BlueprintCallable, Category = "Celestial")
FRotator CalculateSunRotation(float CurrentTime)
{
      float SunPitch = -((CurrentTime - 12.0f) / 24.0f) * 360.0f;
      return FRotator(SunPitch, 0.0f, 0.0f);
}
  1. 태양 디렉셔널 라이트 회전
Event Tick

Get Current Time

Calculate Sun Rotation

Set Sun Light Rotation
  1. 달 위치 설정 (태양 반대편)
Set Moon Light Rotation (Sun Rotation + (0, 180, 0))

시간에 따른 조명 및 환경 변화

  1. 색온도 및 강도 조정
Function UpdateLighting (CurrentTime):
- Lerp Sun Light Color (Day Color, Night Color, Time Factor)
- Lerp Sun Light Intensity (Day Intensity, Night Intensity, Time Factor)
- Update Sky Light
- Update Post Process Settings
  1. 포그 밀도 조정
Set Exponential Height Fog Parameters (Based on Current Time)
  1. 스카이 텍스처 변경
Function UpdateSkyTexture (CurrentTime):
- Select Appropriate Sky Texture
- Blend Between Day/Night Sky Textures

시간 기반 이벤트 트리거

  1. 이벤트 시스템 구현
USTRUCT(BlueprintType)
struct FTimeEvent
{
      GENERATED_BODY()
      UPROPERTY(EditAnywhere, BlueprintReadWrite)
      float EventTime;
      UPROPERTY(EditAnywhere, BlueprintReadWrite)
      FString EventName;
};
 
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Time Events")
TArray<FTimeEvent> TimeEvents;
  1. 이벤트 체크 및 트리거
Function CheckTimeEvents (CurrentTime):
- For Each TimeEvent in TimeEvents
   - If CurrentTime >= EventTime
      - Trigger Event (EventName)
      - Remove Event from Array

게임 내 시계 UI 구현

 1. 위젯 블루프린트 생성

  • 텍스트 블록 추가 (시간 표시용)
  • 프로그레스 바 추가 (주기 시각화용)

 2. 시간 포맷팅 함수

Function FormatTime (CurrentTime):
- Hours = Floor(CurrentTime)
- Minutes = Floor((CurrentTime - Hours) * 60)
- Return FString::Printf(TEXT("%02d:%02d"), Hours, Minutes)

 3. UI 업데이트

Event Tick

Get Current Time

Set Text (Formatted Time)
Set Progress Bar Percent (CurrentTime / 24.0)

시간 조작 기능

  1. 시간 스케일 조정
Function SetTimeScale (NewScale):
- Set Time Manager TimeScale (NewScale)
  1. 특정 시간으로 점프
Function SetTime (NewTime):
- Set Time Manager CurrentTime (NewTime)
- Update All Time-Dependent Systems

다양한 시간대별 시각적 효과

 1. 새벽 효과

  • 부드러운 조명, 푸른 색조
  • 증가하는 안개 밀도

 2. 정오 효과

  • 강한 직사광선, 높은 대비
  • 짧은 그림자

 3. 황혼 효과

  • 따뜻한 주황색 조명
  • 긴 그림자, 부드러운 조명

 4. 밤 효과

  • 어두운 환경, 달빛
  • 별이 빛나는 하늘

 구현 예시

Function ApplyTimeOfDayEffects (CurrentTime):
- Switch on Time Range:
  - Case Dawn: Apply Dawn Effects
  - Case Noon: Apply Noon Effects
  - Case Dusk: Apply Dusk Effects
  - Case Night: Apply Night Effects

성능 최적화

  1. 시간 업데이트 빈도 조절
Event Tick

Accumulate Delta Time

If Accumulated Time > Update Threshold:
   Update Time and Reset Accumulator

 2. LOD (Level of Detail) 시스템 활용

  • 원거리 객체의 시간 기반 효과 단순화

 3. 캐싱 및 보간

  • 주요 시간대의 설정을 미리 계산하고 캐시
  • 실시간으로 캐시된 값 사이를 보간

현실적 주야 주기 시뮬레이션 팁

 1. 위도에 따른 주기 조정

  • 극지방의 백야/극야 현상 구현

 2. 계절 변화 통합

  • 계절에 따른 낮/밤 길이 변화

 3. 천문학적 정확성

  • 실제 천체의 움직임 기반 시뮬레이션

시간 시스템이 게임에 미치는 영향

 1. 게임플레이 메커닉

  • 시간 기반 퀘스트 및 이벤트
  • 낮/밤에 따른 NPC 행동 변화
  • 시간에 따른 게임 난이도 조절

 2. 내러티브

  • 시간 흐름을 통한 스토리 진행
  • 특정 시간대에만 발생하는 이벤트

 3. 플레이어 경험

  • 몰입감 있는 게임 세계 구현
  • 다양한 시각적 경험 제공

 언리얼 엔진에서 동적 시간 시스템을 구현하는 것은 게임 세계에 깊이와 현실감을 더하는 강력한 도구입니다.

 시간 흐름 메커니즘, 태양/달 위치 제어, 환경 변화 등의 요소를 조합하여 생동감 있는 주야 주기를 만들 수 있습니다.

 시간 기반 이벤트 트리거 시스템은 게임플레이에 다양성을 더하고, 플레이어에게 시간의 흐름을 인지시키는 중요한 요소입니다.

 게임 내 시계 UI는 이러한 시간 시스템을 플레이어에게 직관적으로 전달하는 역할을 합니다.

 시간 조작 기능의 구현은 게임플레이에 새로운 차원을 더할 수 있습니다.

 플레이어가 시간을 조절할 수 있게 함으로써 전략적 요소를 추가하거나, 특정 시나리오를 위해 시간을 빠르게 진행시킬 수 있습니다.

 다양한 시간대별 시각적 효과 구현은 게임 세계의 분위기를 크게 향상시킵니다.

 각 시간대의 특징적인 조명과 환경 효과를 세밀하게 구현함으로써 플레이어에게 더욱 몰입감 있는 경험을 제공할 수 있습니다.

 성능 최적화는 시간 시스템 구현에 있어 중요한 고려사항입니다.

 업데이트 빈도 조절, LOD 시스템 활용, 캐싱 및 보간 기법 등을 통해 시스템의 효율성을 높일 수 있습니다.

 현실적인 주야 주기 시뮬레이션을 위해서는 위도, 계절 변화, 천문학적 정확성 등을 고려해야 합니다.

 이러한 세부적인 요소들이 게임 세계의 신뢰성과 몰입도를 높이는 데 기여합니다.

 시간 시스템은 게임플레이 메커닉, 내러티브, 플레이어 경험 등 게임의 여러 측면에 깊은 영향을 미칩니다.

 잘 설계된 시간 시스템은 단순한 시각적 요소를 넘어 게임의 핵심 메커니즘으로 작용할 수 있습니다.