빠른 흐름
using UnityEngine.SceneManagement;
public void LoadGameScene()
{
SceneManager.LoadScene("Game", LoadSceneMode.Single);
}기본 흐름
Single, Additive, Async의 차이
LoadSceneMode.Single은 현재 장면을 교체하는 가장 일반적인 방식입니다. 메인 메뉴 → 게임, 게임 → 결과 화면처럼 단계가 분리된 구조에서 많이 씁니다. LoadSceneMode.Additive는 기존 장면을 유지한 채 새 장면을 겹쳐 올립니다. HUD를 따로 유지하거나, 월드 chunk를 나눠 로드하거나, bootstrap scene 위에 게임 씬을 얹는 구조에서 유용합니다. 로딩 화면이 필요하면 LoadSceneAsync를 쓰고, 필요할 때는 allowSceneActivation = false로 실제 전환 시점을 제어할 수 있습니다. 단, 이 경우 진행률이 0.9 근처에서 멈춘 것처럼 보일 수 있다는 점을 알아야 합니다.
대표 구조
작은 프로젝트에서는 Single 로드만으로도 충분한 경우가 많습니다. 메뉴 씬, 게임 씬, 결과 씬이 분리되어 있고 전역 상태가 많지 않다면 가장 단순한 구조입니다. 프로젝트가 커지면 bootstrap scene을 두고 공용 매니저와 서비스만 먼저 올린 뒤, 실제 플레이 씬을 Additive로 붙이는 구조가 자주 쓰입니다. 이렇게 하면 전역 오브젝트 중복 문제를 줄이기 쉽습니다. HUD, pause menu, streaming world처럼 생명주기가 다른 레이어는 additively 나누는 편이 읽기 쉽습니다. 큰 월드에서는 지역 단위 장면을 additively 붙였다 떼는 방식이 메모리와 로딩 시간을 함께 관리하는 데 유리하며, 이 경우 UnloadSceneAsync와 데이터 보존 전략이 같이 따라와야 합니다. 씬 전환을 설계할 때는 "무엇을 유지할지"도 같이 정해야 합니다. 전역 매니저는 DontDestroyOnLoad로 유지할 수도 있고, 공유 데이터는 ScriptableObject나 저장 구조로 넘길 수도 있습니다.
구조 선택 기준
결국 좋은 씬 로딩 구조는 API 호출보다 장면 역할 분리가 먼저입니다. bootstrap scene, persistent managers, gameplay scene, UI overlay scene을 어떻게 나눌지부터 결정하면 코드가 훨씬 단순해집니다.
| 상황 | 더 자주 쓰는 구조 |
|---|---|
| 메뉴 → 게임 → 결과처럼 단계 분리형 | Single 중심 |
| 전역 매니저와 서비스가 있음 | bootstrap + gameplay scene |
| HUD나 overlay를 독립 수명주기로 관리 | Additive UI scene |
| 큰 지역을 나눠 스트리밍 | 여러 gameplay scene을 additive로 관리 |
| 로딩 연출이 필요 | LoadSceneAsync + activation 제어 |
체크포인트
| 호출 | 의미 |
|---|---|
LoadScene("Game", Single) | 기존 장면을 내리고 새 장면으로 교체 |
LoadSceneAsync("Game") | 로딩을 분산해 프레임 끊김을 줄이고 진행률을 추적 |
LoadSceneMode.Additive | 기존 장면을 유지하면서 새 장면 추가 |
UnloadSceneAsync | additively 올린 장면을 정리할 때 사용 |
| bootstrap scene | 전역 매니저, 공용 UI, 서비스 초기화를 한곳에 모으는 구조 |
| data handoff | DontDestroyOnLoad, ScriptableObject, 저장값 중 무엇으로 넘길지 선택 필요 |
| 비교 | 더 자주 맞는 쪽 | 이유 |
|---|---|---|
| 화면 전환형 흐름 vs 레이어 유지형 흐름 | Single / Additive | 이전 장면을 버릴지 유지할지 다름 |
| 즉시 전환 vs 로딩 연출 | LoadScene / LoadSceneAsync | 진행률 표시와 activation 제어 필요 여부가 다름 |
| 전역 상태 유지 vs 씬별 초기화 | bootstrap + persistent object / scene-local object | 중복 매니저와 수명주기 충돌을 줄이기 쉬움 |
주의할 점
씬 전환 버그는 API보다 수명주기 설계 실수에서 더 자주 납니다. 매니저 중복 생성을 조심하세요.
// ❌ 중복 방지 없이 DontDestroyOnLoad — 씬 재진입 시 매니저가 쌓임
private void Awake() => DontDestroyOnLoad(gameObject);
// ✅ 싱글턴 패턴으로 중복 방지
private void Awake()
{
if (FindObjectsByType<GameManager>(FindObjectsSortMode.None).Length > 1)
{
Destroy(gameObject);
return;
}
DontDestroyOnLoad(gameObject);
}// ❌ Additive로 HUD를 올렸지만 내리지 않음
SceneManager.LoadScene("HUD", LoadSceneMode.Additive);
// → 씬 재진입 때 HUD가 누적되거나 참조가 꼬일 수 있음
// ✅ 올린 장면은 수명주기를 같이 관리
await SceneManager.UnloadSceneAsync("HUD");참고 링크
4 sources