SceneManager는
UnityEngine.SceneManagement네임스페이스에서 제공하는 클래스이며 씬(Scene)의 로드, 언로드 및 전환을 관리하는 역할을 수행한다.
Unity로 게임을 개발하다보면 씬(Scene)을 한 개가 아닌 여러 개의 씬을 사용하게 되는데
이때 SceneManager를 활용하면 프로그래밍적으로 씬을 제어할 수 있게됩니다.
using UnityEngine.SceneManagement;
// 씬 이름으로 로드
SceneManager.LoadScene("SceneName");
// 씬 인덱스로 로드
SceneManager.LoadScene(1);
// 기존 씬을 언로드하고 새 씬을 로드 (기본값)
SceneManager.LoadScene("GameScene", LoadSceneMode.Single);
// 기존 씬을 유지하면서 새 씬을 추가로 로드
SceneManager.LoadScene("GameScene", LoadSceneMode.Additive);
LoadScene()은 기본적으로 동기적으로 실행되기에 로딩 중에 게임이 중단될 수 있음
이를 방지하기 위해서는 비동기 방식 (LoadSceneAsync)을 사용
// 비동기 로드
SceneManager.LoadSceneAsync("GameScene");
Scene currentScene = SceneManager.GetActiveScene();
Debug.Log("현재 씬 이름: " + currentScene.name);
SceneManager.UnloadSceneAsync("SceneName");
using UnityEngine.SceneManagement;
void Start()
{
SceneManager.sceneLoaded += OnSceneLoaded;
SceneManager.sceneUnloaded += OnSceneUnloaded;
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
Debug.Log("씬이 로드됨: " + scene.name);
}
void OnSceneUnloaded(Scene scene)
{
Debug.Log("씬이 언로드됨: " + scene.name);
}
| 메서드 | 설명 |
|---|---|
SceneManager.LoadScene(string sceneName) | 해당 씬을 로드하고 기존 씬을 제거함 |
SceneManager.LoadScene(string sceneName, LoadSceneMode mode) | 특정 모드(Single 또는 Additive)로 씬을 로드함 |
SceneManager.LoadSceneAsync(string sceneName) | 비동기적으로 씬을 로드 |
SceneManager.UnloadSceneAsync(string sceneName) | 특정 씬을 메모리에서 제거 |
SceneManager.LoadScene(string sceneName) | 현재 활성화된 씬을 가져옴 |
SceneManager.GetActiveScene() | 특정 씬을 활성화된 씬으로 설정 |
SceneManager.sceneLoaded | 씬이 로드될 때 실행되는 이벤트 |
SceneManager.sceneUnloaded | 씬이 언로드될 때 실행되는 이벤트 |



위처럼 3가지의 씬을 가지고 버튼을 누르면 씬을 전환하는 예제를 진행해보자.
public class SceneController : MonoBehaviour
{
public string SceneName;
public void ChangeScene()
{
PlayerPrefs.SetString("changeSceneName", SceneName);
SceneManager.LoadScene("LoadingScene");
}
}
public class SceneLoader : MonoBehaviour
{
public Slider progressBar;
private float _minLoadingTime = 5.0f; // 최소 로딩 시간 (초)
private float _elapsedTime = 0f; // 경과 시간
public void Start()
{
string sceneName = PlayerPrefs.GetString("changeSceneName");
StartCoroutine(LoadSceneAsync(sceneName));
}
private IEnumerator LoadSceneAsync(string sceneName)
{
AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName);
operation.allowSceneActivation = false; // 씬 로드를 완료하지 않도록 설정
while (!operation.isDone)
{
// 경과 시간 업데이트
_elapsedTime += Time.deltaTime;
// 로딩 진행도 업데이트
float progress = Mathf.Clamp01(operation.progress / 0.9f);
progressBar.value = Mathf.Lerp(progressBar.value, progress, Time.deltaTime);
// 최소 로딩 시간이 지나고 씬 로드가 완료되었을 때
if (progress >= 1f && _elapsedTime >= _minLoadingTime)
{
operation.allowSceneActivation = true; // 씬 전환 허용
}
yield return null;
}
}
}

- SceneManager는 Unity에서 씬을 관리하고 전환하는 주요 클래스
- 씬 로드, 언로드, 비동기 로딩, 이벤트 감지 등 다양한 기능을 제공