안동민 개발노트

본문 시작

시간 시스템과 주기 조정

Directional Light 회전과 Sky Light·노출을 연동해 낮과 밤의 주기를 만들고 시간 속도와 갱신 비용을 조정합니다.

비를 내리거나 구름을 바꾸는 단계까지 왔다면, 이제 레벨에 시간의 흐름을 넣어야 할 시점입니다.

플레이어가 같은 장소에 오래 머물 때 하늘 색, 그림자 길이, 광원 강도가 자연스럽게 변해야 세계가 살아 있다고 느끼게 됩니다.

이번 절에서는 시간 시스템(Time of Day System)을 중심으로 낮/밤 주기를 안정적으로 운영하는 방법을 다룹니다.

Directional Light 회전, Sky Light 실시간 캡처, 후처리 노출 조정을 한 흐름으로 묶어 실제 프로젝트에서 바로 쓸 수 있게 정리하겠습니다.

이 설정을 마치면 레벨은 고정된 배경이 아니라, 시간에 따라 성격이 바뀌는 동적인 공간으로 바뀝니다.


시간 시스템의 중요성

시간 시스템은 단순히 배경 효과를 넘어, 게임 플레이와 레벨의 전반적인 경험에 깊은 영향을 미칩니다.

  • 극적인 분위기 변화: 밝고 활기찬 낮, 로맨틱하거나 음산한 저녁노을, 어둡고 긴장감 넘치는 밤 등 시간의 흐름에 따라 레벨의 분위기가 시시각각 변합니다.
  • 조명 및 그림자 변화: 태양의 위치가 변함에 따라 빛의 방향, 그림자의 길이와 선명도가 실시간으로 변화하여 극도의 사실감을 제공합니다.
  • 시야 제한 및 전략적 요소: 밤에는 시야가 제한되어 플레이어에게 새로운 도전 과제를 제시하거나 은신, 잠입 플레이를 유도할 수 있습니다.
  • 게임 플레이 상호작용: 특정 시간에만 활성화되는 이벤트, NPC의 행동 변화, 몬스터의 등장 등 시간과 연동된 게임 플레이 요소를 구현할 수 있습니다.
  • 몰입감 증대: 현실 세계의 자연스러운 흐름을 반영하여 플레이어가 게임 세계에 더욱 깊이 몰입하도록 돕습니다.

시간 시스템 구현의 핵심 요소

언리얼 엔진에서 시간 시스템을 구현하기 위해 주로 사용되는 기본적인 액터들과 개념은 다음과 같습니다.

Directional Light

  • 역할: 태양(낮)과 달(밤)의 역할을 합니다. 시간 시스템의 핵심이며, 이 액터의 회전은 빛의 방향을, Intensity는 광량을 정합니다. 표면에 도달하는 조명은 입사각의 영향도 받습니다.
  • 주요 설정 (디테일 패널)
    • Mobility: 낮/밤 주기와 같이 실시간으로 움직여야 하므로 반드시 Movable로 설정해야 합니다. Stationary는 런타임 이동·회전을 허용하는 선택이 아닙니다.
    • Rotation (회전): 특히 Pitch (Y축 회전) 값이 태양/달의 고도(높이)를 결정하고, Yaw (Z축 회전) 값이 태양/달의 동서남북 위치를 결정합니다.
    • Intensity: 빛의 밝기. 낮에는 높게, 밤에는 낮게 조절해야 합니다.
    • Light Color: 빛의 색상. 낮에는 흰색/노란색 계열, 해질녘에는 주황색/붉은색, 밤에는 푸른색 계열로 조절하여 분위기를 연출합니다.

Sky Light

  • 역할: 하늘 전체에서 들어오는 주변광(Ambient Light)을 시뮬레이션합니다. 낮/밤 주기 변화에 따라 하늘의 색상 정보를 캡처하여 간접광을 업데이트해야 합니다.
  • 주요 설정 (디테일 패널)
    • Mobility: 이 동적 예제에서는 Movable을 사용합니다. Stationary도 캡처 갱신은 가능하지만 베이크된 조명 부분의 제약을 따로 확인해야 합니다.
    • Real Time Capture: 지원되는 하늘 요소의 변화를 자동으로 캡처하는 방법입니다. 다른 방법은 필요 시 Recapture를 호출하는 것이며, 자동 갱신이 항상 필수인 것은 아닙니다.
    • Intensity Scale: 스카이 라이트의 밝기. 밤에는 낮게, 낮에는 높게 조절합니다.

Sky Atmosphere

  • 역할: 사실적인 대기 산란 효과를 구현합니다. 태양/달의 고도에 따라 하늘의 푸른색, 노을의 붉은색, 새벽의 푸르스름한 색상 등을 자동으로 표현합니다.
  • 주요 설정 (디테일 패널)
    • Directional Light에서 Atmosphere Sun Light를 켜고 인덱스를 지정합니다. Sky Atmosphere에 임의의 Directional Light Actor 참조 필드를 설정하는 절차가 아닙니다.
    • Rayleigh Scattering: 하늘의 푸른색 정도.
    • Mie Scattering: 노을, 스모그 등 뿌연 효과.

Volumetric Cloud로 시간대 구름 제어

  • 역할: 3D 구름을 구현하여 하늘에 입체감을 더합니다. Directional Light의 방향에 따라 구름에 그림자를 드리우고 빛을 가려 사실감을 높입니다.
  • 주요 설정 (디테일 패널)
    • Directional Light의 Atmosphere Sun Light와 구름 그림자 옵션을 확인합니다.
    • 구름 컴포넌트의 층 높이와 하단 고도, 구름 재질이 노출한 밀도·커버리지 파라미터를 구분해 조절합니다.

Post Process Volume

  • 역할: 최종 렌더링 화면에 노출(Exposure), 색상 보정(Color Grading), 블룸(Bloom) 등 시각 효과를 적용하여 시간대별 분위기를 강화합니다.
  • 주요 설정 (디테일 패널)
    • Exposure (노출): 자동 노출의 Min/Max EV100(설정에 따라 Min/Max Brightness)과 Exposure Compensation을 구분합니다. Max Brightness를 낮추면 무조건 어두워진다는 규칙은 없으므로, 고정 노출에서 기준을 잡고 밤의 자동 밝기 보정 범위를 조절합니다.
    • Color Grading: 색상, 채도, 대비 등을 조절하여 낮, 저녁, 밤에 맞는 색감을 연출합니다.
    • Bloom: 낮/밤에 따라 빛 번짐 효과를 조절합니다.

시간 시스템 구현 (블루프린트 활용)

시간 시스템은 보통 단일 마스터 블루프린트를 통해 위의 모든 액터들을 제어하는 방식으로 구현됩니다.

시간 시스템 마스터 블루프린트 생성

새로운 블루프린트 클래스 생성: 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 블루프린트 클래스(Blueprint Class)를 선택합니다.

부모 클래스 선택: Actor를 부모 클래스로 선택하고 BP_TimeOfDaySystem과 같이 이름을 지정합니다.

액터 배치: BP_TimeOfDaySystem 블루프린트 액터를 레벨에 배치합니다.

액터 참조 변수 생성

BP_TimeOfDaySystem 블루프린트 내에서 시간 시스템에 관련된 모든 액터들(Directional Light, Sky Light, Sky Atmosphere, Volumetric Cloud, Post Process Volume)에 대한 참조 변수를 생성하고, 레벨에 있는 해당 액터들을 이 변수에 할당합니다.

  • Directional Light Actor (타입: Directional Light)
  • Sky Light Actor (타입: Sky Light)
  • Sky Atmosphere Actor (타입: Sky Atmosphere)
  • Volumetric Cloud Actor (타입: Volumetric Cloud)
  • Post Process Volume Actor (타입: Post Process Volume)

낮/밤 주기 로직 구현

현재 시간 변수: CurrentTimeInHours (Float 타입)와 같은 변수를 만들어 현재 시간을 0.0 이상 24.0 미만으로 표현합니다.

틱(Tick) 이벤트: Event Tick 노드를 사용하여 매 프레임마다 CurrentTimeInHours 값을 증가시킵니다.

  • Delta Seconds를 사용하여 프레임 속도에 독립적으로 시간이 흐르도록 합니다.
  • TimeScale을 게임 시간의 배율로 정의합니다. 월드 시간 배율이 1이고 일시정지하지 않았다면 1.0은 실제 경과시간과 같은 속도, 60.0은 그 60배입니다.
  • CurrentTimeInHours = FMOD(CurrentTimeInHours + DeltaSeconds * TimeScale / 3600.0, 24.0) 와 같이 초를 시간으로 변환한 뒤 24시간 주기로 반복되도록 합니다. 이 식은 초기 시간이 범위 안에 있고 TimeScale이 0 이상인 경우를 전제로 합니다.

조명 회전: CurrentTimeInHours 값에 따라 Directional Light Actor의 회전 값(Rotation)을 계산하여 적용합니다.

  • 태양의 고도는 주로 Pitch (Y축 회전)에 영향을 받습니다. 0시에는 낮고, 12시(정오)에는 가장 높고, 24시에는 다시 낮아지도록 계산합니다.
  • 하루 전체의 회전은 Pitch = -15 * (CurrentTimeInHours - 6)처럼 24시간에 360도를 도는 교육용 규칙을 정할 수 있습니다. 고정 Yaw와 엔진의 광원 방향을 확인하여 6시·12시·18시의 그림자를 점검합니다. 천문학적 위치 계산은 아닙니다. 024를 -9090에 단순 매핑하면 자정 경계가 연결되지 않습니다.
  • 여기서는 월드 회전 기준의 Set Actor Rotation을 사용합니다. 부모에 붙은 액터의 상대 회전을 쓴다면 부모 변환도 계산에 포함해야 합니다.

조명 강도 및 색상 변경: CurrentTimeInHours에 따라 Directional Light Actor 및 Sky Light Actor의 Intensity와 Light Color를 Timeline 또는 Curve 에셋을 사용하여 점진적으로 변화시킵니다.

  • Curve Float/Linear Color 에셋을 CurrentTimeInHours로 샘플링합니다. Timeline을 선택한다면 재생 위치를 같은 시간 기준으로 맞춰야 하며, 독립적으로 Play하면 게임 시계와 어긋날 수 있습니다. 커브의 0시와 24시 끝값도 연결합니다.
  • 예: 낮에는 강도 높게, 밤에는 강도 낮게. 해질녘에는 주황색/붉은색으로.

후처리 볼륨 설정 변경: CurrentTimeInHours에 따라 Post Process Volume Actor의 Exposure, Color Grading 등을 Timeline이나 Set Members in Post Process Settings 노드를 사용하여 조절합니다.

시간 누적과 화면 적용을 구분하면 시간 배율이 달라져도 각 효과가 같은 시계를 읽습니다.

초 단위 입력을 공통 게임 시계로 변환

프레임의 초 단위 경과시간을 시간으로 변환해 공통 시각에 누적하고 회전과 커브가 그 값을 읽는다.

공통 게임 시계의 단위와 사용처Delta Seconds에 시간 배율을 곱하고 3600으로 나눠 시간 단위로 누적한다. 24시간으로 순환하는 게임 시각 h를 광원 회전, 강도와 색 커브, 후처리 커브가 함께 읽는다.프레임 시간 [초]Δt × 시간 배율게임 시각 h [시]0 ≤ h < 24÷ 3600태양 회전h로 각도 계산강도·색 커브h로 값 읽기후처리 커브h로 값 읽기
공통 게임 시계의 단위와 사용처Delta Seconds에 시간 배율을 곱하고 3600으로 나눠 시간 단위로 누적한다. 24시간으로 순환하는 게임 시각 h를 광원 회전, 강도와 색 커브, 후처리 커브가 함께 읽는다.프레임 시간 [초]Δt × 시간 배율÷ 3600 후 누적게임 시각 h [시]0 ≤ h < 24같은 h로 적용태양 회전 · 강도 · 색후처리 커브

고급 조절 및 최적화

다양한 시간대 프리셋

  • 특정 시간대에 대한 Preset (예: Sunrise, Noon, Sunset, Midnight)을 만들고, Set Time Of Day와 같은 커스텀 이벤트(Custom Event)를 호출하여 해당 시간대로 즉시 전환하거나 부드럽게 보간(Lerp)하도록 구현할 수 있습니다.

날씨 시스템과의 연동

  • BP_TimeOfDaySystem과 BP_WeatherSystem을 서로 참조하게 하여, 날씨 상태에 따라 시간 시스템의 변화에 영향을 주도록 만들 수 있습니다. (예: 비 오는 날에는 하늘이 더 어둡고 노출을 낮추는 등)

성능 고려 사항

  • 회전하는 Directional Light는 Movable이 필요합니다. 나머지 광원은 실제 변화와 GI 경로에 맞춰 선택하고, 그림자 범위·영향 메시 수를 측정합니다.
  • Sky Light의 Real Time Capture는 기본적으로 Time Slicing으로 작업을 여러 프레임에 나눌 수 있습니다. 매 프레임 전체 큐브맵을 모두 다시 계산하는 것으로 단정하지 말고 캡처 해상도와 실제 비용을 확인합니다.
  • Volumetric Cloud의 품질과 Post Process Volume의 복잡한 효과들도 성능에 영향을 주므로, 목표 플랫폼의 사양에 맞춰 적절히 조절해야 합니다.

일출·정오·일몰·자정 프리셋으로 이동하여 광원 방향, 하늘 갱신, 노출이 같은 시간에 맞는지 확인합니다. 자정 전후의 커브 끝값과 빠른 배율에서의 시간 이벤트 누락도 함께 점검합니다.

시간 시스템 설정은 조명, 하늘, 구름, 후처리 값을 같은 기준으로 제어하는 과정입니다.

같은 게임 시계로 광원 회전·커브·후처리를 제어하되, 하늘 캡처의 갱신 정책은 별도로 정하세요.

이 패턴을 익히면 레벨을 단순한 배경이 아니라 시간 흐름에 반응하는 공간으로 만들 수 있습니다.