날씨 및 시간 시스템의 기초
지금까지 게임 내 오브젝트의 물리적인 상호작용과 환경 쿼리 방법에 대해 알아보았습니다. 이제 게임 세계에 더욱 생동감과 몰입감을 더하는 중요한 요소인 날씨 및 시간 시스템에 대해 다룰 차례입니다. 역동적인 낮/밤 주기 변화, 다양한 기상 현상은 게임의 시각적 품질을 향상시킬 뿐만 아니라, 게임플레이에도 직접적인 영향을 미칠 수 있습니다.
이번 절에서는 언리얼 엔진에서 낮/밤 주기 시스템과 간단한 날씨 변화를 구현하는 기초적인 방법에 대해 알아보겠습니다.
날씨 및 시간 시스템이란 무엇인가?
날씨 및 시간 시스템(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의 감지 거리를 줄입니다.
- 환경 효과: 비가 오면 물웅덩이가 생기거나, 젖은 표면의 셰이더가 활성화되도록 합니다.
- 데이터 테이블: 복잡한 날씨 시스템의 경우, 날씨 상태별 파라미터(조명 강도, 파티클 스폰률, 사운드 볼륨 등)를 데이터 테이블로 관리하면 유연하게 조절할 수 있습니다.
날씨 및 시간 시스템은 게임 세계에 생명력을 불어넣고 플레이어에게 다채로운 경험을 제공하는 중요한 요소입니다. 단순히 시각적인 변화를 넘어 게임플레이에도 영향을 미치도록 설계하면 더욱 깊이 있는 게임을 만들 수 있습니다.
이번 절에서는 언리얼 엔진에서 낮/밤 주기 시스템과 간단한 날씨 변화를 구현하는 기초적인 방법, 그리고 관련 환경 액터들의 역할에 대해 알아보았습니다. 동적인 환경 변화는 게임의 몰입도를 크게 향상시킵니다.