본문 바로가기

날씨 및 시간 효과 적용

날씨와 시간 상태에 맞춰 시각 효과·오디오·게임플레이 반응을 함께 전환하는 통합 환경 규칙을 구성합니다.

날씨 시스템과 시간 시스템을 각각 만들었더라도, 둘이 따로 움직이면 화면은 그럴듯해도 금방 어색해집니다. 비가 내리는데 소리는 맑은 낮 그대로이거나, 밤인데 노출이 낮처럼 밝으면 플레이어는 바로 이질감을 느낍니다. 또 시간 블루프린트와 날씨 블루프린트가 같은 광원 값을 서로 덮어쓰면, 어느 쪽이 나중에 실행되느냐에 따라 화면이 달라지기도 합니다.

이 글에서는 시각 효과와 오디오, 게임 플레이의 반응을 하나의 규칙으로 묶는 방법을 다룹니다. 날씨와 시간이 함께 바뀔 때 조명, 안개, 구름, 후처리에서 무엇을 함께 바꿔야 하는지 정리하고, 소리와 게임 플레이를 연결한 뒤, 마지막으로 최종 값을 한곳에서 적용하는 관리 구조를 그림으로 살펴봅니다. 이 과정을 마치면 레벨의 분위기 변화가 한 번 쓰고 마는 연출이 아니라, 다시 쓸 수 있는 시스템으로 동작하게 됩니다.


날씨와 시간을 함께 다뤄야 하는 이유

날씨와 시간을 따로 만드는 것도 중요하지만, 레벨의 완성도는 둘을 함께 엮고 게임 플레이와 연결하는 데서 결정됩니다. 먼저 시각적으로 어울려야 합니다. 비와 밤이 겹치면 조명과 안개, 구름, 강수 효과가 함께 바뀌어야 하고, 비 오는 밤은 낮의 비와는 다른, 더 어둡고 축축한 분위기여야 합니다.

소리도 화면에 맞춰야 합니다. 빗소리와 천둥소리, 밤벌레 소리 같은 환경음이 시각적인 변화와 함께 바뀌어야 합니다. 또 날씨와 시간의 변화가 보이는 것에서 끝나지 않고, 이동 속도와 시야, NPC의 행동처럼 게임 플레이에도 실제로 영향을 주도록 설계할 수 있습니다. 마지막으로 이렇게 많은 것이 함께 바뀌는 시스템은 성능에 큰 영향을 주므로, 한곳에서 관리해야 최적화도 쉬워집니다.


시각 효과 함께 맞추기

앞에서 만든 BP_WeatherSystem과 BP_TimeOfDaySystem을 바탕으로, 시간과 날씨의 상태마다 액터의 속성을 어떻게 바꿀지 일관된 규칙으로 정합니다. 이때 같은 속성을 두 시스템이 따로 정하면, 나중에 실행된 쪽의 값이 앞의 값을 덮어써 비 오는 밤이 맑은 밤처럼 보일 수 있습니다. 그래서 아래의 조명, 안개, 구름, 후처리 항목은 시간이 정한 기본값에 날씨가 주는 변화를 더하는 방식으로 읽으면 됩니다. 예를 들어 흐린 날의 디렉셔널 라이트는 그 시각의 강도에서 조금 낮춘 값을 씁니다.

조명

디렉셔널 라이트의 Intensity는 낮에는 높게, 밤에는 낮게 하고, 흐린 날에는 낮의 강도를 조금 낮춥니다. Light Color는 해가 뜨고 질 때 주황색이나 붉은색, 낮에는 흰빛, 밤에는 푸른빛으로 바꾸고, 비나 눈이 올 때는 회색조를 더해 흐린 분위기를 냅니다.

스카이 라이트의 Intensity Scale도 디렉셔널 라이트처럼 낮과 밤에 따라 조절합니다. 하늘이 바뀐 것을 반영하는 방법은 Real Time Capture를 켜거나, 필요한 때에 Recapture를 호출하는 것 가운데 고르며, 실시간 캡처를 늘 켜 둬야 하는 것은 아닙니다.

후처리 볼륨의 Ambient Cubemap은 이를 지원하는 경로에서 큐브맵으로 환경 조명을 보강하는 항목입니다. 다만 하늘에서 오는 조명이라면 물체끼리 가리는 것을 반영할 수 있는 스카이 라이트를 먼저 검토하고, 이 후처리 항목을 루멘의 글로벌 일루미네이션 전체와 같은 기능으로 여기지 않습니다.

안개

지수형 높이 안개의 Fog Density는 안개 낀 날이나 밤에 높여 시야를 좁히고 분위기를 어둡게 합니다. Fog Height Falloff는 높이에 따라 밀도가 줄어드는 빠르기로, 작은 값은 안개가 위쪽까지 넓게 퍼지게 하고 큰 값은 땅 가까이에 좁게 모이게 합니다. 기준이 되는 높이는 액터의 Z 위치와 함께 확인합니다. Fog Inscattering Color로는 푸른 새벽 안개나 주황색 스모그처럼 안개에 색을 줍니다.

볼류메트릭 안개를 켰다면, 밤이나 짙은 안개에서 Extinction Scale을 높여 밀도를 높이고, Albedo와 Emissive 색을 조절해 빛줄기처럼 빛과 안개가 어우러지는 효과를 강화할 수 있습니다.

구름

볼류메트릭 클라우드에서 구름의 양은 재질이 노출한 덮는 정도나 밀도 파라미터로 조절합니다. 이름과 값이 커질 때의 방향은 재질의 구현에 따라 다르므로 확인합니다. Layer Height와 Layer Bottom Altitude로는 구름 층의 두께와 높이를 바꿔 여러 종류의 구름을 표현하고, 구름 그림자의 세기는 디렉셔널 라이트의 Cloud Shadow Strength에서 조절합니다. 블루프린트에서는 구름 재질의 파라미터, 예를 들어 그 재질에 있는 밀도나 산란 관련 값을 바꿔 구름의 형태와 밀도를 동적으로 바꿉니다.

후처리

후처리 볼륨의 노출은 낮에는 밝게, 밤에는 어둡게 자동 노출의 범위를 조절하거나 수동 노출로 정합니다. 비 오는 날이나 흐린 날에는 전체 노출을 조금 낮춥니다.

색 보정(Color Grading)에서는 Global 항목의 Gain, Gamma, Offset으로 레벨 전체의 밝기와 대비, 색조를 조절해 일몰에는 붉은색, 밤에는 푸른색 같은 색감을 만들고, Saturation과 Contrast로 날씨에 따라 채도와 대비를 바꿉니다. 예를 들어 비 오는 날에는 채도를 낮춥니다. 블룸은 밤이나 안개 낀 날에 조금 높여 빛이 퍼지는 느낌을 강조할 수 있고, 비네트는 특정 날씨나 시간대에 화면 가장자리를 어둡게 해 연출에 쓸 수 있습니다.

비에 젖은 노면처럼 반사가 중요한 표면은 재질의 Roughness와 지금 쓰는 반사 방식을 함께 확인합니다. 젖은 노면은 거칠기가 낮아 반사가 강해지는데, 화면 공간 반사를 쓰는 경로에서만 그 설정의 영향을 비교할 수 있습니다.


소리 맞추기

소리는 시각적인 변화만큼 중요합니다. 플레이어가 날씨가 바뀌었다는 것을 알아차리는 데 소리가 큰 역할을 하기 때문입니다.

앰비언트 사운드로 환경음 깔기

먼저 빗소리, 천둥소리, 바람 소리, 밤벌레 소리처럼 날씨와 시간대마다 필요한 오디오 파일을 가져와 사운드 큐(Sound Cue)를 만듭니다. 사운드 큐 안에서 소리를 무작위로 고르거나 볼륨을 조절하는 설정을 넣을 수 있습니다. 그다음 만든 사운드 큐를 콘텐츠 브라우저에서 레벨로 끌어다 놓으면, 그 소리를 쓰는 앰비언트 사운드 액터가 생깁니다. 액터를 먼저 놓고 싶다면 액터 배치(Place Actors) 패널의 All Classes 탭에서 Ambient Sound를 레벨로 끌어다 놓은 뒤, 디테일 패널에서 만든 사운드 큐를 지정합니다.

이제 블루프린트에서 이 소리들을 제어합니다. 날씨와 시간을 관리하는 블루프린트에서 각 앰비언트 사운드 액터를 가리키는 참조를 만들고, 그 액터의 오디오 컴포넌트에서 Set Volume Multiplier로 볼륨을 바꾸거나 Play와 Stop으로 재생하고 멈춥니다. 예를 들어 비 오는 상태에서는 빗소리 사운드 큐의 볼륨을 높이고, 맑은 날에는 볼륨을 0으로 낮춥니다. 천둥소리는 비 오는 상태에서 무작위 간격으로 재생되게 할 수 있습니다.

바닥에 따라 바뀌는 발소리

원한다면 비 오는 날에 캐릭터의 발소리가 젖은 바닥이나 웅덩이를 밟는 소리로 바뀌게 할 수도 있습니다. 바닥의 물리 재질에 표면 타입(Surface Type)을 지정하고, 발이 닿은 바닥의 표면 타입에 따라 다른 소리를 재생하는 방식입니다. 물리 재질은 물리 재질 설정 및 최적화에서 다룹니다.


게임 플레이와 연결하기

여기서 다루는 것은 직접 구현해야 하는 게임 플레이 규칙입니다. 렌더링의 안개나 어두운 노출만으로 AI의 감지 거리나 캐릭터의 마찰, 발소리 판정이 저절로 바뀌지는 않습니다.

플레이어 캐릭터

비나 눈이 올 때 플레이어를 느리게 하려면 Character Movement Component의 Max Walk Speed를 낮춥니다. 안개나 밤에 시야를 좁히려면 후처리 볼륨의 노출을 낮추고 짙은 안개를 적용합니다. 시야가 나쁜 날씨에서는 HUD에 습기 찬 화면 효과를 더하거나 경고 UI를 띄울 수도 있습니다.

NPC와 AI

밤에만 나타나는 적이나 특정 날씨에만 활동하는 동물처럼, 시간과 날씨에 따라 NPC를 생성하거나 없앨 수 있습니다. 비나 눈이 올 때 NPC가 우산을 쓰거나, 실내로 피하거나, 순찰 경로를 바꾸게 할 수도 있습니다. 밤이나 안개 낀 날에 AI의 시야 범위를 줄이고, 빗소리 때문에 플레이어의 발소리가 묻히게 하면 잠입 플레이에 영향을 줄 수 있습니다. 이런 감지 규칙은 AI의 인지 설정을 직접 바꿔야 적용되며, AI Perception으로 시각과 청각을 설정하는 방법은 기본 센서 시스템 구현 (시각, 청각)에서 다룹니다.

환경과의 상호작용

비가 올 때 재질을 바꿔 바닥에 웅덩이가 생기게 하거나, 눈이 올 때 스태틱 메시를 더해 눈이 쌓이게 할 수 있습니다. 비가 온 뒤에만 얻을 수 있는 자원이나 아이템을 배치하는 것도 날씨를 게임 플레이에 쓰는 방법입니다.


최종 값을 한곳에서 적용하기

여러 시스템이 같은 광원이나 노출 값을 각자 직접 쓰면, 서로 덮어써서 결과가 실행 순서에 따라 달라집니다. 그래서 최종 값을 적용하는 관리 지점을 하나로 정합니다. 아래 그림은 이 글에서 제안하는 구현 구조이며, 엔진이 자동으로 이렇게 연결해 주는 기능은 아닙니다.

ENVIRONMENT STATE · APPLY

최종 적용 지점을 하나로 정해 값의 충돌을 막습니다

날씨와 시간을 합성해 시각·소리와 게임 규칙에 각각 전달합니다. 렌더링 안개나 어두운 노출이 AI 감지·이동 규칙을 자동으로 바꾸지는 않습니다.

환경 상태의 입력과 적용 대상날씨 상태와 게임 시각이 관리 블루프린트에 들어간다. 관리 지점은 목표 값과 전환 시작을 정해 시각·소리 파라미터 및 게임 규칙·UI에 전달한다. 시각 변화가 게임 규칙을 자동으로 변경하는 연결은 없다.날씨 상태맑음 · 비 · 눈게임 시각0 ≤ h < 24관리 블루프린트목표 값 · 전환 시작최종 적용 책임시각 · 소리설정값 적용게임 규칙 · UI별도 로직 적용
환경 상태의 입력과 두 적용 대상날씨와게임시각은관리블루프린트의입력이다. 관리지점은목표값과전환시작을정해시각·소리와게임규칙·UI에각각전달한다.시각효과에서게임규칙으로향하는자동변경간선은없다.날씨 상태맑음 · 비눈게임 시각0 ≤ h < 24관리 블루프린트목표 값 · 전환 시작최종 적용 책임시각 · 소리설정값 적용게임 규칙 · UI별도 로직 적용

직접 구현할 관리 구조입니다. 목표 값은 Data Table·커브에 보관하고, 보간 로직과 게임 규칙의 전환 시점은 별도로 정합니다.

위 그림은 환경 상태의 입력과, 그것이 적용되는 두 대상을 보여 줍니다. 왼쪽의 날씨 상태(맑음, 비, 눈)와 게임 시각(0 이상 24 미만의 h)이 관리 블루프린트로 들어갑니다. 관리 블루프린트는 두 입력을 합쳐 목표 값과 전환을 시작할 시점을 정하고, 오른쪽의 두 대상에 각각 전달합니다. 하나는 시각과 소리로 설정값을 적용하는 쪽이고, 다른 하나는 게임 규칙과 UI로 별도의 로직을 적용하는 쪽입니다.

그림의 설명이 짚듯이 시각 효과에서 게임 규칙으로 향하는 화살표는 없습니다. 렌더링의 안개나 어두운 노출이 AI 감지나 이동 규칙을 저절로 바꾸지 않기 때문입니다. 그림 아래의 주석처럼, 목표 값은 데이터 테이블이나 커브에 보관하고, 그 값으로 옮겨 가는 보간 로직과 게임 규칙이 바뀌는 시점은 따로 정합니다.

관리 구조를 이루는 것

모든 날씨와 시간 관련 액터의 참조와 로직은 BP_WeatherTimeSystem 같은 블루프린트 하나에서 관리합니다. 시간이나 날씨 상태에 따른 조명의 강도와 색, 안개 밀도 같은 값은 데이터 테이블(Data Table)이나 커브 에셋(Curve Asset)에 저장해 두면, 블루프린트의 로직이 단순해지고 값을 고치기도 쉬워집니다. 데이터 테이블을 만들고 블루프린트에서 행을 읽는 방법은 데이터 테이블과 블루프린트 연동에서 다룹니다.

데이터 테이블은 목표 값을 보관할 뿐, 시간에 따라 값을 옮겨 가는 보간을 스스로 하지는 않습니다. 그래서 커브나 보간 로직으로 지금 값에서 목표 값으로 옮겨 가게 하고, 게임 규칙이 바뀌는 시점은 UI 알림과 함께 정합니다. 실내에 들어가거나 컷신이 재생되는 것 같은 예외는 우선순위를 정해 적용합니다. 시각과 소리, 규칙이 늘 같은 길이로 보간될 필요는 없지만, 기준이 되는 상태와 전환을 시작하는 시점은 함께 써야 서로 어긋나지 않습니다.

최종 값을 한 번만 쓰는 이유

예를 들어 시간 커브가 광원 강도 1000을 만들고, 비 상태가 그 값에 0.7배를 적용하도록 설계했다고 합시다. 관리 지점에서 1000 × 0.7 = 700을 계산해 한 번만 적용하면 결과는 늘 700입니다. 반대로 시간 블루프린트는 1000을, 날씨 블루프린트는 700을 매 프레임 각자 쓴다면, 마지막에 실행된 쪽의 값이 남으므로 실행 순서에 따라 화면이 1000이 되기도 하고 700이 되기도 합니다. 그래서 두 입력을 같은 상태에서 함께 계산한 뒤 최종 값을 한 번만 씁니다.

품질과 성능

표현마다 품질을 따로 조절합니다. 나이아가라는 이펙트 타입과 스케일러빌리티로 생성과 컬링을 조절하고, 구름은 샘플 수와 추적 범위 같은 구름 전용 품질 설정을 씁니다. 이것은 일반 메시의 LOD와는 다른 설정입니다. 모바일이나 저사양 플랫폼이라면 볼류메트릭 안개와 구름 대신 지수형 높이 안개와 간단한 2D 구름 텍스처를 쓰거나, 실시간 그림자를 줄이는 대안을 검토합니다. 그리고 Stat FPS, Stat Unit, ProfileGPU 같은 콘솔 명령으로 주기적으로 병목을 확인합니다.


정리

  • 날씨와 시간은 조명, 안개, 구름, 후처리, 소리가 함께 바뀌어야 자연스럽고, 비 오는 밤은 낮의 비와 다른 값이 필요합니다.
  • 스카이 라이트는 Real Time Capture나 필요한 때의 Recapture로 갱신하고, 후처리의 Ambient Cubemap을 루멘 글로벌 일루미네이션과 같은 기능으로 보지 않습니다.
  • 환경음은 앰비언트 사운드 액터와 사운드 큐로 깔고, 오디오 컴포넌트의 Set Volume Multiplier와 Play, Stop으로 상태에 맞게 제어합니다.
  • 이동 속도, AI 감지, 발소리 같은 게임 플레이 규칙은 렌더링 효과로 저절로 바뀌지 않으므로 직접 연결합니다.
  • 최종 값은 관리 지점 하나에서 계산해 한 번만 적용해야, 여러 시스템이 서로 덮어써 실행 순서에 따라 결과가 바뀌는 일을 막을 수 있습니다.
  • 목표 값은 데이터 테이블이나 커브에 보관하고, 보간과 규칙 전환 시점은 따로 정하며, 예외는 우선순위로 처리합니다.

연습 문제

1. 젖은 노면과 이동 속도

비가 시작되어 노면이 젖어 보이게 만들었습니다. 이것만으로 캐릭터의 Max Walk Speed도 줄어들까요? 속도를 줄이기로 했다면, 맑은 날로 돌아갈 때 무엇을 조심해야 할까요?

해설 보기

줄어들지 않습니다. 노면이 젖어 보이는 것은 재질의 변화일 뿐, 이동 규칙을 바꾸지 않습니다.

속도를 줄이기로 했다면 같은 날씨 전환 이벤트에서 Character Movement의 Max Walk Speed에 값을 따로 넘깁니다. 이때 맑음으로 돌아갈 때 되돌릴 기본 속도를 따로 보관해 둡니다. 날씨가 바뀔 때마다 지금의 속도에 감소 비율을 다시 곱하면, 비가 여러 번 올수록 캐릭터가 점점 느려지는 문제가 생깁니다.

2. 실행할 때마다 다른 밝기

시간 블루프린트가 매 프레임 디렉셔널 라이트의 강도를 1000으로, 날씨 블루프린트가 비 오는 동안 같은 광원의 강도를 700으로 정하고 있습니다. 비 오는 낮에 화면의 밝기가 실행할 때마다 다르게 보입니다. 왜 그럴까요? 어떻게 고쳐야 할까요?

해설 보기

두 블루프린트가 같은 광원 값을 각자 쓰므로, 그 프레임에 마지막으로 실행된 쪽의 값이 남습니다. 실행 순서가 정해져 있지 않으면 1000이 되기도 하고 700이 되기도 합니다.

최종 값을 적용하는 관리 지점을 하나로 정하고, 그곳에서 시간 커브의 값 1000과 비 상태의 배율 0.7을 함께 계산한 700을 한 번만 적용합니다. 두 블루프린트는 광원에 직접 쓰지 않고, 관리 지점에 입력만 넘깁니다.

3. 안개 속에서도 적이 플레이어를 본다

밤에 짙은 안개를 깔고 노출도 어둡게 해서 화면에서는 거의 아무것도 보이지 않습니다. 그런데 적 AI는 맑은 낮과 같은 거리에서 플레이어를 발견합니다. 무엇이 빠졌을까요?

해설 보기

안개와 노출은 플레이어의 화면에 보이는 렌더링 효과일 뿐, AI의 감지 규칙을 바꾸지 않습니다. AI는 화면을 보는 것이 아니라 자기의 인지 설정에 따라 플레이어를 감지합니다.

밤이나 안개 낀 날에 적의 시야를 줄이려면, 날씨와 시간의 전환 이벤트에서 AI의 감지 거리 같은 인지 설정을 직접 바꾸는 규칙을 연결해야 합니다. 그 규칙도 관리 지점에서 같은 상태를 보고 함께 바꾸면 화면과 어긋나지 않습니다.

다음 글 동적 환경 변화와 시뮬레이션에서는 날씨와 시간에 따라 지면이 젖고 눈이 쌓이는 것처럼, 환경 자체가 시간에 걸쳐 바뀌는 변화를 시뮬레이션하는 방법을 다룹니다.