유니티 버전 - 2022.3.59f1
목차
- 코드와 코드의 의도
- AsyncOperation과 allowSceneActivation
- 실제 동작 (문제 상황)
- 해결법
코드와 코드의 의도
플레이어는 현재 씬에서 다른 씬 (A, B, C) 중 하나를 선택하여 이동가능합니다

하지만 개별 씬의 크기가 커짐에 따라 로딩시간이 증가하고, 플레이어 경험을 향상시키기 위하여 개별 씬을 미리 로딩하고 트리거됨과 동시에 해당 씬으로 이동하고자 합니다
public async UniTask PreLoadAddScene(SceneName sceneNumber)
{
if (_preloadSceneDictionary.ContainsKey(sceneNumber))
{
return;
}
AsyncOperation newScene = SceneManager.LoadSceneAsync((int)sceneNumber, LoadSceneMode.Additive);
if (newScene != null)
{
newScene.allowSceneActivation = false;
await UniTask.WaitUntil(() => newScene.progress >= 0.9f);
_preloadSceneDictionary.Add(sceneNumber, newScene);
return;
}
}
AsyncOperation과 allowSceneActivation
AsyncOperation 비동기 작업을 추적하는 객체로, 씬을 비동기적으로 로드할때 진행 상황이나 완료 여부, 씬의 활성화등을 제어할 수 있습니다
allowSceneActivation은 비동기 작업이 완료되었을 때, 자동으로 활성화 되는 것을 제어하는 역할을 합니다
실제 동작 (문제 상황)
코드만 보면 제대로 작동할 것 같지만, 실제로는 Addtive씬의 활성화를 막지 못하였고, 그로인하여 씬에 배치된 오브젝트들의 이벤트 함수들이 실행되며 참조 오류를 일으켰습니다

왜냐하면, allowSceneActivation을 false로 설정하더라도, Unity는 씬의 오브젝트들을 "메모리에 로드하면서" Awake()를 호출 합니다 즉, preload의 목적은 씬의 데이터와 오브젝트를 미리 메모리에 로드해서 나중에 활성화할 때 빠른 전환을 가능하게 하는 것이지, Awake() 호출까지 막는 것은 아닙니다
" allowSceneActivation이 false여도 Awake()는 실행될 수 있습니다" 라는 점에서, 이미 preload의 기능을 못하는것이라고 생각됩니다
OnEnable()과 Start()는 이론적으로 호출되지 않아 Awake()만 비우면 작동한다고는 하지만, 제 경우에는 Start()까지 호출되어 실제 동작이 다름을 확인하였습니다
해결법
만약 씬을 미리 로드하고 트리거를 이용하여 빠르게 전환하고싶으시다면
1. 로드한 씬에 배치된 오브젝트들이 현재 PreLoad 상태임을 확인하고 초기화 로직을 생략 및 씬이 활성화되며 초기화하는 로직 설계
2. 씬이 SetActive되는 것이 아니라 Hierarchy상에서 SceneName(Not Active) 상태가 되도록 하기
3. 모든 오브젝트들이 애초부터 비활성화 되어있고 전환과 동시에 활성화되도록 하기 (가장 유력?)
를 구상하여 해결해봐야할 것 같습니다, 저같은 경우에는 씬이 계속 활성화되어버려서 해당 기능은 폐기 하기로 하였습니다
'코드 및 공부 > 씬' 카테고리의 다른 글
LoadSceneMode.Single과 Additive 의 이벤트함수 실행 순서 (0) | 2025.03.20 |
---|---|
씬 전환시 해당씬의 CinemachineConfiner로 교체하기 (1) | 2024.12.23 |
Instantiate시 오브젝트가 Addtive씬에 생기는 문제 (0) | 2024.12.11 |
씬의 이벤트 실행 순서(Awake, Start 이외) (0) | 2024.11.30 |
씬 관리 (1) (4) | 2024.09.22 |