Unity에서 Scene을 전환하기 위해선 SceneManager.LoadScene("씬 이름")으로 전환을 해왔다. 그런데 이 기능은 씬이 다 로드되기 전까지 동안 랙이 걸리듯 장면이 멈춰버리는 문제가 있다. 그래서 이러한 문제를 해결하기 위해 찾아본 것이 바로 LoadSceneAsync이다.
LoadSceneAsync는 기존 씬의 동작을 유지한 채 백그라운드에서 새로운 씬을 로드하는 방식이다. 즉, 비동기적으로 씬을 불러와 게임이 멈추지 않고 이어지도록 하는 방식이다.

쓰기 위한 예시 코드는 다음과 같다
LoadSceneAsync는 AsyncOperation을 반환하며 비동기 작업의 상태를 추적하거나 제어할 수 있다. 디폴트로는 LoadSceneMode.Single이 설정되며 자세한 조건은 공식 문서에서 확인할 수 있다.
(https://docs.unity3d.com/2022.3/Documentation/ScriptReference/SceneManagement.SceneManager.LoadSceneAsync.html)
AysncOperation은 비동기 작업을 관리하는 클래스다.
해당 클래스에는 다음과 같은 주요 기능들이 존재한다.
1. allowSceneActivation
- 씬이 로드 완료된 후 바로 활성화할지 결정하는 bool 값.
- false로 설정하면 로딩 진행률(progress)이 0.9에서 멈추며 씬 활성화를 기다린다.
활성화하려면 다시 true로 설정해야 한다.2. isDone (Read Only)
- 비동기 로드가 완료되었는지 여부를 나타낸다.
- progress가 1.0에 도달하면 isDone이 true가 되며 이를 통해 비동기 Scene을 활성화한다.
3. priority
- 비동기 작업의 우선순위를 결정하는 int 값.
- 더 높은 값을 우선 처리하며 백그라운드 스레드에서 이미 시작된 작업에는 적용되지 않는다.
4. progress (Read Only)
- 현재 비동기 작업의 진행률을 나타내는 float 값.
- 0.0 ~ 1.0 사이의 값을 가지며, allowSceneActivation이 false일 경우 0.9에서 멈춘다.
LoadSceneMode는 씬 로드 방식을 정의한다.
1. Single
- 현재 로드된 모든 씬을 닫고 불러올 씬만 로드한다.
- 이전 씬의 데이터가 필요 없는 경우 적합
2. Additive
- 기존 씬 위에 새 씬을 추가로 로드한다.
- 이전 씬의 데이터를 유지하면서 새로운 콘텐츠를 불러와야 할 때 사용
씬을 로드 시 맨 처음 실행된 씬의 렌더링 설정이 다음 씬에 영향을 미치는 경우가 발생한다.
이는 색이 왜곡되거나 빌드 후 검은 화면으로 보이는 문제로 나타날 수 있다.

그런데 막상 빌드를해서 보면 색은 조금 이상하지만 위와 다르게 아예 렌더링이 까맣게 된 상태가 아님을 알 수 있다.

조사한 바에 따르면 다른 씬을 로드하게 될 경우 첫 씬의 영향을 받아 렌더링 되는 과정에서 문제가 발생하는듯하다.
확실하게 말할 수는 없으나 근래 오랫동안 조사하고 공부하면서 어느 정도 찾은 해결법들이다.
1. 현재 씬이 Unload될때 DynamicGI.UpdateEnvironment();를 실행한다.
- DynamicGI.UpdateEnvironment()를 사용한다.
씬이 언로드될 때 DynamicGI.UpdateEnvironment()를 실행하여 환경 큐브맵을 업데이트한다. 그러나 이 방법은 렌더링 문제만 해결하며 첫 번째 씬의 영향을 완전히 제거하지 못했다.2. lightMap을 이용한다.
- Unity에서 Lighting개념을 이용한다.
먼저 Window > Rendering > Ligthing에 들어가 각 씬별로 Lighting Setting Asset을 설정하고 Generate Lighting을 실행한 방법이다.
이 부분은 해결이 1번과 같이 완벽하게 안 됐을 뿐더러 lightMap은 미리 오브젝트가 배치되어 있어야 하는데 만약 씬이 로드되고 나서 동적으로 생성되는 맵같은 경우에는 결국 사용할 수 없어 해결할 수 없었다.3. 최상위 레벨 씬을 배치한 뒤 추가적인 씬을 비동기로 불러온다.
- Default Scene을 설정 후 씬을 Additive 방식으로 불러오기
결국 이 방법을 채택하여 가장 잘 해결하였다. 비동기로 불러온 씬들은 에디터에서 더블클릭했을 때 렌더링 방식이 기존 화면과 다르게 보이는 것을 확인할 수 있었다.
Default Scene Scene1 Scene2 그래서 첫 씬의 영향을 받는다는 점을 알게 되었고 이 점을 이용하여 디폴트 씬을 이용하여 기본 렌더링 환경을 설정하였다.
1. Default Scene을 고정으로 유지하여 기본 렌더링 환경을 설정
2. 필요한 추가 씬들을 Additive 방식으로 비동기 로드
3. 작업이 완료된 씬은 Unload 하여 메모리를 최적화
- 결과
Demo Editor