날씨 및 시간 시스템의 기초
지금까지는 오브젝트의 물리 상호작용과 환경 쿼리를 다뤘습니다. 이번에는 게임 세계의 생동감을 높이는 날씨 및 시간 시스템으로 확장합니다. 역동적인 낮/밤 주기와 기상 변화는 시각적 품질뿐 아니라 게임플레이에도 직접 영향을 줄 수 있습니다.
이번 절에서는 낮/밤 주기 시스템과 간단한 날씨 변화를 구현하는 기초 방법을 정리합니다.
날씨 및 시간 시스템이란 무엇인가?
날씨 및 시간 시스템(Weather & Time System)은 게임 월드의 환경 조명, 대기 효과, 기상 현상 등을 동적으로 변화시키는 메커니즘을 의미합니다.
- 낮/밤 주기(Day/Night Cycle): 태양과 달의 위치를 시간에 따라 변화시켜 월드의 조명을 동적으로 변경하고, 일출/일몰과 같은 시각적 전환을 제공합니다.
- 날씨 변화(Weather System): 비, 눈, 안개, 천둥 번개 등 다양한 기상 현상을 구현하여 환경에 변화를 주고, 게임플레이에 영향을 미치기도 합니다.
- 몰입감 증대: 현실 세계와 유사한 환경 변화는 플레이어의 몰입도를 크게 높입니다.
- 시각적 다양성: 동일한 레벨이라도 시간과 날씨에 따라 다르게 보이므로 시각적 지루함을 줄입니다.
-
게임플레이 변화
- 낮/밤: 밤에는 시야가 제한되어 은신 플레이를 유도하거나, 특정 적들이 밤에만 출현하도록 만들 수 있습니다.
- 날씨: 비가 오면 시야가 흐려지거나, 바닥이 미끄러워져 이동에 영향을 주거나, 특정 스킬의 효율이 변하는 등의 게임플레이 요소를 추가할 수 있습니다.
- 내러티브 강화: 특정 시간이나 날씨가 스토리에 중요한 배경이 될 수 있습니다.
낮/밤 주기 시스템 구현의 기초
낮/밤 주기는 주로 Directional Light (태양/달), Sky Light, Sky Atmosphere, Volumetric Cloud 액터들의 속성을 시간에 따라 변경하여 구현합니다.
필수 환경 액터 배치
새 언리얼 엔진 프로젝트를 생성하면 기본적으로 다음과 같은 환경 액터들이 배치되어 있습니다. 이 액터들이 낮/밤 주기의 핵심 요소입니다.
Directional Light: 태양(또는 달)을 나타내는 광원입니다.Mobility:Movable로 설정되어 있어야 블루프린트에서 회전을 제어할 수 있습니다.Source Angle: 태양의 크기(그림자 선명도)를 조절합니다.
Sky Light: 하늘에서 오는 주변광을 캡처하여 월드를 비춥니다.Source Type:SLS Captured Scene으로 설정되어 있어야Sky Atmosphere와Volumetric 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의 회전을 업데이트합니다.DirectionalLight의Set Actor Rotation노드를 호출합니다.TimeOfDay를 기반으로 태양의 Pitch(고도)와 Yaw(방위)를 계산합니다.- 예시:
Pitch = TimeOfDay * (360 / 24.0) - 90.0(오전 6시 0도, 정오 90도, 오후 6시 180도, 자정 -90도) Yaw는TimeOfDay에 따라 변화시키거나 고정합니다.
- 예시:
Update SkyLight함수 (커스텀 함수):SkyLight의 설정을 업데이트합니다.SkyLight의Recapture Sky노드를 주기적으로 호출하여 하늘의 변화를 반영합니다. (너무 자주 호출하면 성능에 영향을 미치므로, 일정 시간마다 또는 특정 시간대 변화 시에만 호출하는 것이 좋음)SkyLight의Intensity를TimeOfDay에 따라 조절하여 밤에는 어둡게, 낮에는 밝게 만듭니다.
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_WeatherManager에Niagara Component(또는Particle System Component)와Audio Component를 추가합니다.Auto Activate는 해제합니다.
날씨 변화 로직 구현
SetWeather 함수 (커스텀 함수)
Input:NewWeatherType(EWeatherType Enum),Intensity(Float)-
로직
Switch on EWeatherType노드를 사용하여NewWeatherType에 따라 다른 로직을 실행합니다.-
Rain일 때Niagara Component또는Particle System Component의Set Asset노드를 사용하여RainParticleSystem을 설정하고Activate노드를 호출합니다.Audio Component의Set Sound노드를 사용하여RainSound를 설정하고Play노드를 호출합니다.RainIntensity를 파티클 시스템의 사용자 파라미터(User Parameter)로 전달하여 비의 양을 조절합니다. (예:Set Niagara Float Parameter노드)SkyAtmosphere나DirectionalLight의Intensity를 낮춰 날씨에 맞게 조명을 어둡게 합니다.PostProcess Volume의Exposure또는Color Grading을 조절하여 날씨에 맞는 분위기를 연출합니다.
-
Clear일 때Niagara Component와Audio Component를Deactivate또는Stop합니다.- 조명을 원래대로 복원합니다.
Interpolate To Clear Weather(타임라인/Lerp): 서서히 날씨가 맑아지도록 타임라인이나 Lerp 노드를 사용하여 변화를 부드럽게 합니다.
- 날씨 전환 타이머:
Set Timer by Event노드를 사용하여 일정 시간마다SetWeather함수를 호출하여 날씨를 무작위로 변경하거나, 스토리에 따라 강제 변경할 수 있습니다.
레벨에 배치 및 초기 설정
BP_WeatherManager 액터를 레벨에 배치합니다.디테일 패널: RainParticleSystem과 RainSound 변수에 적절한 에셋을 연결합니다. (엔진에 기본 제공되는 비 파티클이나 사운드를 활용하거나 직접 만듭니다.)
고급 고려사항
- 성능: 파티클 시스템, 볼류메트릭 클라우드, 스카이 애트모스피어 등은 성능에 큰 영향을 미칠 수 있습니다. 저사양 시스템을 고려하여 최적화에 신경 써야 합니다.
- 블렌딩: 날씨 변화를 부드럽게 만들기 위해 FInterp To, Lerp, 타임라인 등을 사용하여 시간에 따라 파라미터 값을 서서히 변경하는 것이 중요합니다.
- 네트워크 동기화: 멀티플레이어 게임의 경우, 날씨와 시간은 모든 클라이언트에서 동기화되어야 합니다.
BP_DayNightCycle과BP_WeatherManager는Replicates가 체크되어 있어야 하며, 변수나 RPC를 통해 서버에서 클라이언트로 정보를 복제해야 합니다. -
게임플레이 연동
- 이동 속도 감소: 비가 오면 캐릭터의 이동 속도나 차량의 마찰력을 줄입니다.
- 시야 감소: 안개나 밤에는 플레이어의 시야 범위나 AI의 감지 거리를 줄입니다.
- 환경 효과: 비가 오면 물웅덩이가 생기거나, 젖은 표면의 셰이더가 활성화되도록 합니다.
- 데이터 테이블: 복잡한 날씨 시스템의 경우, 날씨 상태별 파라미터(조명 강도, 파티클 스폰률, 사운드 볼륨 등)를 데이터 테이블로 관리하면 유연하게 조절할 수 있습니다.
날씨 및 시간 시스템은 게임 세계에 생명력을 불어넣고 플레이어에게 다채로운 경험을 제공하는 중요한 요소입니다. 단순히 시각적인 변화를 넘어 게임플레이에도 영향을 미치도록 설계하면 더욱 깊이 있는 게임을 만들 수 있습니다.
이번 절에서는 언리얼 엔진에서 낮/밤 주기 시스템과 간단한 날씨 변화를 구현하는 기초적인 방법, 그리고 관련 환경 액터들의 역할에 대해 알아보았습니다. 동적인 환경 변화는 게임의 몰입도를 크게 향상시킵니다.