날씨 및 시간 시스템의 기초
Directional Light와 Sky Light·대기 효과를 시간에 따라 제어하고 비가 전환되는 날씨 시스템을 구성합니다.
지금까지는 오브젝트의 물리 상호작용과 환경 쿼리를 다뤘습니다.
이번에는 게임 세계의 생동감을 높이는 날씨 및 시간 시스템으로 확장합니다.
역동적인 낮/밤 주기와 기상 변화는 시각적 품질뿐 아니라 게임플레이에도 직접 영향을 줄 수 있습니다.
이번 절에서는 낮/밤 주기 시스템과 간단한 날씨 변화를 구현하는 기초 방법을 정리합니다.
날씨 및 시간 시스템이란 무엇인가?
날씨 및 시간 시스템(Weather & Time System)은 게임 월드의 환경 조명, 대기 효과, 기상 현상 등을 동적으로 변화시키는 메커니즘을 의미합니다.
- 낮/밤 주기(Day/Night Cycle): 태양과 달의 위치를 시간에 따라 변화시켜 월드의 조명을 동적으로 변경하고, 일출/일몰과 같은 시각적 전환을 제공합니다.
- 날씨 변화(Weather System): 비, 눈, 안개, 천둥 번개 등 다양한 기상 현상을 구현하여 환경에 변화를 주고, 게임플레이에 영향을 미치기도 합니다.
- 몰입감 증대: 현실 세계와 유사한 환경 변화는 플레이어의 몰입도를 크게 높입니다.
- 시각적 다양성: 동일한 레벨이라도 시간과 날씨에 따라 다르게 보이므로 시각적 지루함을 줄입니다.
-
게임플레이 변화
- 낮/밤: 밤에는 시야가 제한되어 은신 플레이를 유도하거나, 특정 적들이 밤에만 출현하도록 만들 수 있습니다.
- 날씨: 비가 오면 시야가 흐려지거나, 바닥이 미끄러워져 이동에 영향을 주거나, 특정 스킬의 효율이 변하는 등의 게임플레이 요소를 추가할 수 있습니다.
- 내러티브 강화: 특정 시간이나 날씨가 스토리에 중요한 배경이 될 수 있습니다.
낮/밤 주기 시스템 구현의 기초
낮/밤 주기는 주로 Directional Light (태양/달), Sky Light, Sky Atmosphere, Volumetric Cloud 액터들의 속성을 시간에 따라 변경하여 구현합니다.
필수 환경 액터 배치
템플릿과 레벨에 따라 배치 여부가 다르므로 다음 환경 액터를 확인하고 없는 것은 추가합니다.
이 액터들이 낮/밤 주기의 핵심 요소입니다.
Directional Light: 태양(또는 달)을 나타내는 광원입니다.Mobility:Movable로 설정되어 있어야 블루프린트에서 회전을 제어할 수 있습니다.Atmosphere Sun Light를 켜 Sky Atmosphere의 태양으로 사용합니다.Source Angle: 태양의 각 크기와 그림자 부드러움에 영향을 줍니다.
Sky Light: 하늘에서 오는 주변광을 캡처하여 월드를 비춥니다.Source Type:SLS Captured Scene으로 설정되어 있어야Sky Atmosphere와Volumetric Cloud의 색상 변화를 반영합니다.- Stationary 또는 Movable에서
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에서TimeOfDay = FMod(TimeOfDay + DeltaSeconds * DayCycleSpeed / 3600.0, 24.0)으로 갱신합니다. TimeOfDay는 시간 단위이므로 초를 3600으로 나눕니다. 여기서는 음수가 아닌 속도를 사용합니다.FMod는 24시간을 넘은 나머지를 보존하므로 무조건 0으로 대입하는 것과 다릅니다.Update Sun Position함수 (커스텀 함수):DirectionalLight의 회전을 업데이트합니다.DirectionalLight의Set Actor Rotation노드를 호출합니다.TimeOfDay를 기반으로 태양의 Pitch(고도)와 Yaw(방위)를 계산합니다.- 단순 회전 예시:
Pitch = 90.0 - TimeOfDay * 15.0(6시 0도, 12시 -90도, 18시 -180도). 광선의 진행 방향을 기준으로 정오에 아래를 향하게 합니다. 위도·계절을 계산하는 실제 태양 위치 모델은 아닙니다. Yaw는TimeOfDay에 따라 변화시키거나 고정합니다.
- 단순 회전 예시:
Update SkyLight함수 (커스텀 함수):SkyLight의 설정을 업데이트합니다.- 앞에서 Real Time Capture를 켰으므로 Tick에서
Recapture Sky를 반복 호출하지 않습니다. 수동 캡처 방식을 선택한 경우에만 필요 시 Sky Light Component의 Recapture를 호출합니다. - Sky Light Component의
Set Intensity를 통해 시간별 주변광을 조절합니다.
- 앞에서 Real Time Capture를 켰으므로 Tick에서
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 Object Reference): 이 예제의 비 효과 에셋입니다. Cascade Particle System과는 다른 타입입니다.RainSound(Sound Base Object Reference): 비 소리 오디오 큐.RainIntensity(Float, 0.0~1.0): 비의 강도.
파티클 시스템 및 사운드 컴포넌트 추가:
BP_WeatherManager에Niagara Component와Audio Component를 추가하고Auto Activate를 해제합니다.BP_DayNightCycle참조도 받아 시간 조명에 곱할 날씨 계수를 전달합니다. 같은 광원 값을 두 액터의 Tick에서 서로 덮어쓰지 않도록 최종 조명 적용은 DayNightCycle 한 곳이 맡습니다.
날씨 변화 로직 구현
SetWeather 함수 (커스텀 함수)
Input:NewWeatherType(EWeatherType Enum),Intensity(Float)-
로직
CurrentWeather = NewWeatherType,RainIntensity = Clamp(Intensity, 0, 1)을 먼저 저장하고Switch on EWeatherType로 분기합니다. 여기서는 Rain/Clear를 구현하며 Snow는 별도 효과가 준비되기 전에는 선택하지 않습니다.-
Rain일 때- Niagara Component의
Set Asset에RainParticleSystem을 연결하고Activate를 호출합니다. Cascade를 별도로 사용한다면 Particle System Component의Set Template경로로 구성해야 합니다. Audio Component의Set Sound노드를 사용하여RainSound를 설정하고Play노드를 호출합니다.- Niagara 에셋에
User.RainIntensity를 만들고 스폰율에 연결한 뒤,Set Niagara Variable (Float)로RainIntensity를 전달합니다. 이름만 설정해도 기존 에셋의 비 양이 자동으로 변하는 것은 아닙니다. - DayNightCycle에 날씨 계수를 전달해 Directional Light Component의 강도를 조절합니다. Sky Atmosphere에 일반적인
Intensity속성이 있다고 가정하지 않습니다. PostProcess Volume의Exposure또는Color Grading을 조절하여 날씨에 맞는 분위기를 연출합니다.
- Niagara Component의
-
Clear일 때Niagara Component와Audio Component를Deactivate또는Stop합니다.- 조명을 원래대로 복원합니다.
- 부드러운 전환이 필요하면 이벤트 그래프의 커스텀 이벤트에서 Timeline을 시작하고, 그 Update가 현재 계수를 적용하는 함수를 호출하게 합니다. 일반 함수 내부에 Timeline을 넣지 않습니다.
- 날씨 전환 타이머:
Set Timer by Event에는 입력 없는 콜백을 연결합니다. 콜백이 날씨·강도를 선택한 뒤 인자가 있는SetWeather를 호출하도록 구성합니다.
레벨에 배치 및 초기 설정
BP_WeatherManager 액터를 레벨에 배치합니다.디테일 패널: RainParticleSystem과 RainSound 변수에 적절한 에셋을 연결합니다. 템플릿에 적합한 에셋이 없다면 직접 준비하고, 사용자 파라미터와 반복 재생 설정을 확인합니다.
고급 고려사항
- 성능: 파티클 시스템, 볼류메트릭 클라우드, 스카이 애트모스피어 등은 성능에 큰 영향을 미칠 수 있습니다. 저사양 시스템을 고려하여 최적화에 신경 써야 합니다.
- 블렌딩: 날씨 변화를 부드럽게 만들기 위해 FInterp To, Lerp, 타임라인 등을 사용하여 시간에 따라 파라미터 값을 서서히 변경하는 것이 중요합니다.
- 네트워크 동기화: 서버가 기준 시간·날씨·강도를 결정하고 GameState 또는 복제 관리 액터의 상태로 전달합니다. 각 클라이언트가 그 값에서 로컬 조명·Niagara 표현을 갱신합니다. 액터의 Replicates만 켠다고 파티클과 모든 환경 속성이 자동 동기화되지는 않습니다.
-
게임플레이 연동
- 이동 속도 감소: 비가 오면 캐릭터의 이동 속도나 차량의 마찰력을 줄입니다.
- 시야 감소: 안개나 밤에는 플레이어의 시야 범위나 AI의 감지 거리를 줄입니다.
- 환경 효과: 비가 오면 물웅덩이가 생기거나, 젖은 표면의 셰이더가 활성화되도록 합니다.
- 데이터 테이블: 복잡한 날씨 시스템의 경우, 날씨 상태별 파라미터(조명 강도, 파티클 스폰률, 사운드 볼륨 등)를 데이터 테이블로 관리하면 유연하게 조절할 수 있습니다.
날씨 및 시간 시스템은 조명, 안개, 구름, 파티클, 게임플레이 상태를 함께 바꾸는 환경 제어 구조입니다.
시각 변화와 게임플레이 반응을 같은 기준 변수로 묶으면 관리가 쉬워집니다.
이번 절에서는 언리얼 엔진에서 낮/밤 주기 시스템과 간단한 날씨 변화를 구현하는 기초적인 방법, 그리고 관련 환경 액터들의 역할에 대해 알아보았습니다.
동적인 환경 변화는 게임의 몰입도를 크게 향상시킵니다.