icon
10장 : 물리 및 환경 상호작용

날씨 및 시간 시스템의 기초


지금까지 게임 내 오브젝트의 물리적인 상호작용과 환경 쿼리 방법에 대해 알아보았습니다. 이제 게임 세계에 더욱 생동감과 몰입감을 더하는 중요한 요소인 날씨 및 시간 시스템에 대해 다룰 차례입니다. 역동적인 낮/밤 주기 변화, 다양한 기상 현상은 게임의 시각적 품질을 향상시킬 뿐만 아니라, 게임플레이에도 직접적인 영향을 미칠 수 있습니다.

이번 절에서는 언리얼 엔진에서 낮/밤 주기 시스템간단한 날씨 변화를 구현하는 기초적인 방법에 대해 알아보겠습니다.


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

날씨 및 시간 시스템(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 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 변수에 적절한 에셋을 연결합니다. (엔진에 기본 제공되는 비 파티클이나 사운드를 활용하거나 직접 만듭니다.)


고급 고려사항

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

날씨 및 시간 시스템은 게임 세계에 생명력을 불어넣고 플레이어에게 다채로운 경험을 제공하는 중요한 요소입니다. 단순히 시각적인 변화를 넘어 게임플레이에도 영향을 미치도록 설계하면 더욱 깊이 있는 게임을 만들 수 있습니다.


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