Unity Term Book
핵심 & 아키텍처

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 유지

실습 단계

1

새 Scene 만들기

메뉴 File → New Scene으로 Scene을 만듭니다.

2

Build Settings에 추가

File → Build Settings → .unity 파일을 목록에 드래그. 인덱스가 LoadScene(index)에 쓰입니다.

3

스크립트에서 Scene 전환

using UnityEngine.SceneManagement;를 추가한 뒤 SceneManager.LoadScene()을 호출합니다.

4

Async로 Loading Screen

Coroutine + LoadSceneAsync()AsyncOperation.progress(0.0 → 0.9)를 읽어 진행 바를 갱신합니다.

인터랙티브 시뮬레이터

Load Scene을 눌러 Loading Screen과 함께 전환을 시뮬레이션하세요. GameManager가 모든 Scene에서 살아남는 모습을 보세요.

Build Settings

🔒 GameManager

DontDestroyOnLoad

Active Scene: MainMenu ·  Build Index: 0

코드 예제

기본
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);