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. 위젯 블루프린트 생성
  • 텍스트 블록 추가 (시간 표시용)
  • 프로그레스 바 추가 (주기 시각화용)
  1. 시간 포맷팅 함수
Function FormatTime (CurrentTime):
- Hours = Floor(CurrentTime)
- Minutes = Floor((CurrentTime - Hours) * 60)
- Return FString::Printf(TEXT("%02d:%02d"), Hours, Minutes)
  1. 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. 새벽 효과
  • 부드러운 조명, 푸른 색조
  • 증가하는 안개 밀도
  1. 정오 효과
  • 강한 직사광선, 높은 대비
  • 짧은 그림자
  1. 황혼 효과
  • 따뜻한 주황색 조명
  • 긴 그림자, 부드러운 조명
  1. 밤 효과
  • 어두운 환경, 달빛
  • 별이 빛나는 하늘

 구현 예시

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
  1. LOD (Level of Detail) 시스템 활용
  • 원거리 객체의 시간 기반 효과 단순화
  1. 캐싱 및 보간
  • 주요 시간대의 설정을 미리 계산하고 캐시
  • 실시간으로 캐시된 값 사이를 보간

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

  1. 위도에 따른 주기 조정
  • 극지방의 백야 / 극야 현상 구현
  1. 계절 변화 통합
  • 계절에 따른 낮/밤 길이 변화
  1. 천문학적 정확성
  • 실제 천체의 움직임 기반 시뮬레이션

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

  1. 게임플레이 메커닉
  • 시간 기반 퀘스트 및 이벤트
  • 낮/밤에 따른 NPC 행동 변화
  • 시간에 따른 게임 난이도 조절
  1. 내러티브
  • 시간 흐름을 통한 스토리 진행
  • 특정 시간대에만 발생하는 이벤트
  1. 플레이어 경험
  • 몰입감 있는 게임 세계 구현
  • 다양한 시각적 경험 제공

 언리얼 엔진에서 동적 시간 시스템을 구현하는 것은 게임 세계에 깊이와 현실감을 더하는 강력한 도구입니다. 시간 흐름 메커니즘, 태양/달 위치 제어, 환경 변화 등의 요소를 조합하여 생동감 있는 주야 주기를 만들 수 있습니다.

 시간 기반 이벤트 트리거 시스템은 게임플레이에 다양성을 더하고, 플레이어에게 시간의 흐름을 인지시키는 중요한 요소입니다. 게임 내 시계 UI는 이러한 시간 시스템을 플레이어에게 직관적으로 전달하는 역할을 합니다.

 시간 조작 기능의 구현은 게임플레이에 새로운 차원을 더할 수 있습니다. 플레이어가 시간을 조절할 수 있게 함으로써 전략적 요소를 추가하거나, 특정 시나리오를 위해 시간을 빠르게 진행시킬 수 있습니다.

 다양한 시간대별 시각적 효과 구현은 게임 세계의 분위기를 크게 향상시킵니다. 각 시간대의 특징적인 조명과 환경 효과를 세밀하게 구현함으로써 플레이어에게 더욱 몰입감 있는 경험을 제공할 수 있습니다.

 성능 최적화는 시간 시스템 구현에 있어 중요한 고려사항입니다. 업데이트 빈도 조절, LOD 시스템 활용, 캐싱 및 보간 기법 등을 통해 시스템의 효율성을 높일 수 있습니다.

 현실적인 주야 주기 시뮬레이션을 위해서는 위도, 계절 변화, 천문학적 정확성 등을 고려해야 합니다. 이러한 세부적인 요소들이 게임 세계의 신뢰성과 몰입도를 높이는 데 기여합니다.

 시간 시스템은 게임플레이 메커닉, 내러티브, 플레이어 경험 등 게임의 여러 측면에 깊은 영향을 미칩니다. 잘 설계된 시간 시스템은 단순한 시각적 요소를 넘어 게임의 핵심 메커니즘으로 작용할 수 있습니다.

 결론적으로, 언리얼 엔진에서의 시간 시스템 구현은 기술적 도전과 창의적 기회를 동시에 제공합니다. 게임의 장르, 스케일, 목표 등을 고려하여 적절한 복잡도와 정확도를 가진 시스템을 설계하는 것이 중요합니다. 이를 통해 플레이어에게 더욱 풍부하고 몰입감 있는 게임 경험을 제공할 수 있습니다.