날씨 시스템 설정
비·눈·안개·구름과 조명·오디오 요소를 묶어 날씨 상태를 만들고 블루프린트로 자연스럽게 전환합니다.
조명과 그림자의 기반을 갖췄다면 이제 월드를 움직이게 만드는 날씨를 다룰 차례입니다. 날씨는 배경을 꾸미는 데서 끝나지 않고, 플레이의 리듬과 감정에 직접 영향을 줍니다. 같은 맵이라도 맑은 날과 비 오는 날, 안개 낀 날에 따라 길을 찾는 난이도와 몰입감이 크게 달라집니다.
이 글에서는 날씨가 게임에서 하는 일을 정리한 뒤, 날씨를 이루는 안개와 구름, 강수 파티클을 살펴봅니다. 그다음 블루프린트로 날씨 상태를 정의하고, 먼저 안개 하나만으로 두 상태가 다르게 적용되는지 확인하는 작은 실습을 합니다. 마지막으로 후처리와 사운드로 날씨를 강화하는 방법과 성능을 위한 주의점을 정리합니다.
날씨가 게임에서 하는 일
날씨는 레벨에 시각적인 변화를 주는 것 말고도 여러 일을 합니다. 비, 눈, 안개, 천둥 같은 사실적인 날씨는 플레이어가 게임 세계에 더 깊이 빠져들게 돕고, 분위기와 감정도 바꿉니다. 맑은 날은 평화로움을, 비 오는 날은 우울함이나 긴장감을, 눈 오는 날은 고요함이나 신비로움을 만들 수 있습니다.
게임 플레이에도 영향을 줄 수 있습니다. 안개나 폭우, 눈보라는 시야를 가려 난이도를 높이거나 플레이어를 특정 길로 이끌 수 있습니다. 비나 눈 때문에 땅이 미끄러워지거나 이동 속도가 느려지게 할 수도 있고, 물이 차오르거나 얼음이 어는 것처럼 환경과의 상호작용을 일으킬 수도 있습니다. 같은 레벨을 다른 날씨에서 다시 플레이하면 새로운 경험이 되므로, 다시 플레이할 가치도 높아집니다.
다만 이런 게임 플레이의 변화는 날씨 효과를 켠다고 저절로 생기지 않는다는 점을 기억해 둡니다. 비 파티클을 켰다고 지면의 마찰이나 적 AI의 감지 규칙이 바뀌지는 않으므로, 그런 반응은 따로 로직으로 연결해야 합니다.
날씨를 이루는 요소
지수형 높이 안개
지수형 높이 안개(Exponential Height Fog)는 레벨 전체에 안개를 더합니다. 밀도와 높이, 색을 조절해 옅은 안개, 짙은 안개, 땅에 깔리는 안개 같은 여러 종류를 만들 수 있어서, 흐린 날이나 안개 낀 날, 미세먼지가 가득한 날을 표현하는 데 빠지지 않습니다. 디테일 패널에서는 안개의 밀도인 Fog Density, 높이에 따라 밀도가 줄어드는 정도인 Fog Height Falloff, 빛이 흩어지는 안개의 색인 Fog Inscattering Color, 안개가 시작되는 거리인 Start Distance를 주로 조절합니다. 각 설정은 환경 효과 (안개, 조명) 추가에서 자세히 다뤘습니다.
볼류메트릭 클라우드
볼류메트릭 클라우드(Volumetric Cloud)는 사실적인 3D 구름을 만듭니다. 구름의 밀도와 높이, 형태를 조절해 맑은 하늘의 솜털 구름부터 폭풍 전야의 먹구름까지 표현할 수 있어서, 날씨의 시각적 배경을 맡고 특히 흐린 날이나 폭풍우에서 중요합니다. 조명과 상호작용해 땅에 구름 그림자를 드리우고 햇빛을 가립니다.
디테일 패널의 Material에는 구름의 형태와 밀도를 정하는 재질을 지정합니다. 구름의 밀도나 하늘을 덮는 정도는 그 재질이 노출한 파라미터로 조절하는데, 이름과 범위는 고른 재질에 따라 다릅니다. Layer Bottom Altitude와 Layer Height는 구름 층이 시작되는 높이와 두께입니다. 구름 그림자는 디렉셔널 라이트의 Cast Cloud Shadows나 Cloud Shadow Strength 같은 광원 설정과 함께 조절합니다.
강수 파티클
비, 눈, 우박처럼 공중에서 떨어지는 물방울이나 입자는 파티클 시스템으로 표현합니다. 날씨를 가장 직접적으로 보여 주는 요소입니다. 언리얼 엔진 5에서는 나이아가라(Niagara)로 파티클을 만듭니다.
만드는 과정은 다음과 같습니다. 콘텐츠 브라우저를 오른쪽 클릭하고 FX에서 Niagara System을 골라 나이아가라 시스템을 만듭니다. UE 5.8에서는 콘텐츠 브라우저의 오른쪽 클릭 메뉴 분류가 정리되었으므로, 메뉴가 보이지 않으면 검색으로 찾습니다. 빈 시스템이나 설치된 버전이 제공하는 이미터 템플릿에서 시작하며, Simple Rain이나 Simple Snow 같은 완성된 템플릿이 기본으로 들어 있다고 전제하지 않습니다.
나이아가라 에디터에서 생성 속도(spawn rate), 크기, 색, 충돌 같은 물리 시뮬레이션, 재질을 조절해 원하는 비나 눈의 모양을 만듭니다. 완성한 시스템은 레벨에 끌어다 놓는데, 넓은 레벨 전체에 비를 뿌리면 비용이 크므로 보통 플레이어 캐릭터 주변에 두고 플레이어를 따라 움직이게 블루프린트로 설정합니다.
블루프린트로 날씨 바꾸기
여기서는 날씨 전환을 블루프린트로 만듭니다. C++로도 같은 구조를 만들 수 있습니다.
날씨를 관리할 블루프린트 만들기
먼저 날씨를 한곳에서 관리할 블루프린트를 만듭니다. 콘텐츠 브라우저를 오른쪽 클릭해 Blueprint Class를 고르고, 부모 클래스로 Actor를 골라 BP_WeatherSystem 같은 이름을 붙입니다. 만든 BP_WeatherSystem은 레벨에 하나 배치합니다.
날씨 액터 참조하기
BP_WeatherSystem 안에서 날씨 액터들의 속성을 바꾸려면, 먼저 그 액터들을 가리키는 참조가 필요합니다. 클래스 블루프린트에 ExponentialHeightFog 타입의 오브젝트 참조(Object Reference) 변수를 만들고 Instance Editable을 켭니다. 그러면 레벨에 배치한 BP_WeatherSystem의 디테일 패널에서 실제 안개 액터를 이 변수에 지정할 수 있습니다. 이것은 아웃라이너의 액터를 바로 참조로 끌어오는 레벨 블루프린트의 방식과 다른 절차입니다. VolumetricCloud 액터와 강수용 나이아가라 시스템도 같은 방식으로 참조 변수를 만듭니다.
값을 바꾸는 노드
날씨를 서서히 바꾸고 싶다면 타임라인(Timeline) 노드를 씁니다. 예를 들어 맑음에서 비로 바뀔 때, 안개 밀도와 구름이 하늘을 덮는 정도, 비 파티클의 생성 속도를 시간에 따라 조금씩 바꿉니다. 일정 시간마다 날씨를 바꾸고 싶다면 타이머(Timer) 노드를 쓸 수 있습니다.
실제로 값을 넣는 방법은 요소마다 다릅니다. 안개는 안개 액터에서 Exponential Height Fog 컴포넌트를 얻어 Set Fog Density를 호출합니다. 구름은 실행 중에 쓰는 동적 재질 인스턴스나 재질 파라미터 컬렉션(Material Parameter Collection, MPC)에 노출한 파라미터를 바꿉니다. 모든 구름에 쓸 수 있는 공통 Set Coverage 노드가 따로 있는 것은 아닙니다.
나이아가라는 User.RainRate 같은 사용자 파라미터를 만들어 이미터의 Spawn Rate 입력에 연결한 뒤, 나이아가라 컴포넌트의 변수 설정 노드로 값을 넘깁니다. 이때 파라미터를 Spawn Rate에 연결하지 않은 채 이름만 정해 값을 넣으면, 값은 들어가도 생성 속도는 바뀌지 않습니다. 사용자 파라미터를 만들고 블루프린트에서 값을 넘기는 과정은 나이아가라 교재의 블루프린트 제어에서 자세히 다룹니다.
날씨 상태 정의하기
날씨의 종류는 열거형(Enumeration)으로 정의하고, Switch on Enum 노드로 상태마다 다른 효과를 적용합니다. 콘텐츠 브라우저를 오른쪽 클릭해 Blueprint의 Enumeration을 고르고 E_WeatherState 같은 이름을 붙인 뒤, 열거형 에디터에서 Clear, Rainy, Foggy, Snowy처럼 원하는 날씨 상태를 추가합니다.
BP_WeatherSystem에는 E_WeatherState 타입의 CurrentWeatherState 변수를 만듭니다. 날씨를 바꾸는 이벤트의 실행 핀을 Switch on E_WeatherState에 연결하고, 지금 상태를 선택 값으로 넘긴 뒤, 각 분기에서 안개와 구름, 강수의 목표 값을 정합니다. 여기서 흔히 하는 오해가 있습니다. 열거형 변수에 값을 넣는 것만으로 Switch가 저절로 실행되지는 않습니다. 정해진 시간이 되거나 플레이어가 상호작용하는 것 같은 이벤트가 생기면 CurrentWeatherState의 값을 바꾸고, 그다음 Switch를 거치는 실행 흐름을 다시 실행해야 날씨 효과가 갱신됩니다.
안개 하나로 두 날씨 시험하기
처음부터 강수와 구름까지 한꺼번에 제어하면, 값이 안 바뀔 때 어디가 문제인지 찾기 어렵습니다. 그래서 먼저 안개 하나로 실행 흐름이 제대로 이어지는지 확인합니다. 아래 수치는 동작을 비교하기 위한 예시일 뿐, 모든 장면에 권장하는 밀도는 아닙니다.
먼저 참조와 처음 상태를 준비합니다. 시험 레벨에 지수형 높이 안개와 BP_WeatherSystem을 하나씩 두고, 앞에서 만든 안개 참조 변수에 실제 안개 액터를 지정합니다. CurrentWeatherState도 Instance Editable로 표시해, 시험할 처음 상태를 레벨에서 고를 수 있게 합니다.
다음으로 적용 이벤트를 연결합니다. ApplyWeather라는 커스텀 이벤트(Custom Event)를 만들고, 그 실행 핀을 Switch on E_WeatherState에 연결한 뒤 선택 입력에 CurrentWeatherState 값을 연결합니다. 그리고 안개 참조가 지정되어 있는지 확인해, 지정되지 않았다면 그 참조로 컴포넌트 함수를 호출하지 않게 합니다. 비어 있는 참조로 함수를 부르면 오류가 나기 때문입니다.
이제 분기마다 안개 밀도를 넣습니다. Clear 분기에는 안개 컴포넌트를 Target으로 하는 Set Fog Density를 두고 Value를 0.01로 정하고, Rainy 분기에는 같은 대상에 Value를 0.04로 정합니다. 열거형의 선택 핀과 흰색 실행 핀을 모두 연결해야, 어떤 값을 고를지와 실제로 함수를 호출하는 흐름이 이어집니다.
마지막으로 시작하고 다시 시험합니다. BeginPlay에서 ApplyWeather를 호출하게 하고 Compile과 Save를 합니다. Clear로 실행한 화면을 기록한 뒤 Stop하고, 레벨에 놓인 인스턴스의 처음 상태를 Rainy로 바꿔 다시 실행합니다. 이때 카메라와 조명, 노출은 그대로 둡니다. 이 실습은 시작 상태를 비교하는 연습이고, 실행 중에 상태를 바꾸는 입력 이벤트까지 만든 것은 아닙니다.
두 상태가 다르게 적용되는 것을 확인했다면 타임라인으로 값을 서서히 바꾸는 보간과 구름, 나이아가라 사용자 파라미터를 하나씩 연결해 나갑니다. 값이 바뀌지 않으면 이벤트가 호출되었는지, 상태가 제대로 선택되었는지, 참조가 유효한지, 컴포넌트가 Target에 연결되었는지를 이 순서로 확인합니다.
날씨를 강화하고 비용 지키기
후처리로 분위기 맞추기
날씨가 바뀔 때 후처리 볼륨의 색 보정, 노출, 블룸 같은 값도 함께 바꾸면 분위기가 더 살아납니다. 예를 들어 비 오는 날에는 채도를 낮추고 노출을 어둡게 하고, 안개 낀 날에는 블룸을 강조합니다. 블루프린트에서는 Set Members in PostProcessSettings로 바꿀 항목의 override를 켜고 값을 정한 뒤, 바꾼 구조체를 대상 볼륨의 Settings에 넣어 적용합니다.
소리 더하기
비 소리, 천둥소리, 바람 소리처럼 날씨에 맞는 소리를 더하면 몰입감이 크게 높아집니다. 사운드 큐(Sound Cue) 같은 사운드 에셋을 배치하고, 블루프린트에서 날씨 상태에 따라 볼륨을 바꾸거나 재생하고 멈춥니다. 앰비언트 사운드(Ambient Sound) 액터를 쓰면 레벨에 배경 소리를 깔 수 있습니다.
성능을 위한 주의점
강수 파티클은 생성 속도와 수명으로 동시에 살아 있는 입자의 수를 제한합니다. 나이아가라의 이펙트 타입(Effect Type)과 스케일러빌리티 설정으로 거리나 가시성에 따라 파티클을 걸러 내고, 플랫폼마다 생성 배율을 다르게 줄 수 있습니다. 볼류메트릭 클라우드는 목표 플랫폼에 맞게 품질을 조절해야 하며, 높은 품질은 비용이 큽니다. 안개도 볼류메트릭 안개 대신 일반 지수형 높이 안개를 쓰면 훨씬 효율적입니다. 날씨 효과의 비용은 날씨 효과의 성능 최적화에서 자세히 다룹니다.
날씨를 만들었다면 대표적인 날씨마다 시야와 프레임 비용을 확인합니다. 그리고 앞에서 말했듯이 비를 내리게 한 것만으로 지면의 마찰이나 AI 감지 규칙이 바뀌지는 않으므로, 날씨에 따른 게임 플레이의 반응은 따로 연결합니다.
정리
- 날씨는 몰입감과 분위기, 시야와 이동 같은 게임 플레이에 영향을 주지만, 게임 플레이의 반응은 효과를 켠다고 저절로 생기지 않고 따로 연결해야 합니다.
- 지수형 높이 안개는 밀도와 높이 분포로, 볼류메트릭 클라우드는 재질의 파라미터와 층 위치로, 강수는 나이아가라 파티클로 표현합니다.
BP_WeatherSystem에 Instance Editable 참조 변수를 만들어 레벨의 실제 날씨 액터를 지정합니다.- 안개는
Set Fog Density로, 구름은 재질 파라미터나 MPC로, 나이아가라는 Spawn Rate에 연결한 사용자 파라미터로 값을 바꿉니다. - 날씨 상태는 열거형으로 정의하고
Switch on Enum으로 분기하며, 변수 값을 바꾸는 것만으로 Switch가 실행되지는 않습니다. - 처음에는 안개 하나로 두 상태를 비교해 실행 흐름을 확인하고, 이벤트 호출, 상태 선택, 참조, Target 순서로 문제를 찾습니다.
- 후처리와 사운드로 분위기를 강화하고, 파티클 수와 구름 품질, 볼류메트릭 안개의 비용을 관리합니다.
연습 문제
1. 상태를 바꿨는데 안개가 그대로
실행 중에 키를 누르면 CurrentWeatherState를 Rainy로 바꾸도록 만들었는데, 키를 눌러도 안개가 짙어지지 않습니다. ApplyWeather 이벤트와 Switch는 BeginPlay에서 잘 동작했습니다. 무엇이 빠졌을까요?
해설 보기
열거형 변수의 값을 바꾸는 것만으로는 Switch가 실행되지 않습니다. BeginPlay에서는 ApplyWeather를 호출했기 때문에 동작했지만, 키 입력에서는 변수만 바꾸고 ApplyWeather를 다시 호출하지 않았습니다.
키를 눌렀을 때 CurrentWeatherState를 바꾼 다음 ApplyWeather를 호출하도록 연결하면, Switch가 다시 실행되어 Rainy 분기의 Set Fog Density가 호출됩니다.
2. 값은 들어가는데 비가 그대로
나이아가라 컴포넌트에 User.RainRate 값을 100에서 1000으로 바꿔 넣었는데, 화면의 비는 전혀 늘지 않습니다. 무엇을 확인해야 할까요?
해설 보기
User.RainRate 사용자 파라미터가 이미터의 Spawn Rate 입력에 실제로 연결되어 있는지 확인합니다. 파라미터를 만들고 값을 넣어도, Spawn Rate가 그 파라미터를 읽지 않으면 생성 속도는 바뀌지 않습니다.
연결되어 있다면 값을 넣는 노드의 파라미터 이름이 정확히 같은지, 그리고 값을 넣는 대상이 레벨에 실제로 보이는 그 나이아가라 컴포넌트인지 확인합니다.
3. 비가 오면 미끄러워야 하는데
비 오는 날씨에서 캐릭터가 미끄러지게 하려고, Rainy 분기에서 비 파티클을 켜고 안개도 짙게 했습니다. 그런데 캐릭터의 움직임은 맑은 날과 똑같습니다. 왜 그럴까요?
해설 보기
비 파티클과 안개는 보이는 효과일 뿐, 캐릭터의 이동이나 지면의 마찰을 바꾸지 않습니다. 날씨 효과를 켠다고 게임 플레이의 규칙이 저절로 바뀌지는 않습니다.
캐릭터를 미끄러지게 하려면 Rainy 분기에서 캐릭터 무브먼트 컴포넌트(Character Movement Component)의 마찰 관련 값을 바꾸거나 지면의 물리 재질을 바꾸는 것처럼, 게임 플레이의 반응을 따로 연결해야 합니다. 물리 재질은 물리 재질 설정 및 최적화에서 다룹니다.
나이아가라 시스템을 만드는 방법은 Epic의 나이아가라 개요에서 확인할 수 있습니다.
다음 글 시간 시스템과 주기 조정에서는 날씨와 밀접하게 연결되는 시간 시스템을 만들어, 낮과 밤의 주기를 정하고 태양의 움직임을 시간에 맞추는 방법을 다룹니다.