Unreal day and night cycle
Unreal Day and Night
Created Jul 10, 2024 - Last updated: Jul 10, 2024
들어가며
게임을 만들다보면 자연스럽게 낮과 밤이 모두 필요합니다.
이번에는 언리얼에서 자연스럽게 시간에 따라 이 낮과 밤을 전환하고 밤에는 달과 별이 보이는 풍경을 만들어보려고 했습니다.
Create Day/Night Cycle 영상을 참고하여 구현해보았습니다.
1. BP_DayNightCycle 구현하기
우선 레벨에서의 낮과 밤 조명을 책임지는 블루프린트임 BP_DayNightCycle을 만듭니다. 구성은 아래와 같습니다.

DirectionalLight는 낮의 태양빛을 나타내고 DirectionalLight_Moon은 밤의 달빛을 나타내게 됩니다. 그래서 DirectionalLight_Moon의 경우 세기를 좀 낮춰주고 색온도를 120000정도로 주었습니다.
Skylight의 경우 레벨에 전반적인 간접조명을 제공해주고, SkyAtmosphere는 대기효과를 렌더링해줍니다. VolumetricCloud는 구름을 생성해주고요.
이렇게 하면 기본적으로 낮과 밤을 위한 BP_DayNightCycle 클래스는 완성한 셈입니다.
2. 시간에 따라 Directional Light 회전시키기
이제 빛은 구현이 되었으니 시간에 따라 Light를 회전시키면 됩니다. 이 시간을 구현하기 위해 Timeline 노드를 사용하게 됩니다.

Timeline 노드는 0부터 24의 값을 계속 순환하게 하였고, 그 시간값을 받아서 시간에 따른 각도를 계산하여 햇빛과 달빛이 적당한 각도로 비춰질수 있도록 설정하였습니다.
3. PostProcessVolume
Light를 두 종류로 나눠놓고 시간에 따라 다른 Light가 보이게한다 하더라도 언리얼 엔진의 auto exposure기능때문에 밤에도 매우 밝게됩니다.
이는 밝든 어둡든 적당하도록 조정해주는 기능인데요. 이것을 막고 우리가 원하는 낮과 밤을 구현하기 위해서는 두 가지 방법이 있습니다.
하나는 project setting에서 auto exposure기능을 끄는 것이고 하나는 postprocessvolume을 이용하는 것입니다.
postprocessvolume을 레벨에 놓고 unbound로 설정하여 레벨 전체에 적용되게 하면 우리가 원하는 밤이 완성됩니다.


4. SkySphere
마지막으로 별과 달을 추가하고 싶은데 이것들을 추가하기 위해서는 새로 SkySphere를 레벨에 넣어주어야합니다. SkySphere를 통해 하늘과 관련된 여러가지 설정을 해줄 수 있기때문입니다.
우선 레벨에 SkySphere를 배치하고 크기를 크게해서 레벨을 덮게합니다. 그 후 아래와 같이 material을 새로 만들어서 사용하게 합니다.

그런데 이렇게만하면 하늘이 검은색으로 보이게 되므로 아래와 같이 material graph에서 작업해준 결과를 emission color에 넣어줍니다.

SkyAtmosphereViewLuminance는 기본적인 하늘의 휘도를 나타내며 LightDiskLuminance는 특정 광원의 휘도를 나타냅니다. 그러므로 세개를 더하면 emission color에 주게되면 하늘색에 태양이나 달이 나타나게 할 수 있습니다.
5. Stars
별을 나타내기위해서는 Skysphere의 Material graph에 별과 관련된 항목을 추가해주어야합니다.

위의 그래프를 보면 Star Texture에 우선 StarBrightness를 곱해서 별이 얼마나 빛날지 정해준 뒤, 어떤 값과 곱해줍니다.
이 값은 하늘이 어두우면 커지고 하늘이 밝아지면 작아지는 값으로 달이 없는 밤하늘에서만 별이 잘 보이도록 해준 것입니다.
우선 SkyAtmosphereViewLuminance로 하늘색을 가져오고, Desaturation으로 색을 빼고 세기만 가져옵니다.
이후 StarBelndMinDarkness값을 곱해서 별이 보이기위한 최소한의 어둠크기를 정해줍니다.
마지막으로 Saturate로 크기를 한정해준 뒤 1-x를 통과시켜 반전시키면 별빛에 곱할 값이 됩니다.
그러면 최종적으로 아래와 같은 모습을 얻을 수 있게 됩니다.
