본문으로 건너뛰기

안동민 개발노트

본문 시작

날씨 및 시간 시스템의 기초

Directional Light와 Sky Light·대기 효과를 시간에 따라 제어하고 비가 전환되는 날씨 시스템을 구성합니다.

지금까지는 오브젝트의 물리 상호작용과 환경 쿼리를 다뤘습니다.

이번에는 게임 세계의 생동감을 높이는 날씨 및 시간 시스템으로 확장합니다.

역동적인 낮/밤 주기와 기상 변화는 시각적 품질뿐 아니라 게임플레이에도 직접 영향을 줄 수 있습니다.

이번 절에서는 낮/밤 주기 시스템간단한 날씨 변화를 구현하는 기초 방법을 정리합니다.

날씨와 시간 시스템

낮밤 주기는 환경 액터를 시간 값으로 제어하고, 날씨 변화는 파티클과 사운드, 조명 강도를 묶어 전환한다.

  1. 시간 값

    TimeOfDay와 DayCycleSpeed로 하루 흐름을 계산한다.

  2. 환경 액터

    Directional Light, Sky Light, Sky Atmosphere를 시간에 맞춰 갱신한다.

  3. 날씨 전환

    비, 눈, 안개 상태에 따라 Niagara와 Audio 컴포넌트를 제어한다.

  4. 게임플레이

    시야, 이동, AI 감지, 스킬 효과 같은 규칙과 연결한다.


날씨 및 시간 시스템이란 무엇인가?

날씨 및 시간 시스템(Weather & Time System)은 게임 월드의 환경 조명, 대기 효과, 기상 현상 등을 동적으로 변화시키는 메커니즘을 의미합니다.

  • 낮/밤 주기(Day/Night Cycle): 태양과 달의 위치를 시간에 따라 변화시켜 월드의 조명을 동적으로 변경하고, 일출/일몰과 같은 시각적 전환을 제공합니다.
  • 날씨 변화(Weather System): 비, 눈, 안개, 천둥 번개 등 다양한 기상 현상을 구현하여 환경에 변화를 주고, 게임플레이에 영향을 미치기도 합니다.
날씨 및 시간 시스템이 필요한 이유
  • 몰입감 증대: 현실 세계와 유사한 환경 변화는 플레이어의 몰입도를 크게 높입니다.
  • 시각적 다양성: 동일한 레벨이라도 시간과 날씨에 따라 다르게 보이므로 시각적 지루함을 줄입니다.
  • 게임플레이 변화
    • 낮/밤: 밤에는 시야가 제한되어 은신 플레이를 유도하거나, 특정 적들이 밤에만 출현하도록 만들 수 있습니다.
    • 날씨: 비가 오면 시야가 흐려지거나, 바닥이 미끄러워져 이동에 영향을 주거나, 특정 스킬의 효율이 변하는 등의 게임플레이 요소를 추가할 수 있습니다.
  • 내러티브 강화: 특정 시간이나 날씨가 스토리에 중요한 배경이 될 수 있습니다.
시간과 날씨 블루프린트 흐름

날씨와 시간 시스템은 조명, 하늘, 안개, 파티클을 같은 시간 값으로 묶어 움직이는 구조입니다. 한 변수에서 시작해 여러 환경 액터로 값을 전달해야 일관된 월드 변화가 만들어집니다.

  1. 1
    Directional Light

    태양 고도와 색상을 시간 값에 따라 회전시킵니다.

  2. 2
    Sky Light

    하늘빛 캡처는 비용이 있으므로 호출 주기를 조절합니다.

  3. 3
    Fog

    시간대와 날씨에 맞춰 밀도와 색을 조금씩 바꿉니다.

  4. 4
    Niagara

    비와 눈은 활성화 여부와 스폰율로 제어합니다.

  5. 5
    블루프린트 기준

    레벨 액터 참조는 Instance Editable 변수로 노출해 연결합니다. 매 프레임 비싼 작업을 하지 않도록 Recapture 주기를 제한합니다. 날씨 상태는 enum이나 데이터 테이블로 분리하면 확장하기 쉽습니다.

  6. 6
    상태 매칭

    Dawn 낮은 밝기 Noon 강한 태양 Night 차가운 색 Rain 습도와 안개


낮/밤 주기 시스템 구현의 기초

날씨와 시간 시스템 상태 흐름

시간과 날씨는 조명, 머티리얼, 오디오, 게임플레이가 공유하는 월드 상태로 설계해야 확장됩니다.

  1. 1
    시간 누적

    Delta Seconds를 월드 시간 배율에 맞춰 누적하고 하루 길이를 정합니다. Clock

  2. 2
    상태 전환

    맑음, 비, 안개 같은 날씨 상태를 조건과 확률로 전환합니다. Weather

  3. 3
    시각 반영

    Directional Light, Sky Light, Fog, 머티리얼 파라미터를 함께 조정합니다. Visual

  4. 4
    게임플레이 연결

    시야, 이동, 소리, NPC 행동처럼 실제 규칙에 필요한 값만 노출합니다. Rules

  5. 5
    저장 복원

    게임 로드 뒤 시간과 날씨가 의도한 상태로 복원되어야 합니다.

  6. 6
    전환 속도

    날씨 변화가 시각적으로 튀지 않도록 보간 시간을 둡니다.

  7. 7
    네트워크

    멀티플레이에서는 권한 있는 월드 상태만 복제합니다.

낮/밤 주기는 주로 Directional Light (태양/달), Sky Light, Sky Atmosphere, Volumetric Cloud 액터들의 속성을 시간에 따라 변경하여 구현합니다.

필수 환경 액터 배치

새 언리얼 엔진 프로젝트를 생성하면 기본적으로 다음과 같은 환경 액터들이 배치되어 있습니다.

이 액터들이 낮/밤 주기의 핵심 요소입니다.

  • Directional Light: 태양(또는 달)을 나타내는 광원입니다.
    • Mobility: Movable로 설정되어 있어야 블루프린트에서 회전을 제어할 수 있습니다.
    • Source Angle: 태양의 크기(그림자 선명도)를 조절합니다.
  • Sky Light: 하늘에서 오는 주변광을 캡처하여 월드를 비춥니다.
    • Source Type: SLS Captured Scene으로 설정되어 있어야 Sky AtmosphereVolumetric Cloud의 색상 변화를 반영합니다.
    • Real Time Capture: 체크하여 동적으로 하늘광을 업데이트합니다.
  • Sky Atmosphere: 지구의 대기권을 시뮬레이션하여 하늘의 색상, 안개, 광원 산란 등을 구현합니다.
  • Volumetric Cloud: 실시간으로 동적인 구름을 시뮬레이션합니다. (성능에 영향을 줄 수 있음)
  • Exponential Height Fog: 안개를 시뮬레이션합니다. (선택 사항, Sky Atmosphere와 통합될 수 있음)

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

이 액터들을 제어할 블루프린트 액터를 생성합니다.

새 블루프린트 클래스 생성: Actor를 부모 클래스로 하는 새로운 블루프린트 BP_DayNightCycle을 생성합니다.

변수 추가
  • DirectionalLight (Directional Light Object Reference): 레벨에 있는 태양/달 광원 액터의 참조를 저장합니다. Instance Editable로 설정하여 레벨에 배치 후 직접 연결할 수 있도록 합니다.
  • SkyLight (Sky Light Object Reference)
  • SkyAtmosphere (Sky Atmosphere Object Reference)
  • VolumetricCloud (Volumetric Cloud Object Reference)
  • TimeOfDay (Float, 기본값 0.0, 범위 0.0~24.0): 현재 시간을 24시간 기준으로 나타냅니다.
  • DayCycleSpeed (Float, 기본값 1.0): 낮/밤 주기의 속도 조절 (1.0 = 실제 시간과 동일, 높을수록 빠르게 변함).
이벤트 그래프 로직 (Event Tick 활용)
  • Event Tick이벤트에서 Delta Seconds를 가져와 TimeOfDay 변수에 DayCycleSpeed를 곱한 값을 더합니다.
  • TimeOfDay가 24.0을 넘으면 0.0으로 리셋합니다 (FMod 함수 활용).
  • Update Sun Position 함수 (커스텀 함수): DirectionalLight의 회전을 업데이트합니다.
    • DirectionalLightSet Actor Rotation 노드를 호출합니다.
    • TimeOfDay를 기반으로 태양의 Pitch(고도)와 Yaw(방위)를 계산합니다.
      • 예시: Pitch = TimeOfDay * (360 / 24.0) - 90.0 (오전 6시 0도, 정오 90도, 오후 6시 180도, 자정 -90도)
      • YawTimeOfDay에 따라 변화시키거나 고정합니다.
  • Update SkyLight 함수 (커스텀 함수): SkyLight의 설정을 업데이트합니다.
    • SkyLightRecapture Sky 노드를 주기적으로 호출하여 하늘의 변화를 반영합니다. (너무 자주 호출하면 성능에 영향을 미치므로, 일정 시간마다 또는 특정 시간대 변화 시에만 호출하는 것이 좋음)
    • SkyLightIntensityTimeOfDay에 따라 조절하여 밤에는 어둡게, 낮에는 밝게 만듭니다.
  • Update SkyAtmosphere / Update VolumetricCloud: 필요에 따라 이 액터들의 특정 파라미터(예: 밀도, 색상, 고도)를 TimeOfDay에 따라 조절하여 더욱 사실적인 낮/밤 변화를 구현합니다.

레벨에 배치 및 연결

BP_DayNightCycle 액터를 레벨에 배치합니다.

디테일(Details) 패널: BP_DayNightCycle을 선택하고, 미리 생성한 변수 슬롯에 레벨의 Directional Light, Sky Light, Sky Atmosphere, Volumetric Cloud 액터들을 드래그 앤 드롭하여 연결합니다.


간단한 날씨 변화 구현의 기초 (비 예시)

날씨 시스템은 파티클 시스템(Niagara/Cascade)과 오디오, 그리고 환경 액터의 변화를 통해 구현됩니다.

날씨 시스템 블루프린트 생성

이 액터는 날씨의 종류와 강도를 제어합니다.

새 블루프린트 클래스 생성: Actor를 부모 클래스로 하는 BP_WeatherManager를 생성합니다.

변수 추가
  • CurrentWeather (Enum, 예: EWeatherType::Clear, EWeatherType::Rain, EWeatherType::Snow): 현재 날씨 상태.
  • RainParticleSystem (Niagara System 또는 Particle System Object Reference): 비 효과 파티클 시스템.
  • RainSound (Sound Base Object Reference): 비 소리 오디오 큐.
  • RainIntensity (Float, 0.0~1.0): 비의 강도.

파티클 시스템 및 사운드 컴포넌트 추가:

  • BP_WeatherManagerNiagara Component (또는 Particle System Component)와 Audio Component를 추가합니다. Auto Activate는 해제합니다.

날씨 변화 로직 구현

SetWeather 함수 (커스텀 함수)
  • Input: NewWeatherType (EWeatherType Enum), Intensity (Float)
  • 로직
    • Switch on EWeatherType 노드를 사용하여 NewWeatherType에 따라 다른 로직을 실행합니다.
    • Rain 일 때
      • Niagara Component 또는 Particle System ComponentSet Asset 노드를 사용하여 RainParticleSystem을 설정하고 Activate 노드를 호출합니다.
      • Audio ComponentSet Sound 노드를 사용하여 RainSound를 설정하고 Play 노드를 호출합니다.
      • RainIntensity를 파티클 시스템의 사용자 파라미터(User Parameter)로 전달하여 비의 양을 조절합니다. (예: Set Niagara Float Parameter 노드)
      • SkyAtmosphereDirectionalLightIntensity를 낮춰 날씨에 맞게 조명을 어둡게 합니다.
      • PostProcess VolumeExposure 또는 Color Grading을 조절하여 날씨에 맞는 분위기를 연출합니다.
    • Clear 일 때
      • Niagara ComponentAudio ComponentDeactivate 또는 Stop합니다.
      • 조명을 원래대로 복원합니다.
      • Interpolate To Clear Weather (타임라인/Lerp): 서서히 날씨가 맑아지도록 타임라인이나 Lerp 노드를 사용하여 변화를 부드럽게 합니다.
  • 날씨 전환 타이머: Set Timer by Event 노드를 사용하여 일정 시간마다 SetWeather 함수를 호출하여 날씨를 무작위로 변경하거나, 스토리에 따라 강제 변경할 수 있습니다.

레벨에 배치 및 초기 설정

BP_WeatherManager 액터를 레벨에 배치합니다.

디테일 패널: RainParticleSystemRainSound 변수에 적절한 에셋을 연결합니다. (엔진에 기본 제공되는 비 파티클이나 사운드를 활용하거나 직접 만듭니다.)

시간 값과 날씨 상태를 하나의 월드 상태로 운영한다

낮/밤 주기와 비 효과를 따로 만들더라도, 최종 운영에서는 시간, 날씨, 조명, 이펙트, 게임플레이 규칙이 같은 상태를 바라보게 해야 합니다.

  1. Tick 또는 Timer

    시간은 매 프레임 갱신하고, 무거운 날씨 전환은 타이머로 간격을 둡니다.

  2. 상태 계산

    TimeOfDay, CurrentWeather, RainIntensity를 월드 상태로 묶습니다.

  3. 액터 반영

    Directional Light, Sky Light, Niagara, Audio에 필요한 값만 전달합니다.

  4. 게임플레이 연결

    시야, 이동, AI 감지, 사운드 볼륨 같은 규칙을 같은 상태에서 읽습니다.

  5. Time driver

    시간 값은 태양 회전과 하늘광 강도의 기준입니다. 24시간 범위를 벗어나지 않게 보정합니다. FMod Movable

  6. Weather driver

    날씨 상태는 Niagara 활성화, 사운드, 안개 밀도, 포스트프로세스 값으로 퍼집니다. Enum Timeline

  7. 비용 보호 기준

    Sky recapture, volumetric cloud, particle spawn은 비용이 크므로 빈도와 품질 단계를 분리합니다. Throttle Scalability


고급 고려사항

  • 성능: 파티클 시스템, 볼류메트릭 클라우드, 스카이 애트모스피어 등은 성능에 큰 영향을 미칠 수 있습니다. 저사양 시스템을 고려하여 최적화에 신경 써야 합니다.
  • 블렌딩: 날씨 변화를 부드럽게 만들기 위해 FInterp To, Lerp, 타임라인 등을 사용하여 시간에 따라 파라미터 값을 서서히 변경하는 것이 중요합니다.
  • 네트워크 동기화: 멀티플레이어 게임의 경우, 날씨와 시간은 모든 클라이언트에서 동기화되어야 합니다. BP_DayNightCycleBP_WeatherManagerReplicates가 체크되어 있어야 하며, 변수나 RPC를 통해 서버에서 클라이언트로 정보를 복제해야 합니다.
  • 게임플레이 연동
    • 이동 속도 감소: 비가 오면 캐릭터의 이동 속도나 차량의 마찰력을 줄입니다.
    • 시야 감소: 안개나 밤에는 플레이어의 시야 범위나 AI의 감지 거리를 줄입니다.
    • 환경 효과: 비가 오면 물웅덩이가 생기거나, 젖은 표면의 셰이더가 활성화되도록 합니다.
  • 데이터 테이블: 복잡한 날씨 시스템의 경우, 날씨 상태별 파라미터(조명 강도, 파티클 스폰률, 사운드 볼륨 등)를 데이터 테이블로 관리하면 유연하게 조절할 수 있습니다.
환경 변화는 시간, 날씨, 게임플레이를 따로 판단한다

낮밤 주기와 비 효과를 한 그래프에 밀어 넣기보다, 어떤 값이 누가 소유하고 언제 갱신되는지 먼저 나누면 확장과 디버깅이 쉬워집니다.

  1. 항상 흐르는 값

    시간 축 TimeOfDay는 한 곳에서 증가시키고, 조명과 하늘은 이 값을 읽어 반응하게 둡니다. 갱신 Tick 또는 느린 Timer로 0~24 범위를 순환합니다. 반영 Directional Light 회전, Sky Light 강도, 안개 밀도를 계산합니다.

  2. 이벤트로 바뀌는 값

    날씨 상태 Clear, Rain, Snow 같은 상태는 SetWeather 함수로만 바꾸면 파티클, 사운드, 후처리를 함께 정리할 수 있습니다. 입력 새 날씨와 강도를 받아 현재 상태를 갱신합니다. 전환 Lerp나 Timeline으로 조명과 사운드 볼륨을 부드럽게 섞습니다.

  3. 게임플레이에 쓰는 값

    규칙 연결 비가 오는 사실보다 최종 효과를 명확히 두면 다른 블루프린트가 안정적으로 읽습니다. 노출 VisibilityScale, MovePenalty, Wetness 같은 계산 결과를 둡니다. 검증 멀티플레이는 서버 값 복제 기준으로 화면 차이를 확인합니다.

날씨 및 시간 시스템은 조명, 안개, 구름, 파티클, 게임플레이 상태를 함께 바꾸는 환경 제어 구조입니다.

시각 변화와 게임플레이 반응을 같은 기준 변수로 묶으면 관리가 쉬워집니다.

시간과 날씨가 여러 액터를 동시에 바꾸는 구조에서는 기준 변수, 보간, 복제, 성능 비용을 따로 관리해야 합니다.

시간과 날씨는 기준 변수 하나에서 퍼져야 한다

Directional Light, Sky Light, Niagara, 사운드, Post Process가 따로 움직이면 전환이 어색해집니다. 기준 값을 먼저 정하고 각 액터가 따라오게 만듭니다.

  1. 시간 갱신

    Clock Delta Seconds와 DayCycleSpeed로 TimeOfDay를 누적하고 24시간 기준으로 순환시킵니다.

  2. 조명 반영

    Light 태양 회전, Sky Light 강도, 안개 밀도를 같은 시간 값에서 계산합니다.

  3. 상태 전환

    Weather Clear, Rain, Snow 같은 Enum과 Intensity로 파티클과 사운드를 제어합니다.

  4. 부드러운 보간

    Blend Timeline, Lerp, FInterp To로 빛과 비의 변화가 갑자기 끊기지 않게 합니다.

  5. Network
    서버 기준 복제

    Network 멀티플레이에서는 시간과 날씨 상태를 서버에서 정하고 클라이언트가 표시를 맞춥니다.

  6. Cost
    갱신 주기 조절

    Cost Recapture Sky와 볼류메트릭 효과는 매 프레임보다 상태 변화 시점에 맞춥니다.

  7. Gameplay
    규칙 영향 분리

    Gameplay 시야 감소, 마찰 변경, AI 감지 거리는 시각 효과와 별도 함수로 둡니다.


이번 절에서는 언리얼 엔진에서 낮/밤 주기 시스템과 간단한 날씨 변화를 구현하는 기초적인 방법, 그리고 관련 환경 액터들의 역할에 대해 알아보았습니다.

동적인 환경 변화는 게임의 몰입도를 크게 향상시킵니다.

Time of Day와 Weather 연결 점검

환경 시스템은 시간 값, 시각 표현, 날씨 상태, 전환 조건이 분리되어야 조정하기 쉽습니다.

  1. 시간 값 기준

    시간 값 하루 길이와 현재 시간을 변수로 두고 Tick 또는 Timer에서 일정하게 갱신합니다.

  2. 표현 기준

    표현 Directional Light, Sky, Fog, Post Process가 같은 시간 값을 바라보게 연결합니다.

  3. 최적화 단계 전환 기준

    전환 비, 안개, 맑음 같은 상태는 즉시 변경보다 보간으로 자연스럽게 바꿉니다.