Scene
Scene은 모든 GameObject·라이트·카메라가 존재하는 공간입니다. 각 .unity 파일이 레벨·메뉴·상태이며 SceneManager·LoadSceneAsync·DontDestroyOnLoad로 전환과 생존을 다룹니다. Build Settings까지 배우는 가이드입니다.
상상해 보세요...
Scene은 드라마의 한 회와 같습니다. 회마다 세트·캐릭터·스토리가 다릅니다. 다음 회로 컷(Scene 로드)하면 이전 세트는 사라집니다. 매 회 살아남는 캐릭터는 DontDestroyOnLoad()——레벨 사이에도 사라지지 않는 주인공처럼요.
개념 자세히
일반적인 게임에는 여러 Scene이 있습니다: MainMenu, Level_01, Level_02, GameOver, Loading… 나누면 필요한 것만 로드해 메모리를 관리하기 쉽습니다.
Scene 전환에는 SceneManager를 씁니다. LoadScene()은 동기
(블로킹——게임이 멈춤)이고, LoadSceneAsync()는 백그라운드 로드로
Loading Screen을 보여줄 수 있습니다.
Additive Loading: 여러 Scene을 동시에 겹쳐 로드합니다. 월드 스트리밍이나 UI Scene과 게임플레이 Scene 분리에 흔합니다.
Scene 로드 후에도 살아남아야 하는 GameObject는 DontDestroyOnLoad(gameObject)를 씁니다.
Scene이 다시 로드될 때 중복이 생기지 않도록 항상 Singleton과 함께 쓰세요.
Scene 흐름
MainMenu
index: 0
Loading
index: 1
Level_01
index: 2
GameOver
index: 3
Single Mode
새 Scene 로드 → 이전 Scene 언로드
Additive Mode
추가 로드 → 이전 Scene 유지
실습 단계
새 Scene 만들기
메뉴 File → New Scene으로 Scene을 만듭니다.
Build Settings에 추가
File → Build Settings → .unity 파일을 목록에 드래그. 인덱스가 LoadScene(index)에 쓰입니다.
스크립트에서 Scene 전환
using UnityEngine.SceneManagement;를 추가한 뒤 SceneManager.LoadScene()을 호출합니다.
Async로 Loading Screen
Coroutine + LoadSceneAsync()로 AsyncOperation.progress(0.0 → 0.9)를 읽어 진행 바를 갱신합니다.
인터랙티브 시뮬레이터
Load Scene을 눌러 Loading Screen과 함께 전환을 시뮬레이션하세요. GameManager가 모든 Scene에서 살아남는 모습을 보세요.
🔒 GameManager
DontDestroyOnLoad
코드 예제
기본using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneBasics : MonoBehaviour
{
void Awake()
{
// Keep this object across every Scene (Singleton GameManager)
DontDestroyOnLoad(gameObject);
}
public void LoadLevel1()
=> SceneManager.LoadScene("Level_01"); // by name
public void RestartCurrentScene()
{
int idx = SceneManager.GetActiveScene().buildIndex;
SceneManager.LoadScene(idx); // by index
}
public void LoadNextScene()
{
int next = SceneManager.GetActiveScene().buildIndex + 1;
SceneManager.LoadScene(next);
}
}코드 예제
고급using System.Collections;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class SceneLoader : MonoBehaviour
{
public static SceneLoader Instance { get; private set; }
[SerializeField] private Slider progressBar;
void Awake()
{
// Singleton: only one instance may exist
if (Instance != null) { Destroy(gameObject); return; }
Instance = this;
DontDestroyOnLoad(gameObject);
}
public void LoadScene(string sceneName)
=> StartCoroutine(LoadAsync(sceneName));
private IEnumerator LoadAsync(string sceneName)
{
AsyncOperation op = SceneManager.LoadSceneAsync(sceneName);
op.allowSceneActivation = false;
while (op.progress < 0.9f)
{
float progress = Mathf.Clamp01(op.progress / 0.9f);
if (progressBar) progressBar.value = progress;
yield return null;
}
if (progressBar) progressBar.value = 1f;
yield return new WaitForSeconds(0.5f);
op.allowSceneActivation = true;
}
}📌 빠른 정리
- ▸Scene은 Build Settings에 있어야 LoadScene이 찾을 수 있음
- ▸
DontDestroyOnLoad로 전환 중에도 객체 유지 - ▸Async + Coroutine으로 Loading Screen 구성
- ▸월드 스트리밍·UI 분리에는
Additive모드
⚠️ 흔한 실수
❌ Build Settings에 Scene을 추가하지 않음
"Scene not found in Build Settings" 오류
✅ File → Build Settings → Add Open Scenes
❌ Singleton 가드 없이 DontDestroyOnLoad
Scene 재로드 시 GameManager가 두 개 생김
✅ if (Instance != null) Destroy(this);