주녘공부일지

[Unity - Issue Memo] 런타임에서 SkyBox 변경 시, Lighting, Fog 세팅이 갱신이 되지 않는 이슈 본문

GameDevelopment/[Unity] Issue Memo

[Unity - Issue Memo] 런타임에서 SkyBox 변경 시, Lighting, Fog 세팅이 갱신이 되지 않는 이슈

주녘 2024. 12. 8. 20:09

1. 발생한 이슈

런타임에서 각 스테이지에 따라 다른 SkyBox, Ohter Settings의 Fog 세팅 값을 변경해야 하는 상황에서 발생한 이슈로, SkyBox를 런타임에 세팅했을 때, Lighting, Fog 값이 갱신 및 적용되지 않아 화면이 어두워지는 현상이 발생

2. 발생 원인 - 전역 조명(GI)

- Lighting이 어두워지는지는 이유는 전역 조명(GI)에 있다고 함

https://discussions.unity.com/t/loading-scene-additively-causes-change-in-lighting/687635

위 링크 내용에 따르면, 유니티의 스카이박스는 Light를 "Sun"으로서 하늘을 어떻게 렌더링할지 정한다고 함

+ 스카이박스가 렌더링되고 Lighting이 계산되는데, 이 때 Sun이 비활성화 상태이면 전역 조명(GI)이 제대로 계산되지 않아서 이슈가 발생한 게 아닌가 추측

3. 이슈 해결책

1) Auto Generate 활성화

- Skybox는 SkyManager에 의해 컨트롤 된다고 함

- 매뉴얼에 따르면 Auto Generate를 활성화하면 해결할 수 있음

https://docs.unity3d.com/kr/2021.3/Manual/using-skymanager.html

 

SkyManager - Unity 매뉴얼

Unity에는 환경 조명이 기본적으로 씬에 영향을 미치도록 만드는 전용 관리자인 SkyManager가 포함되어 있습니다. SkyManager는 주변광 프로브 및 기본 반사 프로브를 자동으로 생성하여 환경 조명을

docs.unity3d.com

LightingSettings lightingSettings = new LightingSettings();
lightingSettings.autoGenerate = true;
Lightmapping.lightingSettings = lightingSettings;

2) DynamicGI.UpdateEnvironment(); // 채택

- RenderSettings을 마친 후 명시적으로 호출함으로써 환경 큐브을 업데이트(예약)하여 해결 가능

- 바로 업데이트 하는 것이 아닌 예약하는 것이므로, 1프레임 이상 지연될 수 있다고 하니 주의하여 사용

https://docs.unity3d.com/6000.0/Documentation/ScriptReference/DynamicGI.UpdateEnvironment.html

 

Unity - Scripting API: DynamicGI.UpdateEnvironment

When you use this signature, Unity schedules an update of the environment cubemap. Query SystemInfo.supportsAsyncGPUReadback to determine if the system currently running Unity supports asynchronous readbacks. If the system supports these readbacks, Unity r

docs.unity3d.com

RenderSettings.skybox = skyboxMaterial;
RenderSettings.ambientIntensity = 1f;
RenderSettings.reflectionIntensity = 1f;
RenderSettings.fog = true;
RenderSettings.fogColor = Util.HexColor("#1697DD");
RenderSettings.fogMode = FogMode.ExponentialSquared;
RenderSettings.fogDensity = 0.002f;

DynamicGI.UpdateEnvironment();

4. Before & After

- 오랜만에 오래 삽질한 이슈였는데, 코드 한 줄로 해결되어 조금 허무한 감도 있지만 해결하여 뿌듯했다.

- 처음에는 무엇이 문제인지를 식별하는 것 자체가 어려워 검색하기도 어려웠던 것 같다.

해결 전
해결 후